文章中操做基于Keil MDK5.2三、STM32F1和标准库V3.5,建议读者阅读前确保本身已经安装好Keil和STM32F1系列的Pack。html
同时,若是但愿照着本文操做的话,请准备好标准库的库文件,可在官网下载,地址:连接,下载须要注册,嫌麻烦也能够找别人分享的资源。git
(这里也给出一份:连接)electron
另外,本教程是为校科协电子部的Birch系列开发板准备的配套文档之一,因此,使用STM32F103C8T6这颗芯片进行演示。函数
在网上搜索STM32新建工程模板的方法的话,大部分教程都比较繁琐,主要缘由在于大部分人只是照抄官方的指南、原子或者野火的教程什么的,甚至不明白本身在搬运一些什么文件,天然不会去想着简化步骤。工具
可是已经0202年了嘛,各类开发工具愈来愈强大,开发者在实现想法时须要面对的困难应该愈来愈少才是(合理使用工具的话)。因此呢,在这里我准备分享一下这段时间总结的一个快速创建工程模板的方法。学习
显然,为了方便,应该在Search后面的框内输入信息以搜索本身须要的型号而不是点加号展开列表慢慢找。开发工具
选中后点击OK确认。测试
(如图勾选而后确认便可,做用是添加内核相关的文件和启动相关的文件)ui
(其实在这个界面下能够直接勾选须要的组件来配置标准外设库,可是因为库文件不会被复制到工程中,有时会出一些问题。而选择Core和Startup时,Keil软件会在工程文件所在文件夹(咱们以前创建的“Project”)下新建一个“RTE”文件夹并复制相关资源到这里,因此工程移动到其余安装合适版本的Keil的PC上以后这部分也能正常编译)spa
嗯,不对劲,得改。
很明显,点击叉叉能够删除当前选中的组。不过,点叉叉左边的符号(而后输入名字)能够新建分组,这一点却是不太明显。
而后就要准备添加文件到相应分组。不过,我们的“模板”里面尚未库文件呢,因此咱们得来添加一下。
添加文件的时候,进入咱们工程模板的Lib文件夹下,打开“STM32F10x_StdPeriph_Driver”这个咱们添加的文件夹,你会看到两个分别叫“src”和“inc”的文件夹,“src”表示“source”,用于存放代码文件,点开会发现一堆“xxx.c”,这些文件须要添加到工程;“inc”表示“include”,即程序应该包含的头文件,打开会发现一堆“xxx.h”,这些文件不须要添加到工程,但须要在软件中添加他们的路径让编译器可以顺利找到这些文件。
在“Target_1”处右键,而后选择“Options for Target···”
在Define后边的文本框中输入一串字符“STM32F10X_MD,USE_STDPERIPH_DRIVER”,以下图:
在Define文本框中输入的内容会被做为全局的宏,不一样的宏之间应该以英文逗号分隔(虽然看起来像句号,但那是个逗号)。
为嘛要用宏呢,咱们知道,C语言里面宏定义重要做用是用来进行添加编译,写一个
#ifdef XXX //若是定义了叫"XXX"的宏 //do something here. #elif defined XXXX //do something here. #endif
这样的结构就能够根据不一样条件编译不一样内容。
咱们这里有两个宏,第一个是XXX_MD是“中容量产品”的意思,咱们使用的芯片STM32F103C8T6的Flash存储器(做为芯片的ROM)容量为64KB(8 -> 64K),属于ST划分的F1系列下的“中容量产品”,若是是STM32F103ZET6这样的“大容量产品”的话(E -> 512K),M就得改为H(High)了。另外一个宏就很好理解了,使用标准库的意思。
到这里,虽然模板还不完善,可是你已经了解过全部的步骤,而且大体知道为何要这么作了,以后的讲解中如遇相似操做,细节再也不赘述。
咱们的用户文件夹“User”如今仍是空空的,以前分组的时候咱们试图用分组让文件的存储更有条理,添加库文件和路径的时候咱们发现库文件分了src和inc两个文件夹分别存储.c和.h文件,仔细一想这样好像挺不错的,因此咱们的User文件夹里的内容也能够如此放置。
(舒适提示:win下新建文件夹的快捷键为Ctrl + Alt + N)
OK,这个教程里面咱们就搬这几回东西。
作完以前的步骤后,咱们创建了一个简单但有序的空白工程,可是还不知道是否能用、好用,并且也缺少一些平时常用到的内容,接下来咱们就对这个工程进行一些测试和完善。
首先,在main.c文件中输入以下代码:
#include "stm32f10x.h" #include "stm32f10x_conf.h" int main() { return 0; }
(这部分代码什么也没有执行)
使用快捷键F7能够进行编译(无效的话按Fn + Esc能够切换热键的状态),或者点击顶部菜单里的"Build"也行,以下图:
编译完成后工做区域的底部应有相似下图的提示:
可能会有一些warning(s),可是没有Error的话就说明以前新建的空白工程基本没问题。
接下来就能够编写程序测试这个工程模板是否真的能用了。
固然咱们会为还在学习怎么创建工程模板的童鞋提供代码的,复制下面内容到main.c就能够了(覆盖原来的)。
#include "stm32f10x.h" #include "stm32f10x_conf.h" void delay_ms_test(uint32_t delay_time); void Board_LED_Init(void); void Board_LED_ON(void); void Board_LED_OFF(void); int main() { Board_LED_Init(); while(1) { Board_LED_ON(); delay_ms_test(200); Board_LED_OFF(); delay_ms_test(200); } return 0;//程序不会运行到这里 } void delay_ms_test(uint32_t delay_time) { for(int i=0;i<delay_time;i++) { for(int j=0;j<11450;j++) { __nop();//do nothing } } } void Board_LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void Board_LED_ON(void) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,0); } void Board_LED_OFF(void) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,1); }
这部分程序实现的功能是让核心板上PC13引脚链接的LED进行闪烁,一般STM32核心板都会有至少一个的板载LED,并且默认烧录一个闪灯的代码来测试,咱们用的“BluePill”也是这样,为了与本来的程序相区别,我把闪烁的频率调快了一些。
F7以后,编译没问题的话就能够准备下载了,工程默认的下载器是ulink,不经常使用。这里咱们使用STlink进行下载。固然,ISP下载也是能够的,不过这里不作讲解。
若是没有意外的话,核心板上的与“PC13”字样相邻的LED将会以必定频率闪烁,咱们的工程模板实现了“能用”的阶段性目标,不过,若是没有顺利实现预期效果也不要放弃,这里提供一份作好的工程模板以供不顺利的童鞋查对,地址:连接
固然了,目前这个工程模板极不完善,缺乏不少经常使用的功能,好比准确的延时函数什么的,要让它变得“好用”,还须要继续完善,不过,那是应该是下一篇文章的内容了。
(PS:如今能够试着基于已有的工程模板让LED发送“SOS”求救信号,并把操做封装成一个函数)