STM32cubeMx使用DMA处理ADC多通道的时候运行一次卡死。而且获取的值也不正确。
这个问题困扰了我好几天,查阅参考各种资料,一直没有解决,偶然间修改了一个值,瞬间我又看到了光!
主要错误代码如下
#define CHANNELS 4
uint16_t ADC_Value[CHANNELS];
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value, CHANNELS);
其中错误原因有以下几点:
- 缓冲区太小,因为使用的是4个通道,所以就
#define CHANNELS 4
,而且设置的通道转换事件又短。 - 在开启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分
修改:虽然这样读数不卡死了,但是读出来的数据还是不对!
继续调试中。。。。。