翻 STM32 标准库的源码,函数开头总有一串 assert_param 调用,自己照抄一份新建工程却编译不过,说找不到这个宏。别急着删,它是库里的参数断言机制,只是开关没打开。
它在断言什么
assert_param 定义在 stm32fxxx_conf.h 里,用法就是 assert_param(表达式),表达式为假时调用 assert_failed,把文件名和行号打出来。库函数靠它校验你传进去的枚举值是否合法,比如串口波特率、GPIO 引脚号是不是库支持的取值。
为什么会编译报错
- 没开调试开关:USE_FULL_ASSERT 未定义时宏体是空的,一切正常;一旦定义了开关却删掉了 assert_failed 的实现,链接阶段就找不到函数。
- 头文件没包含:源文件没引入对应系列的 conf 头,assert_param 就成了未声明的标识符。
- 库版本对不上:新版 HAL 库改用参数检查宏,老文章里的写法自然对不上。
自己实现 assert_failed
void assert_failed(uint8_t *file, uint32_t line) { 打印文件名与行号; while (1) { } }实现成打印加死循环就够用,调试时能立刻定位是哪次调用传了非法值。参数类型照着头文件里的声明写,别自己改成 char,不然又是一个编译错误。库头文件里一般给了原型,照着抄即可。
开发开、量产关
调试阶段建议打开 USE_FULL_ASSERT,参数写错能第一时间暴露,比程序跑飞了再回头查快得多。量产固件把开关关掉,省下每次判断的开销。关掉后 IDE 里那行调用会显示为灰色,这是正常的,不是宏失效。
- 判断提醒:只在调试期开断言;如果关掉后功能出问题,别怀疑断言没生效,去查传进去的参数本身是不是写错了。