硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2500|回复: 4
收起左侧

[技术讨论] 关于STM32的ADC用DMA传输后数据错位的最终解决方案

[复制链接]

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2023-12-27 23:25:05 | 显示全部楼层 |阅读模式
在用STM32G071CBT6做的ADC三通道连续采集,用DMA循环传输后数据错位,试了网上的方法没成功,自己琢磨并验证了的解决方案如下:
开启ADC和DMA后,打开DMA的传输完成中断,在此中断中1停止ADC转换,2清除DMA传输完成标志位,3关闭DMA传输完成中断,4开始ADC转换。
H~)@GF68GMQ{N}P}P8LQQXA.png


DMA_FLAG没用,只是在仿真中看看有没有进入中断

回复

使用道具 举报

4

主题

180

回帖

192

积分

初级会员

积分
192
发表于 2023-12-29 09:36:10 | 显示全部楼层
H7也会也偶尔出现这个问题,解决办法同样在完成中断里加两句:
__HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
__HAL_DMA_DISABLE(hadc->DMA_Handle);
之后开始调用HAL_ADC_Start_DMA,会自动打开中断
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2023-12-29 12:23:14 | 显示全部楼层
浴火重生 发表于 2023-12-29 09:36
H7也会也偶尔出现这个问题,解决办法同样在完成中断里加两句:
__HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ...

我目前的水平只能玩玩标准库和LL库
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-8-20 14:45:28 | 显示全部楼层
我在完成中断里加停止转换好像也能行。
/**
* @brief       ADC中断服务函数
* @param       无
* @retval      无
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
        HAL_ADC_Stop_DMA(&hadc1);                        /* 停止转换 */
}
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-8-20 15:20:30 | 显示全部楼层
我的没遇到过,写满1M RAM,从来没错位过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:34 , Processed in 0.040357 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表