没踩过的STM32 HAL库的那些坑

一.前言

STM32 hal库很好用,但是也有一些坑,这里把网上网友遇到的各种坑预先记录一下,方便自己和各位小伙伴避避坑。

二.那些没踩过的坑

1.无法使用CMSIS-DAP下载器或者JTAG下载器给单片机烧录程序

产生这个原因是因为STM32 cubeMX生成的工程里默认没有配置DAT下载器或者JTAG下载器所使用到的SWDIO引脚和SWCLK引脚,因此造成无法下载程序,解决办法也很简单,在使用cubeMX生成工程之前,设置如下选项即可,把Debug模式从disable改成
Serial Wire。这样cubeMX生成的代码就会自动设置下载器用到的两个引脚了。
没踩过的STM32 HAL库的那些坑_第1张图片

改成Serial Wire模式之后,便可以看到下载用到的两个引脚已经被设置了,如下图所示:
没踩过的STM32 HAL库的那些坑_第2张图片
其实这个坑也有一个更加直接的解决办法,就是直接用官方的ST-LINK来给单片机下载程序,那么就不会存在这个问题。

2.使用硬件I2C会有bug

产生这个的原因是因为cubeMX生成的代码中,会把打开I2C时钟的代码_HAL_I2C_RCC_CLK_ENABLE()放到GPIO初始化代码HAL_GPIO_Init()代码之后,这样是不可以的。必须把_HAL_I2C_RCC_CLK_ENABLE()放到HAL_GPIO_Init()前面,如下图。
没踩过的STM32 HAL库的那些坑_第3张图片
注: 坑1和坑2是博主mculover666发现的。我这里作了引用和总结。这里附上原文。

3.标准库和hal库关于SUCCESS和ERROR的定义不一样

无论是标准库还是hal库,在stm32fxxx.h文件中(比如stm32f1xx.h或者是stm32f4xx.h)都会定义SUCCESS和ERROR这两个宏,但是:
在标准库中,SUCCESS=1,ERROR=0
在hal库中, SUCCESS = 0,ERROR = 1
在将程序从标准库迁移到hal库的时候尤其要注意这个。

注:本坑出处。

4. HAL_Delay()函数锁死

HAL_Delay函数用的是中断延时,当程序中存在多个中断时,容易锁死,需要慎用。
如果在中断服务程序里面调用延迟函数 HAL_Delay 要特别注意,因为这个函数的时间基准是基于滴答定时器或者其他通用定时器实现,实现方式是滴答定时器或者其他通用定时器里面做了个变量计数。如此一来,结果是显而易见的,如果其他中断服务程序调用了此函数,且中断优先级高于滴答定时器,会导致滴答定时器中断服务程序一直得不到执行(即变量计数值无法递减0,导致HAL_Delay函数无法执行完),从而卡死在里面。所以滴答定时器的中断优先级一定要比它们高。
一句话总结就是,调用HAL_Delay函数的中断服务函数的中断优先级必须低于滴答定时器的优先级或者低于HAL_Delay函数使用的定时器的优先级。

5. 移植问题

虽然hal库号称容易移植,但是不同系列芯片之间存在寄存器命名不统一、函数接口不统一等问题。可能会导致更新固件编译不通过,芯片间移植不顺畅等问题。

6. 串口自动关中断

hal库的串口用起来有时候会出问题。hal库据说在接收一个数据之后,便会自动把中断关掉,需要自己重新打开中断才可以。还有串口容易锁死。不知道串口的这些问题怎样才能避免,有小伙伴知道的欢迎在评论区指出或者放出文章链接,非常感谢!

三.使用注意事项

1.例程少,有的例程的编写风格和cubeMX软件生成的风格差异太大。
2.确保常用大部分功能都用Hal实现,尽量不要自己单独写寄存器,如果完全采用Hal编程一般没什么问题。如果混用就有可能出问题。

你可能感兴趣的:(stm32单片机开发)