本篇,完整地示范一次流程:CubeMX新建工程、Keil 配置仿真器、编写代码、编译、烧录!
目录
一、CubeMX 新建、配置工程
双击打开 CubeMX,新建一个STM32工程。
步骤 9-1:以芯片型号 新建工程
步骤 9-2:搜索芯片型号
- 输入芯片型号; (输入框变成粉色时,可能是输入的型号前面有一个空格,删除它即可)
- 在搜索结果列表里,双击具体的芯片型号,进入配置。
步骤 9-3:配置 Debug 模式
- 最容易错漏的 4 项中,这步是其1; (刚上手CubeMX最容易忘记此配置)
- 配置工程时,务必优先设置Debug模式! 即调试模式。
- 默认是关闭!设置为:Serial Wire!通用STLink、JLink、DAP等仿真器。
- 假如忘了设置此项,将导致:烧录程序后,第二次无法再烧录,俗称锁芯片;
- 解锁芯片的操作:选择Serial Wire, 重新生成,编译; 断电,BOOT0用杜邦线接3.3V,上电,烧录,拔杜邦线。
步骤 9-4:设置晶振源
- 最容易错漏的 4 项中,这步是其2;
- HSE:外部高速晶振,必须使能!(倘若没使能,配置时钟树时就无法选择HSE作为时钟源)
- LSE :外部低速晶振,用于RTC。不用管它,默认即可,用到时再添加。
步骤 9-5:配置时钟树
- 最容易错漏的 4 项中,这步是其3; (容易填错晶振值)
- 图中 1、3 两项,必须填写真实晶振值。建议细查板子晶振上的丝印字, 也可以查看原理图。
- CubeMX在配置F407芯片时,晶振值默认是25!市面上的F407开发板,多用25M晶振,但也使用 8M晶振的,一定要注意区分。如果搞错了,程序可能无法运行、通信错乱等等。
- USB分频这项,如果是灰色不可选状态,不管它。当使用USB、SDIO功能时,它才生效。
晶振值 | 输入分频 | 输出倍频 | 输出分频 | USB分频 | APB1分频 | APB2分频 | 系统时钟 |
---|---|---|---|---|---|---|---|
25 或 8 | 25 或 8 | 336 | 2 | 7 | 4 | 2 | 168MHz |
步骤 9-6:工程管理
进入工程管理页面,这一页要设置3个地方:工程名称、存放目录、开发环境。
- 最容易错漏的 4 项中,这步是其4!
- 易错点:工程存放位置、工程名称,全英文,不能中文! 否则,生成时会缺少文件。
- 易错点:开发环境,默认是EWARM!如果用Keil开发,必须改为: MDK-ARM。
- Stack Size, 栈空间大小,建议改 0x1000。Heap Size, 默认,除非你需要使用malloc函数 。
堆大小 Heap Size
默认即可,极少用到。当程序中需要用到malloc分配内存,如链表等,就要增大此值。
栈大小 - Stack Size
重要!重要!重要!
为方便以后在函数中定义:大体积结构体变量、大数组变量等,或者把它们作为函数变量、函数传参,又或者,要移植FreeRTOS、LVGL等功能,在配置工程时,建议先把Stack设置大一点,有备无患。建议 >=0x1000, 或者0x2000。
在单片机开发中,栈空间大小是一个非常重要的概念,且又经常被忽视。与Java、Python等高级语言不同,单片机的内存资源非常有限,通常只有几十K到几百K。因此,开发者需要特别留意局部数组、变量等占用栈空间的大小,避免栈溢出,导致程序跑飞、卡死。
编译器是无法预判局部变量占用大小的,如果程序运行中栈溢出,将较难排查。
步骤 9-7:代码文件配置
- 标记2处:打勾!只复制需要的库文件!
- 标记3处:打勾!为外设功能生成独立的 c、h 文件:倘若不打勾,外设的代码会堆在main.c中。
至此,工程所需,配置完毕。
步骤 9-8:配置 LED 引脚
不管是哪个板商的开发板,板子上都会有用户可控的LED,区别只是所用引脚编号不同,高低电平驱动不同。
在日常调试中,LED的一个大杀器般的调试手段!!
- 点亮LED,能判断:程序是否已运行;
- 规律地闪烁LED,能判断:系统时钟配置是否正常、程序是否卡死;
通过查询原理图,开发板上蓝色 LED 使用的是PB2引脚:给PB2置低电平,即可通路点亮LED.
- 点击芯片图框中的 PB2 引脚,选择: GPIO_Output,即输出模式;
引脚工作模式在设置为 GPIO_Output 后,参数将默认:推挽输出、初始化后输出低电平。
它的默认参数,已能令原理图中所示的LED电路导通(点亮),因此,这里不作修改。
如需进行修改,双击引脚列表中的 PB2 ,可打开其详细参数列表(如下图)。
步骤 9-9:生成工程
点击软件右上角的“CENERATE CODE”按钮,即可开始按配置生成工程。
稍等片刻,待生成完成后,将弹窗:
- 可以选择 Open Folder 打开工程目录 ; 也可以选择 Close, 然后手动打开工程目录。
操作技巧:
- 工程在第一次生成时,配置里必须是英文路径、名称 。否则,这个弹窗会有乱码,或,工程中会缺失启动文件。
- 当工程生成后,可以把工程文件夹,修改成中文名称。也可以,把工程文件夹复制到中文的目录中存放,方便管理。
- 但是,生成后不能修改:工程内的子文件夹名称、文件名称!否则工程无法正常打开。
二、工程文件解释
1、工程根目录
打开工程目录后,不管哪种STM32芯片, CubeMX生成后的工程文件、结构基本相同(如下图)。
当需要对工程进行修改配置、增减功能时,双击图中蓝色 ioc 文件,可再次进入CubeMX配置。
建议:在这个根目录中,手动新建一个“BSP”文件夹(自由命名),存放自己以后编写的代码文件。
Core | 用户平时要编写的文件,都在这文件夹里,如main.c |
Drives | 芯片内核支持文件、 HAL库文件。都不用修改的 |
MDK-ARM | 重要:工程入口文件、仿真调试记录文件 |
工程名称.ioc | CubeMX的配置文件,双击它,就可以再次对工程进行配置 |
2、重要的子文件夹 MDK-ARM
双击打开 “MDK-ARM"文件夹(如下图),里面有一个绿色图标的 uvprojx 文件。
它是 keil 的工程文件!
平时就是双击打开它,在 keil 里进行代码的编辑。
CubeMX 与 Keil 的区别
CubeMX:能直观、快速地配置一个新工程,并且为芯片功能生成初始化代码。但不包括业务代码。如:CAN通信,CubeMX能生成引脚初始化、CAN初始化代码,但不能生成筛选器代码。
Keil:当CubeMX生成工程后,用Keil打开工程,编写具体的业务代码。
其实,用keil也能手动新建、配置工程,编写初始化、底层代码,但比较麻烦,易出错漏。
而通过CubeMX实现,更直观、更省事。
CubeMX更大的意义在于,当我们熟悉了一个型号芯片的操作后,就能方便在其它型号的STM32芯片间游走,因为不同型号的芯片,配置操作是大致相同的、生成的代码文件结构是相同的、函数名称也是相同的;不同芯片间配置时的主要差异 :时钟树。
三、Keil 设置仿真器
各家板商的STM32开发板,都会引出SWD接口,可连接STLink、JLink、CMSIS-DAP等仿真器。
魔女科技的开发板,除了引出SWD接口用于外接仿真器,开发板上还直接集成了仿真器 CMSIS DAP !
下文,以板载仿真器CMSIS-DAP的配置为例,进行配置操作示范。
如果需要外接STLink、JLink, 可参考:仿真器 ST-Link、J-Link 的连接、参数设置
- 当使用 Keil 进行工程开发,建议使用板载的CMSIS-DAP仿真器,更方便,无需再外接其它仿真器。
- 当使用 CubeIDE 进行开发,得经SWD外接STLink、JLink,因为CubeIDE尚未支持CMSIS DAP。
1、板载仿真器 CMSIS DAP的 接线方式
如上图,USB线直接插入CMSIS DAP接口中,即可。
USB线材要求:尽量使用开发板配送的 Type-C 线,它的内部是四芯线:两根供电、两根通信。也可以使用手机的Type-C数据线。一些小电器用的充电线,多为两芯线,只能充电,不能用作数据通信。
指示灯状态:插入USB线连接到电脑后,白色LED灯自动慢闪,表示与电脑连接成功。
白灯慢闪 | 连接电脑成功; |
白灯常亮 | 连接电脑失败; 尝试更换USB线; 尝试插到电脑另外的USB口; |
白灯不亮 | 供电有问题:短路、烧了芯片; 尝试把板上所有杜邦线拔光重新插上; |
如果电脑提示不能识别设备:
CMSIS DAP是免驱动的,即插即用。Win7、10、11, 都不用安装驱动。
当提示无法识别设备时,那是win7系统无法识别这个接口的另一个功能:板载的USB转TTL 。安装网盘中的USB转TTL驱动即可。
板载的 CMSIS DAP 与 USB转TTL(UART1),这两个功能是相互独立的,使用上不会发生冲突。
2、CMSIS DAP 参数设置
每个工程只需配置一次仿真器。CubeMX重新生成后,不用再次设置,除非改用其它的仿真器。
双击 工程目录 / MDK-ARM 下的那个 uvprojx 文件(绿色图标),即可打开 keil 工程。
仿真器 CMSIS -DAP 的具体配置如下图。主要是以下 3项,其它参数默认:
- 选择 CMSIS DAP ;(必须的。)
- 选择 under Reset ;(非必须的。当误锁芯片无法烧录时,选择此项再烧录,可解锁芯片。)
- 打勾 自动复位 ;(烧录后,自动复位、运行新程序。)
四、Keil编写代码
本节,示范如何在keil里编写代码。
1、打开代码文件
双击左侧文件管理器中的 Core 文件夹,其下,有最常用的main.c、it.c等文件。
双击main.c,即可在代码编辑区中打开进行编辑。
2、编写代码
在main.c中,添加用户代码,规律地反转PB2引脚电平,让LED闪烁!
- 重点:用户代码,必须写在CubeMX生成的配对注释行之间,否则 ,重新生成时会被删除。
- main.c文件中,向下滑动,找到main函数
- 在while循环体内/* USER CODE BEGIN 3 */的下方,编写以下代码
HAL_Delay(500); // 延时500ms
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2); // 反转PB2的引脚电平
完成后,代码位置如下图:
五、编译、烧录代码
1、编译代码
点击工具栏的 “编译” 按钮,可对工程代码文件进行编译。
工程的第一次编译,时间会有点长,大约几十秒。
编译完成后,信息栏会显示:Error的数量、Flash占用(代码体积)、RAM占用(内存)、编译时长等。
如下图,这里 Error 的数量是 0 。
重点注意:只有在编译后显示 0 Error 时, 才能自动生成axf格式的可烧录文件。
如果,在CubeMX配置时使用了中文路径、名称,或者代码有语法错误,信息栏这里就会提示错误的总数量,向上滚动,可以查看到各个错误的位置、原因描述,双击错误描述即可跳转到错误的位置,按提示一点点修改即可。
排错技巧:当发生错误时,复制错误描述的关键字,粘贴到csdn.net中,可搜索到具体的解决方法。
2、烧录代码
点击“烧录” 按钮,即可把编译后的axf文件,烧录到芯片中。
烧录开始后,信息栏可以看到烧录的状态,如擦除进度、烧录进度等等......
烧录完成后,信息栏显示如下:
烧录完成后,如果刚才在仿真器设置中,打勾了自动复位,程序就会立即运行!
这时,我们可以看到开发板上的蓝色LED,每秒闪烁1次!这表示程序已正常运行了!
至此,工程已新建、配置完成。
以后,可以在这个工程里添加其它功能代码。
也可以复制这个工程文件夹,把它作为其它工程的模板使用,以减少新建工程的时间开支。
如有错漏 ,欢迎指正,及时更新~~!