文章中所涉及的代码源文件,如果在官方提供的固件库无法找到这些文件,可以点击下方链接进行下载:
- 链接:https://pan.baidu.com/s/1sVpx4qF47chmCbjiUON6kQ?pwd=7orp
提取码:7orp
- 如果链接失效,可到个人页面的下载内容里面下载
1、在建立工程前,先在电脑某个目录下新建一个文件夹(存放后面建立的工程,这里命名为Template),然后再文件夹下再建一个文件夹USER(存放代码工程文件)。
2、在Keil的菜单栏,Project→New uVision Project,将工程文件存放在刚才建立的Template文件夹下的USER目录下面,工程文件命名为Template后,点击保存。接下来出现一个选择MCU的界面,就是选择芯片型号,这里选择STM32F103ZE,然后点击OK(一定要安装对应的器件pack,才会显示这些内容,如果没得选择,可以去官网下载对应的pack)。(这里在命名工程名称的时候手误,把Template写成Tempalte,但没关系,能理解就行)
3、该页面为MDK5新增的一个功能,可以选择添加需要的组件,从而方便构建开发环境,这里不添加组件,直接Cancel。
4、完成上述步骤后,Keil的界面如图所示,这里已经建了一个框架,但还没有添加启动代码以及.c文件等。
5、打开Template文件夹下的USER目录,Tempalte.uvprojx是工程文件,非常关键,不能轻易删除。DebugConfig、Listings和Objects文件夹是MDK自动生成的文件夹,DebugConfig文件夹用于存储一些调试配置文件,Listings和Objects文件夹用于存放编译过程产生的中间文件,这里把Listings和Objects文件夹删除,在下一步骤中新建一个OBJ文件夹,用于存放编译中间文件(不删除也没关系,只是不用它而已)。
6、在Template文件夹下,新建3个文件夹,分别是CORE、OBJ和STM32F10x_FWLib,CORE用来存放核心文件和启动文件,OBJ用来存放编译过程产生的文件以及hex文件,STM32F10x_FWLib用来存放ST官方提供的库函数源码文件,已有的USER目录除了用来存放工程文件外,还用来存放主函数文件main.c以及其他包括system_stm32f10x.c等等。
7、将官方固件库包里的源码文件复制到我们创建的STM32F10x_FWLib目录下,src存放的是固件库的.c文件,inc存放的是对应的头文件。
8、将固件库包里面相关的启动文件复制到我们创建的CORE目录下。
9、将固件库包里面的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到我们创建的USER目录下。
10、打开Keil,点击Target 1,鼠标右击,选中Manage Project items,在弹出来的窗口下,在最左侧的Project Targets一栏,将Target 名字修改为 Template,然后在Groups 一栏删掉一个Source Group1,建立三个 Groups,分别是:USER,CORE,FWLIB,然后点击OK,就可以看到更改后的Target名字以及Groups情况。
11、往Group里面添加需要的文件,按照上一步的方法,鼠标右击,选中Manage Project items,在弹出来的窗口下,在Group一栏,选择USER,然后点击右下角的Add Files,定位到刚才建立的目录USER下,选中里面的.c文件,然后点击Add,再点击Close就可以在Files一栏看到包含刚才添加的文件。
12、继续在Group一栏,选择CORE,然后点击右下角的Add Files,定位到刚才建立的目录CORE下,将文件类型里面改为All Files(.),选中里面的.c文件,以及启动文件startup_stm32f10x_hd.s,然后点击Add,再点击Close。(这里如果不将文件类型里面改为All Files(.),则看不到启动文件startup_stm32f10x_hd.s)
13、继续在Group一栏,选择FWLIB,然后点击右下角的Add Files,定位到刚才建立的目录STM32F10x_FWLib下,将src目录下的.c文件全部选中(inc目录下存放的是对应的.h文件),然后点击Add,再点击Close。添加完3个Group里面的文件后,点击OK,即可在MDK的工程目录下看到刚才所添加的文件。
14、点击魔术棒,在“Output”选项下点击“Select folder for objects…”,然后选择上面创建的OBJ目录。(此处如果不设置Output路径,那么默认的编译文件存放路径就是MDK在USER文件夹下自动生成的Objects目录和Listings目录)
15、点击魔术棒,在“C/C++”选项下点击Include Paths右边的“…”,在弹出的path对话框里,将工程所需要用到的.h文件的所在路径包含进去。(由于keil只会在一级目录查找,因此在选择路径时,要选中该头文件所在位置的最后一级目录,即如果目录下面还有子目录,一定要定位到最后一级子目录)
16、点击魔术棒,在“C/C++”选项下,将STM32F10X_HD,USE_STDPERIPH_DRIVER填在Define里面。(如果使用的芯片为中容量,则把STM32F10X_HD 修改为 STM32F10X_MD,小容量修改为 STM32F10X_LD)
17、点击魔术棒,在“Output”选项下,把三个选项打上勾,其中Create HEX file是编译生成hex文件,Browser Information是查看变量和函数定义。
18、打开工程USER目录下的main.c文件,复制下面代码到main.c中覆盖原有代码。
#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化 GPIO
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
Delay(3000000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
Delay(3000000);
}
}
到这里工程模板已经建立完成,但可以继续完善
19、在Template文件夹下,新建SYSTEM目录,SYSTEM存放每个实验都需要用到的共用代码(直接在固件库里面拷贝就可以),接着与上述步骤一样,添加Group,往Group里面添加需要的文件,点击OK;然后点击魔术棒,在C/C++选项下,添加新增.h文件所在的最后一级目录,点击OK。
20、编译一下,可以看到编译结果为 0 error(s), 0 Warning(s).