STM32 HAL库的使用指南
随着时代的逐步发展,联网、USB、文件系统、加密算法、RTOS、GUI等第三方组件变得越来越重要,简陋的标准库已经很难满足当代单片机开发需求了。
事实上,单片机开发在走PC、手机等以CPU为核心的产品的老路:底层和细节越来越成熟,ARM提供CPU的库、单片机厂商提供外设库,单片机软件工程师直接基于这些库来构建自己的应用。现在更倾向于提供一整套开发生态而不只是一个SDK包,于是HAL库应运而生,提供HAL抽象层驱动来加速产品移植和选型,增加客户粘度。
STM32软件开发的各种模式
第1代:寄存器开发
第2代:标准库开发
第3代:HAL/LL库 + STM32CubeMX工具开发HAL(hardware abstract layer)、LL(lowerlevel layer) HAL库的优势是便于在不同型号的STM32芯片之间移植,劣势是代码效率低。标准外设库可以很简单直接跟踪到底层寄存器,而HAL库里面的代码想要跟踪并理解底层很难。 LL库几乎等同于直接操作寄存器 CubeMX工具是ST的一站式开发包,层级高于SDK包,包含了STM32芯片开发的所有官方资源,提供了友好的使用方法;CubeMX是一个windows上的IDE软件;CubeMX是一个工具包加芯片容器,各系列芯片资料以插件补丁形式安装; HAL/LL库和CubeMX本质上是独立的东西,只是使用上纠缠在一起了而已。 CubeMX和Keil MDK是不同作用的东西,要搞清楚。 那到底什么是HAL库呢?
STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境。
HAL库目录结构
STM32Cube_FW_F1_V1.8.4
HAL库的目录内容如下所示:
在第二个Documentation中有个文档,里面有目录结构说明:
相对标准库,重点多了个BSP,这里面放的是板级支持包,针对的是ST官方出的几款特定开发板。
另外,中间件也需要重点关注下。
其他和标准库的很类似,此处不赘述。
HAL工程解读
HAL工程创建后的文件目录如下:
其中.ioc就是mx项目文件。可双击后打开进行修改。用记事本打开,可以看到其内容,比如以下是该文件开头部分的几行:
打开MDK-ARM下的工程文件:
工程目录如下:
看名称就知道是干嘛的,不赘述。
注意:
自动生成的project目录结构和名称等都是既定的,最好不要改;
由CubeMX工程到MDK工程是单向的,不能逆向同步;
STM32CubeMX工具只是生成工程和外设初始化代码,大量开发工作还是靠自己的;
HAL库是一套体系,有自己的架构,必须理解透彻,否则会有无处下手的感觉;
因为HAL库很庞大,整个编译一次很久,所以建议要点build而不是rebuild;
源码简读
自行阅读源码。
做好必要的记录。