STM32 的标准外设库与 HAL 都基于 CMSIS 头文件,C 语言层面有几个高频坑,记录如下:
1. 头文件里的 __IO 宏展开就是 volatile。自己写寄存器操作时不要把 volatile 丢掉,否则 -O2 下轮询标志位会被优化成死循环。
2. 用结构体指针映射外设寄存器时,务必保证成员对齐与手册一致,不要随手加 packed;对齐方式变了会出现异常访问。
3. 中断优先级分组必须在初始化任何中断之前配置完成,运行中改分组会让已配置的优先级全部错乱。
4. 位带(Bit-Band)在 C 语言里通常写成宏,别名地址要按字对齐计算,算错就会写到相邻寄存器上。
5. 用 weak 属性提供可覆盖的回调是常见做法,可以不改库文件就实现自定义初始化。
以上,供参考。 |