调STM32的GPIO_Init,传了个明显错的引脚号,程序没报错也没反应,就是灯不亮。查了半天才发现,库里有个assert_param在拦参数,可默认没开,错参数直接溜进去了。

assert_param是ST标准库里的断言宏,干的就是参数检查。每个外设初始化函数开头都会调它,确认你传的模式、速度、引脚在合法范围。合法就放行,非法就卡住,帮你早暴露问题。

它长什么样:一个宏加一个死循环

定义在stm32f10x_conf.h附近,打开USE_FULL_ASSERT宏它才生效。生效后,参数非法会进assert_failed函数,默认实现是个死循环,串口打印文件名和行号。不开这个宏,assert_param就是空的,检查直接跳过,错参数一路畅通。

所以调试阶段建议打开,错哪行立刻停住。发布前可以关掉,省代码体积和那点判断开销。有些人嫌它占地方,其实就几字节,留着也行。

打开和定位的三步

  • 开宏:在配置文件里定义USE_FULL_ASSERT,再实现assert_failed
  • 加打印:在assert_failed里用串口输出file和line,定位飞快
  • 看调用:报错停住后查调用栈,错参数一目了然
开启宏 define USE_FULL_ASSERT 1 失败函数 void assert_failed(uint8_t* file, uint32_t line) 典型调用 assert_param(IS_GPIO_PIN(GPIO_Pin_0))

IS_GPIO_PIN这类就是合法性判断,返回真假。每个外设都有一套,比如波特率、模式、速度,都有对应的IS开头宏。写代码时可以顺手看看这些宏,比翻手册快。

注意别在中断里依赖它打印,串口打印慢,会拖时间。调试时用它抓错,稳定后关掉或换成错误码返回,更适合量产。

取舍一句话。开发期全开,早死早超生。量产看资源,资源紧就关,资源松就留着当保险。