初试stm32hal库
本人大学生一枚,参加了RM的比赛,以前在Windows下开发stm32用于比赛,由于换了Linux系统,所以最近一直捣鼓怎么在Linux下开发,最后还是决定使用Linux下通用的方法:gcc+CubeMX+vscode+makefile开发,其中gcc用来编译,CubeMx用来生成工程,vscode用来编写代码。由于CubeMX生成的工程是基于hal库的,所以系统研究了hal的构成以及最新的hal库的变化。(由于刚入门,所以有不对或者不恰当的地方还烦请大佬帮忙)
首先根据官方的说法,hal的移植性很好,所以最先就是了解为什么移植性好,首先就是hal库的整体配置思路,ST官方将与MCU底层有关的代码以及与MCU无关的代码分开实现,实现的方法就是通过MSP回调函数函数,比如在配置串口的时候,前边的基本配置与标准库基本一样,通过一个结构体配置相关的参数,最后在Init函数中通过传入句柄的地址来完成初始化配置,但是在hal库中,为了实现可移植,在Init函数最后,会自动调用一个MSPInit回调函数,这个函数在官方的库中已经有了定义(官方给的这个函数内部是空的),但是这个函数前有_wake修饰,意思是“弱”修饰。只要用户在任意文件中再一次定义这个函数(也就是定义一个同名函数),程序在执行的时候就会执行重新定义以后的函数(有点类似面对对象的语言中的重写)。我们一般将与MCU有关的底层的代码写在MSP函数中,也就是GPIO的配置,这样在进行移植程序的时候只要修改MSP函数中的东西就可以,所