打印
[研电赛技术支持]

GD32的DMA+ADC应用之二维数组转不动

[复制链接]
1846|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Drencin|  楼主 | 2024-12-27 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#每日话题#
用GD32F103RC做一个ADC(5 channels)+DMA应用,当数据目的地址为二维数组时,无论怎么搞都会无法达到目的,详情如下:
uint16_t AD_buff[5][10];  //设置5个数组对应5个ADC通道,每个数组含10个值
ADC0_CH0  --> AD_buff[0][]
ADC0_CH1  --> AD_buff[1][]
ADC0_CH2  --> AD_buff[2][]
ADC0_CH3  --> AD_buff[3][]
ADC0_CH4  --> AD_buff[4][]
每次只采一个通道只转换一次只传输一次,使用ADC0转换完成事件请求DMA0传输数据,做一个中断服务程序,在中断服务程序中检查到DMA0传输完成后切换下一个ADC通道和传输目的地址(可以设置两个变量例如sample_index和channel_num代替数组的x/y序号),这意味着当ADC0_CH4采集数据并转换完成后又从ADC0_CH0开始,同时二维数组进一级(举例AD_buff[4][0]切换到AD_buff[0][1])。周而复始。

问题是:DMA0只会在AD_buff[0][0] ~ AD_buff[4][0]循环,无论怎么尝试(开/关ADC0循环或开/关DMA0循环各种操作)都无法存入AD_buff[0][1] ~ AD_buff[4][9]。

郁闷了。最后取消DMA传输,只在中断服务程序是直接从ADC0存入数组。任务方面虽然完成了,但ADC+DMA存二维数组这种问题到处都没找到应用实例,望高手们尝试一下,看看到底什么原因。


使用特权

评论回复
沙发
Amazingxixixi| | 2024-12-27 11:10 | 只看该作者
可以二维转换为一维数组

使用特权

评论回复
板凳
Amazingxixixi| | 2024-12-27 11:10 | 只看该作者
可以二维转换为一维数组

使用特权

评论回复
地板
Drencin|  楼主 | 2024-12-27 13:45 | 只看该作者
当5个通道对应不同的物理量时,一维数组在利用时仍然需要重新分组处理,增加代码量。如果仅着眼于数据获得,甚至都不必用到DMA(前面已提到最终应用时已经放弃了DMA改用ADC中断直接存数组)。我只是想知道为什么二维数组DMA处理不了。

使用特权

评论回复
5
b5z1giu| | 2025-1-8 15:59 | 只看该作者
你遇到的问题是由于DMA的配置和ADC的触发机制没有正确配合导致的。DMA在传输数据时,通常是一次性传输一组数据,而你的需求是每次只传输一个通道的一个采样值,并且需要动态切换目标地址。

使用特权

评论回复
6
lamanius| | 2025-1-8 17:05 | 只看该作者
DMA通常配置为循环模式或单次模式。循环模式下,DMA会在固定的内存区域(如 AD_buff[0][0] 到 AD_buff[4][0])之间循环传输,无法自动切换到下一列

使用特权

评论回复
7
w2nme1ai7| | 2025-1-8 18:12 | 只看该作者
你希望每次只采集一个通道的一个采样值,然后通过中断切换通道和目标地址。但DMA的配置可能没有正确支持这种动态切换。是不是没配置对呢?

使用特权

评论回复
8
l1uyn9b| | 2025-1-8 19:11 | 只看该作者
二维数组 AD_buff[5][10] 在内存中是连续存储的,DMA需要正确配置目标地址的增量模式

使用特权

评论回复
9
p0gon9y| | 2025-1-8 20:18 | 只看该作者
每次DMA只传输一个采样值。在DMA传输完成后,通过中断重新配置DMA的目标地址。

使用特权

评论回复
10
lix1yr| | 2025-1-8 21:22 | 只看该作者
在DMA传输完成中断中,更新目标地址为下一列的位置。使用变量 sample_index 和 channel_num 来跟踪当前的行和列。

使用特权

评论回复
11
d1ng2x| | 2025-1-8 22:32 | 只看该作者
每次只转换一个通道的一个采样值。在ADC转换完成后触发DMA传输。

使用特权

评论回复
12
ex7s4| | 2025-1-8 23:46 | 只看该作者
DMA目标地址动态更新,在DMA传输完成中断中,更新目标地址为下一列的位置。

使用特权

评论回复
13
cen9ce| | 2025-1-9 10:05 | 只看该作者
每次DMA传输完成后,切换到下一个ADC通道。DMA配置为单次传输模式,每次只传输一个采样值。

使用特权

评论回复
14
y1n9an| | 2025-1-9 13:02 | 只看该作者
估计是你的DMA没配置对吧,而且一定要确保ADC的触发和DMA的传输时序正确。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝