【前记】害怕将来自己无法脱离开发板带来的便捷与缺点,于是参考了不少资料,新建了一个不局限于某牌子开发板的工程模板。记录于此。
本文以STM32F10x_V3.5.0固件库为例。
1. 前期准备
(1) 下载固件库
(2) 安装Keil-MDK
固件库可到 ST 社区下载,官网下载入口不好找,下载流程还很繁琐。后台索取方式详见文章:STM32固件库下载-v1
ST 社区网址:stmcu.org.cn(旧)shequ.stmicroelectronics.cn(新)
2. 详细步骤
(1) 新建文件夹
新建一个文件夹Template,三个子文件夹。文件夹名称自己决定,结构如下图
(2) 复制固件库相关文件
① 将 src、inc 文件夹复制到 STM32F10x_FWLIB 文件夹。
② 将 core_cm3.c 和 core_cm3.h 复制到 CORE 文件夹。(在CoreSupport 文件夹)
③ 将相应的启动文件复制到 CORE 文件夹下。(在arm 文件夹)
④ 将tm32f10x.h,system _stm32f10x.c,system _stm32f10x.h,复制到 USER 文件夹下。(STM32F10x文件夹)
⑤ 将 stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h 复制到 USER 文件夹下。(在Project文件夹的Template 文件夹)
(3) 新建工程框架
在 Keil-MDK 新建一个空工程并保存在 USER 文件夹下。如下图
(4) 添加文件到工程
① 右键点击Target1,选择 Manage Project Items 。如下图
② 建分组。在“Project Targets”双击 Target 重命名为Template ,在“Groups”新建三个组:USER,CORE,FWLIB 。如下图
③ 依次点击USER和该界面右下角的Add Files,然后选择stm32f10x_it.c,system_stm32f10x.c ,添加到USER。如下图
④ 同理将core _cm3.c,startup_stm32f10x_hd.s 添加到CORE。如下图
⑤ 同理将 src 文件夹下的所有文件按Ctrl+A选中所有文件添加到FWLib。其实可以自主选择,只要自己轻车熟路,知道所使用的外设需要哪几个文件就行。如下图
(5) 配置工程
① 设置编译后中间文件存放的目录。选择自己建的 OBJ 文件。勾选生成hex文件的选项。如下图
如果不设置Output路径,则默认的编译中间文件存放在MDK自动生成的Objects文件夹和 Listings文件夹。其实不考虑规范性的话这一步可以不要。
② 配置全局宏定义变量。3.5版本的库函数在配置和选择外设的时候要通过宏定义来选择。可根据你选择的芯片或启动文件修改,STM32F10X_MD(大容量),STM32F10X_MD(中容量),STM32F10X_LD(小容量)。
STM32F10X_HD,USE_STDPERIPH_DRIVER中的逗号是英文逗号。
③ 点击右边小按钮添加工程引用到的所有头文件的路径。每个头文件所在的文件夹为一条路径,我这里添加了三条路径。添加完毕点击 OK。如下图
3. 模板检验
新建并保存 main.c 文件到 USER 文件夹下,将其添加到USER组中,输入下面代码到 main.c ,然后进行编译。显示零错误零警告并在 OBJ 文件夹里生成 hex 文件则说明工程模板无误。
记得在代码的最后一行再加上一个回车,否则会编译不成功。
1 #include "stm32f10x.h" 2 void Delay(u32 count) 3 { 4 u32 i=0; 5 for(;i<count;i++); 6 } 7 int main(void) 8 { 9 GPIO_InitTypeDef GPIO_InitStructure; 10 //使能PB,PE端口时钟 11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE); 12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LEDO --> PB.5端口配置 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 14 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz 15 GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB.5 16 GPIO_SetBits(GPIOB,GPIO_Pin_5);//PB.5输出高 17 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED1 --> PE.5推挽输出 18 GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIO 19 GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE.5输出高 20 while(1) 21 { 22 GPIO_ResetBits(GPIOB,GPIO_Pin_5); 23 GPIO_SetBits(GPIOE,GPIO_Pin_5); 24 Delay(3000000); 25 GPIO_SetBits(GPIOB,GPIO_Pin_5); 26 GPIO_ResetBits(GPIOE,GPIO_Pin_5); 27 Delay(3000000); 28 } 29 }
大本营在这: