硬汉嵌入式论坛

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

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

[复制链接]

3

主题

28

回帖

37

积分

新手上路

积分
37
发表于 2024-1-23 16:36:42 | 显示全部楼层 |阅读模式
本帖最后由 AiK 于 2024-1-23 16:45 编辑

1、问题描述

    使用STM32H723,ADC连续采样单通道电压,使用DMA双缓冲模式,ADC数据只在S13131_DataBuff0有,S13131_DataBuff1没有,TC位是有变化,但是没有往S13131_DataBuff1传数据
2、配置情况
    2.1) ADC配置:
    1.png
    2.2) DMA配置:
    2.png
    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.png
    3.2) DMA1寄存器
    4.png
4、其他:
    看ADC寄存器ADC_CR,其中ADSTART被置零了,其他我没看出啥问题,请大佬们们指导下!
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-1-23 18:02:38 | 显示全部楼层
我现在在DMA完成的回调函数中调用如下函数,重新使能ADSTART,现在正常工作了,但是我还是没搞明白没加这个使能之前,是在哪里硬件自动把ADSTART置零了?
回调函数中调用该函数:LL_ADC_REG_StartConversion(hadc->Instance);   // 调试发现DMA一个Buff传输完成后 ADSTART被置零
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-1-23 18:28:51 | 显示全部楼层
在DMA传输完成的回调函数中,加入置位ADSTART后,功能实现正常;但是还没想明白硬件是在哪里把ADSTART置零的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2024-1-24 08:46:24 | 显示全部楼层
AiK 发表于 2024-1-23 18:28
在DMA传输完成的回调函数中,加入置位ADSTART后,功能实现正常;但是还没想明白硬件是在哪里把ADSTART置零 ...

可以考虑使用DMA半传输完成回调和传输完成回调来实现双缓冲试试,这个玩法简单易用,启动ADC DMA后,默认就是开启的。

出问题的概率很小。
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-1-24 11:09:25 | 显示全部楼层
eric2013 发表于 2024-1-24 08:46
可以考虑使用DMA半传输完成回调和传输完成回调来实现双缓冲试试,这个玩法简单易用,启动ADC DMA后,默认 ...

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2024-1-24 12:14:42 | 显示全部楼层
AiK 发表于 2024-1-24 11:09
硬汉哥 今天改成使用DMA半传输完成回调和传输完成回调来实现双缓冲,但是还是得在传输完成里面使能ADSTAR ...

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

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2024-1-24 15:12:33 | 显示全部楼层
eric2013 发表于 2024-1-24 12:14
那你的程序确实有点问题。参考我们V7的吧,那个是正常的,ADC+DMA+TIM的双缓冲案例。

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2024-1-25 00:33:41 | 显示全部楼层
AiK 发表于 2024-1-24 15:12
🆗 我自己找下,另外 定时器3的通道4捕获能触发ADC3转换么?我看ADC的头文件ADC_EXTERNALTRIG_T3_ ...

对,可以的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 10:05 , Processed in 0.307885 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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