Keil5建立STM32标准库模板

标准库模板建立

环境声明:
keil版本:keil533
芯片型号:STM32F407ZG
ST标准固件库版本:V1.8

1. 准备工作

为了能够建立模板需要准备以下工作:

  1. 安装MDK keil5 v533(5系版本都差不多,以下简称MDK),保证能够正常使用;

  2. ST官网下载芯片对应固件库,如不会可参照下面图片或者百度;
    在这里插入图片描述

  3. 最后一句废话,你得有一台可以打字的电脑;

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:主要是打字累,看图方便。

  1. 更改工程文件输出到OBJ
    在这里插入图片描述

  2. 添加全局定义标识符
    添加一个全局宏定义标识符。添加方法是点击
    魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:
    STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx
    和 USE_STDPERIPH_DRIVER,他们之间是用逗号隔开的,请大家注意。
    在这里插入图片描述

  3. 添加头文件路径
    保证代码能够对应的头文件位置
    在这里插入图片描述

  4. 更改HSE高速外部时钟频率
    在这里插入图片描述

  5. 更改ARM编译器版本
    在这里插入图片描述
    这里吃了点亏,可能ARM complier6对V1.8的库支持不好,导致编译一直出错,百度才发现是ARM编译器版本的问题。

7. 编译工程

注:编译工程师main.c可以全删写个空的main函数。
中断配置函数要全删除。
因为我们只是建立一个模板,没有功能,可以删除。
在这里插入图片描述
当当当!模板工程创建成功了。

文章第一次编辑日期:2021年3月14日
文章最后一次编辑日期:2021年3月26日

  • 13
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值