记录一个由于宏定义名称相同导致STM32 ADC不能连续采样的问题

记录一个由于自定义宏与库文件宏名相同导致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来的代码,也没有检查,导致出现奇奇怪怪的问题。

四、收获

  • 这个问题让我一顿好找,得出的经验是:不懂的代码、用不到的代码一定不要瞎抄!!!!!!!!!!!!!!!!!!
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 ADC模数转换实验中,可能会遇到以下问题: 1. ADC采样值不正确 如果ADC采样值不正确,可能是因为ADC参数配置不正确或者采样时序不正确导致的。需要确认以下几点: - 确认ADC参数配置正确,包括采样时间、采样通道、采样分辨率等参数 - 确认ADC时钟已经使能 - 确认ADC采样时序正确,包括采样开始时间、采样保持时间和转换时间等参数 2. ADC采样速率不稳定或者出现噪声 如果ADC采样速率不稳定或者出现噪声,可能是因为ADC参考电压不稳定或者ADC输入信号不稳定导致的。需要确认以下几点: - 确认ADC参考电压稳定,可以使用稳压器等设备来提供稳定的参考电压 - 确认ADC输入信号稳定,可以使用滤波电路等方法来滤除噪声和干扰信号 解决方法: 在使用STM32 ADC模数转换时,可以采用以下步骤进行配置和编程: 1. 配置ADC参数 使用ADC_Init函数对ADC进行配置,设置相应的采样时间、采样通道、采样分辨率等参数。 2. 开启ADC采样 在程序中开启ADC采样,使得程序能够读取ADC转换结果。 3. 编写中断服务函数 根据需要编写中断服务函数,并在函数中进行相应的处理。需要注意的是,中断服务函数应该尽可能的简单,避免长时间占用CPU资源,否则可能会影响其他重要任务的执行。 4. 烧录程序 将程序烧录到STM32芯片中,通过读取ADC转换结果,观察ADC采样值的情况和中断服务函数的执行情况。 需要注意的是,在编写程序时需要遵循一些规范和最佳实践,如使用定义等方法来定义常量和变量,避免使用硬编码方式;使用滤波器等技术来提高ADC采样值的精度和稳定性等。同时,建议使用示波器等工具来观察ADC采样值的情况和中断服务函数的执行情况,以便进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值