【STM32】ADC+DMA方式采样调试笔记

采样的运放电路采用了直流偏置,因此单片机需要在初始化时采集一连串的值取平均以确定直流工作点的采样值大小。
ADC+DMA采样方式的cubeMX设置如下
ADC设置:
ADC设置
DMA设置:
DMA设置

由于已经将ADC采样触发设置为TIM1触发,因此初始化时采样确定offset采用软件触发方式采集更方便。

HAL_ADC_Start(&hadc1);
while(!__HAL_ADC_GET_FLAG(&hadc1,ADC_FLAG_RDY));  //启动就绪标志
HAL_ADC_PollForConversion(&hadc1, 50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
		AD1_val = HAL_ADC_GetValue(&hadc1);   //获取AD值	
HAL_ADC_Stop(&hadc1)

但问题出现了,此时ADC无论怎样都读不到值。经过调试运行发现EOC标志始终为0,因此猜测可能是ADC的DMA配置提前读取并清空了EOC标志,导致EOC标志无法置位。
于是在确定直流偏置点时,采用了手动关闭DMA的方式,通过软件触发完成offset的采样之后,再打开DMA。

__HAL_DMA_DISABLE(&hdma_adc1);		//先关闭DMA,否则会影响阻塞转换EOC标志的读取

/* 此处确定直流偏置offset */

__HAL_DMA_ENABLE(&hdma_adc1);

然后开启DMA传输

while(HAL_ADC_Start_DMA(&hadc1, &AD1_val, 1) != HAL_OK)		//开启ADC DMA传输
{
	HAL_Delay(1);
	cnt++;
	if(cnt > 50)				
	{
		printf("->ADC1 start failed!!!\r\n");			//超时,打印错误信息
		return;
	}
}

这里有一个容易出错的点是,HAL_ADC_Start_DMA(,,)函数的第二个参数是指针类型,需要用&符号传入变量地址,如果是数组类型则直接传入变量名即可。之前把两通道DMA采样的ADC代码直接拿过来用,改成单通道之后忘记修改此处的参数,从而导致ADC的DMA方式一直读不到值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chvngzhvng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值