STM32cubeMx使用DMA处理ADC多通道的时候卡死

文章讲述了在STM32cubeMx中使用DMA处理ADC多通道时遇到的卡死和数据不正确问题,原因在于定义的缓冲区大小过小导致溢出。通过增大缓冲区大小和调整参数,解决了卡死问题,但数据依然不准确,作者正在继续调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32cubeMx使用DMA处理ADC多通道的时候运行一次卡死。而且获取的值也不正确。
这个问题困扰了我好几天,查阅参考各种资料,一直没有解决,偶然间修改了一个值,瞬间我又看到了光!
主要错误代码如下

#define CHANNELS 4
uint16_t ADC_Value[CHANNELS];

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value, CHANNELS);

其中错误原因有以下几点:

  1. 缓冲区太小,因为使用的是4个通道,所以就#define CHANNELS 4,而且设置的通道转换事件又短。
  2. 在开启ADC的DMA的代码中HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value, CHANNELS);,CHANNELS这个位置的参数,要小于DAC_Value数组的个数,有一点原因是ADC_Value数组是16位的,而HAL_ADC_Start_DMA()中的数组是32位的,可能导致缓冲区溢出,得不到正确的数据。
    修改成下面代码就好了
#define CHANNELS 100
uint16_t ADC_Value[CHANNELS];

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value, 40);

获取的数据如下:

[21:42:06.065]收←◆AT+IOTPUB=status,22:28:861:0:3800:0

[21:42:07.285]收←◆AT+IOTPUB=status,22:28:939:0:3836:0

[21:42:08.506]收←◆AT+IOTPUB=status,22:28:897:0:3809:0

[21:42:09.726]收←◆AT+IOTPUB=status,22:28:891:0:3844:0

2024年3月23日23点19分
修改:虽然这样读数不卡死了,但是读出来的数据还是不对!
继续调试中。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值