本帖最后由 张一工 于 2020-7-29 23:02 编辑

【APM32F103VB 开发板】应用STM32CubeMX和HAL库进行开发

1 应用STM32CubeMX构建程序框架
“STM32CubeMX”是意法半导体公司(ST Microelectronics)推出的一款功能强大的程序开发工具包 “STM32Cube”中的图形化程序框架生成工具。应用这一工具,开发者可以通过图形化向导,快速简便地配置MCU引脚,配置时钟树,设置选定的外围设备和中间件的工作模式,等等。在配置过程中,STM32CubeMX会检测管脚冲突和非法配置,一旦发生这种情况,会以明显的标志提示开发者。配置完成后,STM32CubeMX可以生成完整的项目(Project)文件,包括用户程序框架(其中包括根据开发者所做的配置生成的初始化C代码)以及所需的库。根据开发者指定的针对某一开发环境生成的Project可以直接在开发环境(如Keil)中打开,开发者可以在软件框架的基础上加入自己的代码,实现所需的功能。
由于APM32系列MCU与STM32系列MCU的高度兼容性,我想试试应用STM32CubeMX来辅助开发程序的过程。做一个简单的项目:APM32F103VB mini开发板上的LED闪亮,并通过板上的按键改变LED闪亮的模式。
运行STM32CubeMX,在出现的界面中选择“ACCESS TO MCU SELECTOR”去选择目标板MCU。
1.png
然后:
2.png
然后:
3_1.png
然后出现管脚配置界面:
4.png
根据APM32F103VB mini开发板的硬件接线,将GPIO中的PE5、PE6配置为输出,PA0、PA1配置为输入并上拉(Pull-up):
5.png
特别注意对Debug的配置,否则有可能程序下载一次后,芯片就被锁死,无法再下程序调试了。如果发生这种情况,网上有很多救治方案,应该都有效,但我懒得去故意锁死然后再去救活了。
6.png
然后在“Project Manager”标签下做一些设置(如设定采用Keil(MDK-ARM)开发环境),再点击“GENERATECODE”生成程序框架代码。
7_1.png
代码生成后会弹出对话框,可选择“Open Project”直接进入开发环境。
8.png
进入Keil后,打开“main.c”程序,可看到代码框架:
9.png
其中最重要的内容是MCU的初始化。在程序框架的基础上,开发者可以将自己写的代码插入其中,完成所需的功能。开发者插入的程序一定要放在被“USER CODE BEGIN"和“USER CODE END”注释包裹的段落,这样,以后用STM32CubeMX对原有设置做修改再重新生成代码框架时,用户插入的代码会被保留。如果用户将代码插在其他位置,重新生成代码框架时用户插入代码会全部丢失。
2 调用HAL函数
STM32CubeMX生成的程序框架默认是基于HAL(Hardwire Abstraction Layer:硬件抽象层)驱动程序库的,所生成的代码具有更好的可移植性,但凡事都有两面,这是以牺牲代码的运行效率为代价的。STM32CubeMX还可以生成基于LL(Low-Layer:低层)驱动程序库的代码,或者HAL与LL的混合代码,基于LL库的代码更加贴近硬件,运行效率高,但对开发者的要求较高,且针对特定芯片,可移植性不如HAL代码。
基于HAL库生成的代码框架包括了一些基本函数,包含这些函数的.c文件的命名格式为:“stm32f1xx_hal_ppp.c”,其中ppp为某一特定的片上外设,如“stm32f1xx_hal_gpio.c”,就是包括一些针对GPIO的函数的.c文件。在.c文件中,函数的形式为HAL_ppp_xxx,其中ppp为片上外设名称,xxx为某一具体的操作:
10.png
通过调用这些函数,可完成对STM32CubeMX中配置的外设的一些基本操作,大大减少了编程的工作量,并且减少了出错的可能。
通过调用HAL函数,仅需要再添加少量语句就可以实现前面设想的简单任务。
我插入的部分代码:
11.png
3 几点体会
STM32CubeMX确实是开发者的得力助手,借助于它,不仅初学者可以快速上手,而且省去了很多重复、繁琐工作,可以有效地避免错误,极大地提高了开发效率。
基于HAL库生成的代码框架易于使用,其中提供的基本函数为开发者提供了极大的方便。由于基于硬件抽象层,提升了所生成代码的兼容性,但不得不在效率方面作出牺牲。如果对程序的效率有较高的要求,开发者可以选择基于LL库生成代码框架,或采用HAL与LL的混合模式。
工具虽然强大,但掌握工具需要学习。正所谓“磨刀不误砍柴工”,花点儿时间学习工具的使用还是值得的。(最新版本的英文版STM32F1 HAL和LL的驱动程序库用户手册《Description of STM32F1 HAL and low-layer drivers》长达1000多页,初看着实吓人,但其实完全没有必要通读,只需要读明白前面对于HAL库和LL库的基本描述。后面的部分就是针对每个具体函数的描述,用到某个函数的时候去查阅即可。)
通过这个小项目的试验,在我试验所及的范围内验证了APM32F1xx系列的MCU与STM32F1xx系列完全兼容,这使得我们可以充分利用ST公司的资源来开发APM32系列的MCU。