随着时代的逐步发展,联网、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;

    源码简读

    自行阅读源码。

    做好必要的记录。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HAL库的使用指南

    发表评论