AiK 发表于 2024-1-23 16:36:42

STM32H723使用ADC、DMA双缓冲工作不正常

本帖最后由 AiK 于 2024-1-23 16:45 编辑

1、问题描述

    使用STM32H723,ADC连续采样单通道电压,使用DMA双缓冲模式,ADC数据只在S13131_DataBuff0有,S13131_DataBuff1没有,TC位是有变化,但是没有往S13131_DataBuff1传数据
2、配置情况
    2.1) ADC配置:
   
    2.2) DMA配置:
   
    2.3) 调用HAL_ADC_Start_DMA_Modify()函数,源于HAL_ADC_Start_DMA()函数,把其中的调用HAL_DMA_Start_IT()函数换成了:
    HAL_DMAEx_MultiBufferStart_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, (uint32_t)pData2, Length);
3、调试寄存器状态
    3.1) ADC寄存器
   
    3.2) DMA1寄存器
   
4、其他:
    看ADC寄存器ADC_CR,其中ADSTART被置零了,其他我没看出啥问题,请大佬们们指导下!

AiK 发表于 2024-1-23 18:02:38

我现在在DMA完成的回调函数中调用如下函数,重新使能ADSTART,现在正常工作了,但是我还是没搞明白没加这个使能之前,是在哪里硬件自动把ADSTART置零了?
回调函数中调用该函数:LL_ADC_REG_StartConversion(hadc->Instance);   // 调试发现DMA一个Buff传输完成后 ADSTART被置零

AiK 发表于 2024-1-23 18:28:51

在DMA传输完成的回调函数中,加入置位ADSTART后,功能实现正常;但是还没想明白硬件是在哪里把ADSTART置零的。

eric2013 发表于 2024-1-24 08:46:24

AiK 发表于 2024-1-23 18:28
在DMA传输完成的回调函数中,加入置位ADSTART后,功能实现正常;但是还没想明白硬件是在哪里把ADSTART置零 ...
可以考虑使用DMA半传输完成回调和传输完成回调来实现双缓冲试试,这个玩法简单易用,启动ADC DMA后,默认就是开启的。

出问题的概率很小。

AiK 发表于 2024-1-24 11:09:25

eric2013 发表于 2024-1-24 08:46
可以考虑使用DMA半传输完成回调和传输完成回调来实现双缓冲试试,这个玩法简单易用,启动ADC DMA后,默认 ...

硬汉哥 今天改成使用DMA半传输完成回调和传输完成回调来实现双缓冲,但是还是得在传输完成里面使能ADSTART才行,不然只能传输一次{:18:}。什么原因会导致ADSTART被置零?现在配置的循环模式,OverRun也配置成覆盖了。

eric2013 发表于 2024-1-24 12:14:42

AiK 发表于 2024-1-24 11:09
硬汉哥 今天改成使用DMA半传输完成回调和传输完成回调来实现双缓冲,但是还是得在传输完成里面使能ADSTAR ...

那你的程序确实有点问题。参考我们V7的吧,那个是正常的,ADC+DMA+TIM的双缓冲案例。

AiK 发表于 2024-1-24 15:12:33

eric2013 发表于 2024-1-24 12:14
那你的程序确实有点问题。参考我们V7的吧,那个是正常的,ADC+DMA+TIM的双缓冲案例。

🆗 我自己找下,另外 定时器3的通道4捕获能触发ADC3转换么?我看ADC的头文件ADC_EXTERNALTRIG_T3_CC4是有的,那应该是可以的吧?

eric2013 发表于 2024-1-25 00:33:41

AiK 发表于 2024-1-24 15:12
🆗 我自己找下,另外 定时器3的通道4捕获能触发ADC3转换么?我看ADC的头文件ADC_EXTERNALTRIG_T3_ ...

对,可以的。
页: [1]
查看完整版本: STM32H723使用ADC、DMA双缓冲工作不正常