目录

一、keil安装与芯片支持包下载

(1)官网下载极慢,建议从国内镜像源下载

(2)安装       

(3)下载STM32这个MCU的支持包(DFP包)

二、在STM32CubeMX中下载固件包

(1)首次启动无法关闭与后台更新

(2)库函数的本质是什么?为什么要下载固件包

(3)注册账号并下载固件包

三、STM32CubeMX使用方法:点亮LED灯

(1)拉取最新支持芯片型号失败

(2)操作流程简单了解+开启调试引脚

(3)配置引脚工作模式与默认电平

(4)配置时钟树

(5)设置项目代码存放地址、选择工具链

(6)编译与烧录


        早期很多 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 Requesthttps://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 调试接口,直接操作内核:

  1. 把 CPU 内核 强制停机 (Halt,内核暂停执行),旧代码直接停止运行;
  2. 通过调试总线,把新固件写入 Flash;
  3. Flash 写完之后,内核仍然保持停机状态,不会自动释放、不会自动跳转到 Flash 入口
  4. ✅烧录只是把代码写到 Flash 存储器里面,不会自动给 CPU 发复位信号,CPU 还停在调试停机状态。 Flash 里面已经是新程序了,但是内核处于 halt 暂停,所以啥也不干。
  5. 按下复位按键后,Cortex-M会重新从Flash指定位置读取Startup.s,并跳转到main函数中运行。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐