Keil5建立STM32标准库模板
标准库模板建立
环境声明:
keil版本:keil533
芯片型号:STM32F407ZG
ST标准固件库版本:V1.8
1. 准备工作
为了能够建立模板需要准备以下工作:
-
安装MDK keil5 v533(5系版本都差不多,以下简称MDK),保证能够正常使用;
-
ST官网下载芯片对应固件库,如不会可参照下面图片或者百度;
-
最后一句废话,你得有一台可以打字的电脑;
2. 新建一个工程文件夹
建立一个Template文件夹,里面再建3个以下子文件夹
存放内核相关文件:CORE
存放库相关文件:FWLIB
存放工程生成中间:OBJ
存放工程目录:USER
提醒:可以建立一个readme.txt文本文档记录工程信息
3. 使用MDK新建工程
芯片选用STM32F4078ZG。
路径放在刚才建立的USER文件夹中。工程名字你可以随意定,自己知道可以分清就可以。
具体如何建立工程请百度,此文着重讨论建立固件库模板,不讨论MDK如何建立新工程。
建好的空工程如下所示。
4. 复制固件库源码到工程
(1). 复制固件库中的底层库代码到FWLIB
将 D:\Keil533\ST-SPL\en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver下的inc和src文件夹复制到FWLIB下。
注:ST固件库解压后即可找到相对应文件,上方是我的解压后的文件路径。inc是头文件.h文件夹,src是.c文件夹。
(2). 复制固件库的启动文件到CORE
将D:\Keil533\ST-SPL\en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm中的F4对应的启动文件复制到CORE文件夹下。
接着将D:\Keil533\ST-SPL\en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Include中的F4(M4内核)相关的内核文件也复制到CORE文件夹下
复制后的CORE有如下文件:
(3). 复制固件库工程重要文件复制到USER
将D:\Keil533\ST-SPL\en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include下的头文件添加到USER文件夹中。
将D:\Keil533\ST-SPL\en.stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates下的工程模板中的历程复制过到USER
复制后的USER文件夹如下图所示:
(4). 关于HSI高速外部晶振的设置(系统时钟的配置)
SystemInit() 是整个设置系统时钟的入口函数。
第一步在stm32f4xx.h文件中修改HSE为8000000
根据自己板子上的晶振选择振荡频率单位Hz,我的板子是8MHz,所以填8000000,。可能有的注意到了,我添加的上面有一条注释掉了,那是库默认的25MHz的晶振,如果我们板子和其不一样,要修改成自己板子的晶振频率。
第二步
在system_stm32f4xx.c中修改PLL M为8
其他系数如下所示
#define PLL_M 8(需要修改,F4默认为25)
#define PLL_Q 7
#define PLL_N 336
#define PLL_P 2
PLL=8MHzN/(M*P)=8MHz*336/(82)=168MHz
其他默认设置
先使能外部时钟 HSE,等待 HSE 稳定之后,配置
AHB,APB1,APB2 时钟相关的分频因子,也就是相关外设的时钟。等待这些都配置完成之后,
打开主 PLL 时钟,然后设置主 PLL 作为系统时钟 SYSCLK 时钟源。如果 HSE 不能达到就绪状
态(比如外部晶振不能稳定或者没有外部晶振),那么依然会是 HSI 作为系统时钟。
SYSCLK系统时钟=HCLK AHB总线时钟=PLLCLK PLL主时钟=168MHz
PCLK1 APB1时钟=HCLK/4 = 42MHz
PCLK2 APB2时钟=HCLK/2 = 84MHz
TIMCLK定时器时钟 = 2*PCLKx时钟(if APBx =1*2)
-定时器时钟为什么是这样,具体原因参考手册如下图,这也是定时器时钟的默认配置。
main()函数中为什么没有SystemInit ()函数?
SystemInit 是整个设置系统时钟的入口函数。STM32 标准库的工程却没有这样做, SystemInit 函数去哪了呢?这个函数在 STM32 标准库的“system_stm32f4xx.c”文件中定义了,而我们的工程已经包含该文件。标准库中的 SystemInit 函数把 STM32 芯片的系统时钟设置成了 168MHz,即此时 AHB1 时钟频率为 168MHz, APB2 为 84MHz, APB1 为 42MHz。当 STM32 芯片上电后,执行启动文件中的指令后,会调用该函数,设置系统时钟为以上状态。这个函数对于我们使用 ST提供的 STM32F4 固件库的话,会在系统启动之后先执行 main 函数,然后再接着执行 SystemInit函数实现系统相关时钟的设置。这个过程设置是在启动文件 startup_stm32f40_41xxx.s 中间设置的,
这段代码的作用是在系统复位之后引导进入 main 函数,同时在进入 main 函数之前,首先
要调用 SystemInit 系统初始化函数完成系统时钟等相关配置。
最后总结一下 SystemInit()函数中设置的系统时钟大小:
(5). 中断函数更改
原中断中的表述
改动
删掉 stm32f4xx_it.c 里的 Systick_Handler 函数内容
删掉 stm32f4xx_it.c 里面 main.h头文件 的引入
(6). 其他更改(可选)
删掉 main.c 里面 main.h头文件的引入。
如果不改需要在USER文件夹下加入main.h文件
5. 在MDK空工程中添加文件
按照Template下的目录添加组。
添加后的效果如下图所示。
每个组添加文件基本都在相应的文件夹下,添加的时候只添加.c文件。
FWLIB是固件库的底层库,可以根据需要添加相应模板的库。
6. 工程配置
以下配置都在MDK的魔法棒工具中。按照图片配置即可。PS:主要是打字累,看图方便。
-
更改工程文件输出到OBJ
-
添加全局定义标识符
添加一个全局宏定义标识符。添加方法是点击
魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:
STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx
和 USE_STDPERIPH_DRIVER,他们之间是用逗号隔开的,请大家注意。
-
添加头文件路径
保证代码能够对应的头文件位置
-
更改HSE高速外部时钟频率
-
更改ARM编译器版本
这里吃了点亏,可能ARM complier6对V1.8的库支持不好,导致编译一直出错,百度才发现是ARM编译器版本的问题。
7. 编译工程
注:编译工程师main.c可以全删写个空的main函数。
中断配置函数要全删除。
因为我们只是建立一个模板,没有功能,可以删除。
当当当!模板工程创建成功了。
文章第一次编辑日期:2021年3月14日
文章最后一次编辑日期:2021年3月26日