HAL库——写在学习之前

一:什么是hal库什么用hal库/strong>

hal:Hardware abstraction layer,即硬件抽象层。一开始看到这个解释很懵逼,通俗点说就是ST公司为了方便开发者实现不同硬件平台的程序迁移而推出的一种替代标准库的新一代的开发标准。将硬件抽象化,忽略不同硬件平台的接口细节,将内核和硬件电路完全的独立出来。对于相同内核的平台,在进行程序迁移的时候,只需要改动与硬件相关的程序即可,大大节省了开发的时间。

标准库:第一次接触标准库还是在本科阶段,那时候还在上51的单片机课程,相比于面向寄存器,标准库采用封装好的库函数的编程思路是如此的直观简洁,再也不用记那么多的寄存器和操作指令,那时候很天真的认为这就是最好嵌入式开发方式了,最近这段时间看了hal库惊叹世间竟有比标准库更方便的开发方式,配合ST推出的CubeMX(后面有介绍)开发的效率更高了。

对比:其实hal库和标准库的实现思路都是采用库函数实现,只不过hal库实现了明确的区分,硬件相关的函数你们在一起(基本上需要自己来写),内核相关的函数归为一类(这部分借助CubeMX基本可以直接生成,很赞!),一方面适合移植,一方面大大节省了程序开发的时间,尤其是一些繁琐的初始化工作;标准库可就不会有那么明显的区分,也不能借助CubeMX进行初始化操作,所以一开始的配置过程比较耗费时间(copy再修改还是挺快的,嘿嘿~~)。但是,hal也不是那么完美,目前大家对hal库吐槽比较多的就是程序比较臃肿;另外一个就是我这两天踩的一个坑——hal不同的固件库版本差别还是挺大的(后面会详细说)。

然而,使用hal库的最大理由是终于不需要用各种各样看不懂的工程模板,终于不需要再自己去包含各种头文件(除了后来自己写的),CubeMX自动生成的工程模板是那样的直观简洁,对于刚入手的小白来说,特别友好。

二:一个牛逼哄哄的开发助手——CubeMX

HAL库——写在学习之前

 CubeMX:初始代码生成器(没什么比官方的这个解释更贴切了)。下载用就完了,就那几个控件,半天上手不是事。说几个优点:可视化操作;时钟配置很直观(终于不需要再去配置各种分频器、倍频器了);不要自己去添加内核相关的头文件、驱动文件。缺点嘛,目前走过的一个大坑就是固件库的版本问题(后面再说)。

在这里里面,基本所有用到的系统和外设都能够进行简单的参数配置等一些初始化的操作(不用麻烦的再去找各种宏定义参数)

下载链接:STM32CubeMX

三:一个坑——固件库

CubeMX支持多种系列的单片机,每一系列的单片机固件库版本也经过了多个版本的迭代。在CubeMX的Help—>manage embedded software package中可以选择需要的固件库进行安装,在CubeMX中下载固件库有时候会出现下载不下来的问题,可以到官网下载之后再安装。

下载链接:官网固件库

以F4为例,说一下我遇到的固件库版本问题的坑。

最近我在学习CAN通信相关内容的时候,参考了一份RoboMaster的官方例程(固件库版本比较早),我安装的是最新版本固件库,然后发现这两个版本固件库的驱动函数变化很大,以完成CAN接收中断为例:

较早版本的固件库中,处理逻辑为:中断请求——判断中断类型——进入对应中断(获取数据,释放FIFO,失能中断)——回调函数(数据处理,使能中断)

新版本固件库,处理逻辑为:中断请求——判断中断类型——回调函数

在这个过程中,很多的函数和结构体都有变化,比如CAN发送的函数:HAL_CAN_Transmit(老)——HAL_CAN_AddTxMessage(新),不仅仅是函数的名称变了,函数的参数也是完全不一样。这些变化的原因就是新版本的固件库相比于老版本的处理逻辑改变了,对函数进行了重新的封装。

总结:

很多论坛都有在讨论有没有必要从标准库转到hal库,我认为还是很值得转的,一方面ST官方不在对标准库进行支持,也是在力推hal库;另外就是,借助CubeMX,真的能在很多方面提高开发的效率。

*后续博客软件版本为:keil MDK5+STM32CubeMX5.3.0;固件库版本F4 V1.24.0

来源:jcsm__

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年9月20日
下一篇 2019年9月20日

相关推荐