记录一个由于自定义宏与库文件宏名相同导致STM32 ADC不能连续采样的问题
一、问题背景
- 最近接到需求,要在当前的项目上加一个ADC电压采集的功能。硬件上已经给STM32预留了采样的IO口,只需要软件采集适配就好了。刚拿到需求的时候心想这不十分钟搞定的事情么,说干就干,打开项目代码,配置好ADC,生成代码,运行。咦。。。。。。。。这个值怎么不大对呢?咋一直不变,不连续采样呢?难道是我配置的ADC参数不对吗?网上找找例程,感觉参数也大差不差呀,那是哪里出现问题了呢?
二、定位过程
- 网上一顿搜索,ADC的各种参数都尝试了一遍还是不行。既然这样,估计是我用的STM32型号和大家的不一样,那就换上我的祖传STM32F103C8照着例程试一试,一试发下STM32F103C8跑起来正常。那是啥原因呢?此时想到是不是项目开的外设太多和ADC冲突了,或者哪个地方的时钟配置的不对。于是重新创建了一个只有ADC采样和串口调试功能的Demo,运行OK!!!!!!而且项目最开始的版本上加上ADC采样也没有问题。
- 到这里基本锁定是某个版本加的某个功能导致的问题了,项目已经在git提交了40多个版本。于是利用二分法排查,最终找到了有问题的版本,版本新增了一个RTC时钟的功能,工程里增了一个rtc.h的文件。删掉该文件编译时没问题,一加上该文件就出问题,于是再用二分,法注释掉头文件里的代码。
三、问题原因
- 最终锁定到了一行代码
#define DISABLE 3 //禁止中断
- 一看恍然大悟,这个宏貌似和库里面的宏冲突了吧,一搜工程果然有很多同名的宏定义(PS:项目是用CueMX生成的代码),把该行代码注释掉就好了。
- 而且这种宏同名的问题keil编译时不会报错,所以就很难检查出来。
- 这个宏其实项目并没有用到,估计是之前的同在加rtc功能时直接从网上copy来的代码,也没有检查,导致出现奇奇怪怪的问题。
四、收获
- 这个问题让我一顿好找,得出的经验是:不懂的代码、用不到的代码一定不要瞎抄!!!!!!!!!!!!!!!!!!