keil与STM32CubeMX安装使用流程:DFP包、库函数、固件包的理解
目录
早期很多 STM32 教程(例如江科大)使用标准库开发,但ST 已于 2016 年停止对标准库的维护,仅用于维护老旧项目。Keil 仅仅是编译调试环境,无法自动生成外设初始化代码,所有配置文件、驱动文件都需要手动添加,对新手不友好。
即便 Keil 安装好了对应的芯片支持包(DFP‑Pack),也不会自动生成可用工程。我们需要手动搭建整套工程目录,手动拷贝启动文件、内核文件、外设驱动源码,手动配置头文件搜索路径。大量复制粘贴操作对新手非常不友好,很容易漏文件、路径出错,还没写一行业务代码就被工程配置卡住。这就好比你要造房子,却让你从混凝土制作开始,入门难度实在太高!
ST 推出了 STM32CubeMX 图形化工具,可以可视化配置引脚、系统时钟,一键输出完整工程。它底层基于 HAL 库,HAL 库就是 ST 官方用来替代标准库的固件。
因此现在主流学习方案:STM32CubeMX 生成初始化工程 + Keil 编译调试 + HAL 库。
一、keil安装与芯片支持包下载
(1)官网下载极慢,建议从国内镜像源下载
新版的keil-MDK是不需要破解的,可以直接使用社区版。而早期例如江科大的教程时间比较早,keil的试用版会将代码局限在32kb,必须破解。
你可以直接从官网上下载最近版本5.43a:
MDK-ARM Version 5.43a Evaluation Software Request
https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD
(2)安装
然后把刚刚的两条路径指定即可。(注意整个路径中不允许出现中文,否则后续keil在运行时会出现各种莫名其妙的问题)
等待进度条走完即可。



这个Pack目录就是未来我们放置DFP包的目录。
新版keil会在安装的时候直接将ARM最底层的驱动文件(CMSIS等)等放进去;但早期的keil安装时,只会指定Pack路径,但不会初始化的放置如图所示的文件,而是在第一次通过下一节的Pack installer安装任意DFP包的时候放置进来的。
(3)下载STM32这个MCU的支持包(DFP包)
当你打开后,会自动弹出这个窗口。这个是给我们下载各种MCU的芯片支持包的。这里有个疑问:我们刚刚不是下载了Pack吗?怎么下载还要重新下载呢?
其实在安装keil时候,下载的是ARM公司提供的通用Cortex-M的IP核心的支持包,此时keil只知道有Cortex-M这个内核,而不知道有GPIO、USART等外设控制器的。
而这个CPU是会被ST等公司做外围设计成为MCU的。因此我们还需要额外安装 ST 提供的 DFP芯片支持包(Device Family Pack芯片系列软件包) ,这一个包就包含了 STM32F1 该系列所有型号的芯片信息。
有了这个DPF包之后,Keil 就可以识别芯片型号、获取内存大小、调试寄存器、执行下载烧录。注意 DFP 包只服务于 Keil 软件,不包含写代码使用的 HAL 库或者标准库源码。

我们使用的是STM32F103系列的MCU,如果你后续要用其他MCU,也需要下载对应的DFP包。



这个DFP包说简单点就是给keil打补丁,keil软件本身只是一个集成开发环境,但并不能识别任何MCU芯片。只有你下载DFP包到Pack路径后,keil才允许你创建这个MCU芯片的项目工程,否则你连该型号CPU的选项都找不到!
加深理解:DFP包内包含这个芯片的识别、烧录算法、调试SVD寄存器软件等,只有加入这个补丁后,keil才能正确操作对应的MCU芯片。
二、在STM32CubeMX中下载固件包
到目前为止,我们所做的事情,仅仅是把keil安装好了,让其能正确识别MCU、烧录程序、调试程序了。但此时还没有在工程中加入任何软件层面的东西:标准库或者HAL库。
在标准库学习时,通常需要去ST官方上下载对应系列的SPL标准库,然后人工将内部有用的文件提取出来(如CortexM核心相关、标准库本身、启动文件等等),组成工程模版。而这种方式极为繁琐,所幸STM32CubeMX将它们打包成固件库,并在你创建项目时,自动生成了工程模版,极大程度降低了新手学习的难度。
STM32CubeMX这个软件的下载安装十分简单,所以不再赘述了。
(1)首次启动无法关闭与后台更新
当你第一次使用STM32CubeMX时,点击右上角的叉叉可能会出现以下弹窗,让你无法关闭这个软件。其实从这个报错信息也能看出来:当前软件正在自动检测更新,而这个软件设定上就是处于后台更新时无法关闭。
此时只需要等待几分钟,更新完成后就可以退出了。
(2)库函数的本质是什么?为什么要下载固件包
由于 STM32CubeMX 本体仅仅是图形化配置工具,本身并不包含 HAL 库源码、芯片信息以及 Cortex 内核相关支持文件,这些内容统一存放在独立的 STM32Cube MCU 固件包中,需要我们额外下载导入。(这个操作和我们刚刚keil下载Pack、DFP包是不是很相似?只不过一个是让keil能工作,一个是让写的代码能被MCU运行,对象存在不同而已。)
这里有一点值得注意:
标准库(Standard Peripheral Library,SPL标准外设库)或者HAL库(Hardware Abstraction Library,硬件抽象库,寄存器上封装了一层抽象软件接口,调用方式更加通用)的本质就是在对寄存器进行配置、改写的操作,而不同的MCU内部的寄存器数量、地址等存在大量差异,所以没有任何一款库可以兼容所有的MCU。即ST等公司必须针对不同系列的MCU编写不同的库函数。--->标准库和HAL库都有很多个系列!
其中标准库会一次性下载本系列全部源代码,然后根据芯片子型号通过条件编译,实现区分。但不同系列的标准库之间API接口风格并不统一。
而 HAL 库则是直接将不同系列的 HAL 库、芯片信息、启动文件等打包成不同的.zip 文件。用到什么系列芯片就下载什么系列的固件包即可。尽管分为了多个固件包,但HAL库对外的API在各个系列之间都是统一的。这也是HAL库逐渐替代了标准库,成为主流的原因。
(3)注册账号并下载固件包
首先配置固件库的下载路径,不要使用默认路径,否则后续很有可能找不到了。




然后接着回到STM32CubeMX中,下载固件库。



想要下载这些包,首先需要注册ST的账号。我这里之前就注册好了,可以直接登录。如果你没有的话可以直接去意法半导体官方注册,很方便。

正在下载固件包:


三、STM32CubeMX使用方法:点亮LED灯
当你把上述工具全都做好了后,该如何使用STM32CubeMX创建一个完整的工程项目呢?
(1)拉取最新支持芯片型号失败


这一步报错没有任何关系,因为国内访问外网经常失败,而且我们用的是STM32F103系列,是一个很古老的MCU,并不需要去拉取最新支持的MCU型号列表。直接离线创建工程即可。

(2)操作流程简单了解+开启调试引脚
STM32CubeMX怕我们不会用,很贴心的将操作流程分为了4个模块,且符合人从左往右的习惯。
开启调试器,与调试器的理解。
如果你设置的是NoDebug,则会使得MCU一上电工作到这行代码就关闭调试功能,此时调试器就无法烧录了,只能通过BOOT0模式重新烧录。(详情请见本专栏第一篇文章)
但这样就看不到以前烧录的程序了。所以一般NoDebug模式是厂商为了保护自己源代码而设置的,我们学习过程中一般不会设置。
(3)配置引脚工作模式与默认电平
(4)配置时钟树
关于下面时钟树的配置,我们暂时先照做,后续时钟树章节会详细讲解。
在这里填完后,需要回车,并点击OK保存。
(5)设置项目代码存放地址、选择工具链
生成完毕后:
(6)编译与烧录
编译:
这个错误其实是:你的工程设置使用了 ARM Compiler V5(AC5)编译器,但新版的keil并不会安装AC5编译器,而只安装了AC6编译器。我们在keil中修改一下配置即可。


烧录:
烧录失败有两个原因:
(1)我们板子的仿真器是DAP-Link的,而keil还默认使用的ST-Link,需要修改keil的配置。
(2)板子还未上电,或未正确连接。

现在你就可以烧录了!

最后烧录完成后,它会将原本的程序停止,但需要复位才能运行新程序,这是因为:
ST‑Link/DAP‑Link 通过SWD 调试接口,直接操作内核:
- 把 CPU 内核 强制停机 (Halt,内核暂停执行),旧代码直接停止运行;
- 通过调试总线,把新固件写入 Flash;
- Flash 写完之后,内核仍然保持停机状态,不会自动释放、不会自动跳转到 Flash 入口。
- ✅烧录只是把代码写到 Flash 存储器里面,不会自动给 CPU 发复位信号,CPU 还停在调试停机状态。 Flash 里面已经是新程序了,但是内核处于 halt 暂停,所以啥也不干。
- 按下复位按键后,Cortex-M会重新从Flash指定位置读取Startup.s,并跳转到main函数中运行。
更多推荐





















所有评论(0)