【STM32】基于标准外设库的STM32工程模板 - Keil版
【STM32】基于标准外设库的STM32工程模板 - Keil版
修改日志
| 时间 | 修改内容 |
|---|---|
| 2023-01-16 | 初稿完成 |
| 2023-02-18 | 增加修改日志 |
1. 所需资料
- 开发环境:Keil MDK
- 固件库:STM32F10x_StdPeriph_Lib_V3.5.0
固件库可到 ST 社区下载(stmcu.org.cn 或 http://shequ.stmicroelectronics.cn),不过要下载需注册,有点繁琐。
几天前逛网站发现官方已经将标准外设库更新到了3.6.0版本,之前很多人说停止更新了(毕竟有好多年没更新了)
2. 详细步骤
2.1 新建文件夹
这里以 STM32103RCT6 为例。新建一个文件夹,文件夹名称看个人喜好,结构如下图:

2.2 复制相关库文件
| 库文件夹 | 拷贝的文件 | 粘贴位置 |
|---|---|---|
| CoreSupport | core_cm3.c core_cm3.h | core |
| arm | 启动文件(依据自己单片机型号特点选取) | core |
| inc | inc文件夹 | lib |
| src | src文件夹 | lib |
| STM32F10x | stm32f10x.h system_stm32f10x.c system_stm32f10x.h | user |
| STM32F10x_StdPeriph_Template | stm32f10x_conf.h stm32f10x_it.c stm32f10x_it.h main.c(如果不复制就自己建一个) | user |
stm32f10x_it.c 和 stm32f10x_it.h 是外设中断函数文件,用来编写中断服务函数,用户可以相应地加入自己的中断程序代码。
stm32f10x_conf.h 是配置文件,里面有很多#include。在建立工程时,可以注释掉一些不用的外设头文件。
关于启动文件:
| 启动文件 | 容量大小 | 例如 |
|---|---|---|
| startup_stm32f10x_cl.s | 互联型 | STM32F105xx/107xx |
| startup_stm32f10x_hd.s | 大容量 | STM32F101xx/102xx/103xx |
| startup_stm32f10x_hd_vl.s | 大容量 | STM32F100xx |
| startup_stm32f10x_ld.s | 小容量 | STM32F101xx/102xx/103xx |
| startup_stm32f10x_ld_vl.s | 小容量 | STM32F100xx |
| startup_stm32f10x_md.s | 中容量 | STM32F101xx/102xx/103xx |
| startup_stm32f10x_md_vl.s | 中容量 | STM32F100xx |
| startup_stm32f10x_xl.s | Flash在512K ~ 1024K字节 | STM32F101xx/102xx/103xx |
cl:互联型产品
vl:超值型产品
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH ≤ 32K
md:中等密度产品,64KSFLASH ≤128K
hd:高密度产品,256KSFLASH
2.3 新建空工程框架



2.4 添加文件到工程
① 点击选择 Manage Project Items 。将图中圈住的两个双击重命名,如下图

② 建分组。点击图中位置,在“Groups”追建两个组:core、lib。如下图

③ 为每个组添加库文件。user组、core组、lib组所添加的文件如下图




lib组的文件其实可以自主选择,只要自己轻车熟路,知道所使用的外设需要哪几个文件就行。
④ 最后点击 OK。

2.5 配置工程
① 设置Output路径。选择自己建的 obj文件夹。勾选生成hex文件的选项。如下图
如果不设置Output路径,则默认的编译中间文件存放在MDK自动生成的Objects文件夹和 Listings文件夹。其实不考虑规范性的话这一步可以不要。
② 配置全局宏定义变量。3.5版本的库函数在配置和选择外设的时候要通过宏定义来选择。可根据你选择的芯片或启动文件修改,STM32F10X_MD(大容量),STM32F10X_MD(中容量),STM32F10X_LD(小容量)。如下图
STM32F10X_HD,USE_STDPERIPH_DRIVER 中的逗号是英文逗号。
③ 点击右边小按钮添加工程引用到的所有头文件的路径。每个头文件所在的文件夹为一条路径,我这里添加了三条路径(user文件夹、core文件夹、inc文件夹)。添加完毕点击 OK。如下图

3. 验证模板
打开 user 组里的 main.c,复制下面代码到 main.c ,然后进行编译。显示零错误零警告并在 obj 文件夹里生成 hex 文件则说明工程无误。(记得在代码的最后一行再加上一个回车,否则会有编译警告,网上说是 Keil-MDK的 bug)

#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//使能PB,PE端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LEDO --> 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);
}
}
var code = “66960ecc-6fef-475e-8b9e-309e4d817063”


浙公网安备 33010602011771号