STM32
直播中

邓长生

11年用户 997经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F103 ADC利用DMA进行采样遇到的几个疑问求解

STM32F103配置了ADC1 的4个通道,利用定时器的事件触发进行10Hz 的数据采样,数据通过DMA传输。然后希望每次采样4*50个数据后触发DMA的中断进行数据的处理。
根据教程进行了相关的配置后,遇到了2个问题:
1 定时器配置成10hz,但是每次启动采集后基本马上就能进入DMA的回调函数,里面数据已经刷满了,所以感觉ADC的采样频率似乎不是收定时器触发的。
2DMA的回调函数HAL_ADC_ConvHalfCpltCallback,HAL_ADC_ConvCpltCallback,应该是数据完成一半数量的采集后触发第一个回调,全部采集后再触发第二个回调,但是实际上每次都是在第一个回调中数据就全部刷新了,采样完成的回调中不会有新的数据刷新。


希望有人能帮忙指点下,谢谢



回帖(1)

杨帆

2024-7-2 16:48:32
根据你的描述,我将尝试解决你遇到的两个问题。

问题1:定时器配置成10Hz,但是每次启动采集后基本马上就能进入DMA的回调函数,里面数据已经刷满了,所以感觉ADC的采样频率似乎不是收定时器触发的。

解决步骤:

1. 检查定时器的配置是否正确。确保定时器的时钟源和预分频器设置正确,以便实现10Hz的触发频率。

2. 确保ADC的触发源设置为定时器事件。在HAL_ADC_Init()函数中,设置ADC的触发源为定时器事件,例如:

   ```c
   ADC_HandleTypeDef hadc1;
   hadc1.Instance = ADC1;
   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
   hadc1.Init.ScanConvMode = ENABLE;
   hadc1.Init.ContinuousConvMode = ENABLE;
   hadc1.Init.DiscontinuousConvMode = DISABLE;
   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
   hadc1.Init.NbrOfConversion = 4;
   HAL_ADC_Init(&hadc1);
   ```

3. 检查ADC的采样时间设置。确保采样时间足够长,以便在定时器触发之间有足够的时间进行采样。

问题2:DMA的回调函数HAL_ADC_ConvHalfCpltCallback,HAL_ADC_ConvCpltCallback,应该是数据完成一半数量的采集后触发第一个回调,全部采集后再触发第二个回调,但是实际上每次都是在第一个回调。

解决步骤:

1. 检查DMA的配置。确保DMA的请求数量设置正确,以便在每次采集一半数据时触发HAL_ADC_ConvHalfCpltCallback回调函数,全部采集完成后触发HAL_ADC_ConvCpltCallback回调函数。

2. 在HAL_ADC_ConvHalfCpltCallback回调函数中,添加适当的处理逻辑,以便在数据采集到一半时进行处理。

3. 在HAL_ADC_ConvCpltCallback回调函数中,添加适当的处理逻辑,以便在数据采集完成后进行处理。

4. 如果问题仍然存在,可以尝试使用HAL_ADC_Start_DMA()函数的另一种模式,例如HAL_ADC_Start_DMA(&hadc1, &aADCxConvertedData[0], hadc1.Init.NbrOfConversion * 2); 这样,DMA将在采集完所有数据后触发回调函数。

希望这些建议能帮助你解决问题。如果还有其他问题,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分