OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3035|回复: 10

关于DMA请求的一个疑问

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
发表于 2016-4-8 08:36:48 | 显示全部楼层 |阅读模式
1金钱
关于STM32 F10X的DMA部分

case 1:
从MEM to Peripheral时(例如内存到UART数据寄存器)
DMA_buffersize = 512
软件触发

疑问:当软件触发一次后,DMA搬运512个byte吗?

case 2:
从 Peripheral 到 MEM (例如,ADC1 的7个通道(设置为规则连接扫描))
DMA_buffersize = 7

疑问: 2-1 通道1的ADC完成时请求一次DMA,然后DMA搬运一次
               即每个通道完成一次都会产生一回DMA请求,7个通道产生7次请求?(个人倾向于这个)
         还是说:
         2-2  ADC1中,只要产生一次DMA请求后,DMA就自动搬运7回?(是和上面软件触发一样)

针对上面的两个case
软件触发一次,DMA就搬运完成所有buffersize,而“硬件”触发的场合,每触发一次只搬运一回

手册上这一块好像讲到的是“每产生一次DMA请求,DMA只搬运一回”
根据这个,我对case2,我觉得是2-1这个的情况合理。
但这样的话,针对case1,我就不知道怎样去讲通




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11554
金钱
11554
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-8 09:00:56 | 显示全部楼层

触发一次,可以搬运一个数据,也可以批量搬运多个。
数量可以设定,位宽度也可以设定。


回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
 楼主| 发表于 2016-4-8 09:26:50 | 显示全部楼层
xuande 发表于 2016-4-8 09:00
触发一次,可以搬运一个数据,也可以批量搬运多个。
数量可以设定,位宽度也可以设定。

你的意思是,case2中,
ADC1的7个通道,以规则方式,ch1~ch7
如果DMA设定搬运7个,那么当ADC1的ch1刚完成AD转换发出DMA请求时,DMA会一次搬运7个?这个应该怎么理解?ADC1剩下的ch2~ch7还没转换呢。不是应该每个AD channel完成转换发出DAM请求,DMA再搬运一次。这样更合理吗?
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
 楼主| 发表于 2016-4-8 09:29:39 | 显示全部楼层
xuande 发表于 2016-4-8 09:00
触发一次,可以搬运一个数据,也可以批量搬运多个。
数量可以设定,位宽度也可以设定。

》数量可以设定
补充:我就是针对数量设定的情况
我的主要疑问是设定的数量N,是由一次DMA请求产生后,DMA全都搬运完这N个数据,还是说要产生N次请求后,DMA才能搬运完(即DMA每执行一次搬运,一定要由一次请求来驱动?)
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
 楼主| 发表于 2016-4-8 09:36:06 | 显示全部楼层
上代码
ADC1设定(开启7个通道)
[mw_shl_code=applescript,true]ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 7;        //顺序进行规则转换的ADC通道的数目[/mw_shl_code]


DMA设定:
[mw_shl_code=applescript,true]DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));//DMA外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)存储器地址;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//存储器到外设模式
DMA_InitStructure.DMA_BufferSize = 7;//数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用普通模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;[/mw_shl_code]

首先上面的代码是能正常工作的。我是借由上面的例子,产生了1楼这样的疑问

如果CH1 AD转换完成发出DMA请求,DMA控制器就开始按设定的搬运7次(而不是只搬运1次)的话,那
CH2 AD转换完成也发出DMA请求,DMA控制器怎么办?这样的工作应该不合理阿

》DMA_InitStructure.DMA_BufferSize = 7;//数据传输量
我认为是
CH1 AD 转换完成发出DMA请求,DMA控制器搬运1次(COUNT减1)
CH2 AD 转换完成发出DMA请求,DMA控制器搬运1次(COUNT减1)
.....
CH7 AD 转换完成发出DMA请求,DMA控制器搬运1次(COUNT减1,此时COUNT为0了)
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11554
金钱
11554
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-8 10:24:26 | 显示全部楼层

buffer=7,这个数据好像很奇怪。
印象里只能设置1,2,4,8,16这些数量,没有7.

回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
 楼主| 发表于 2016-4-8 10:39:55 | 显示全部楼层
本帖最后由 happydog 于 2016-4-8 10:50 编辑
xuande 发表于 2016-4-8 10:24
buffer=7,这个数据好像很奇怪。
印象里只能设置1,2,4,8,16这些数量,没有7.

怎么会呢。buffesize就是数据大小阿,为什么一定要是2^n次方
没这个限制。
这里7代表就是DMA搬运7次(对应7个通道上的AD值)
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11554
金钱
11554
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-8 11:14:32 | 显示全部楼层
happydog 发表于 2016-4-8 10:39
怎么会呢。buffesize就是数据大小阿,为什么一定要是2^n次方
没这个限制。
这里7代表就是DMA搬运7次( ...


需要仔细看资料了。


回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
 楼主| 发表于 2016-4-8 18:40:18 | 显示全部楼层
xuande 发表于 2016-4-8 11:14
需要仔细看资料了。

虽然能工作,但是内部的细节还是没搞明白。
究竟是不是我说的每个AD CH完成来一次DMA请求,DMA收到一次请求就执行一次搬运
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-4-2
在线时间
17 小时
 楼主| 发表于 2016-4-15 08:51:15 | 显示全部楼层
本帖最后由 happydog 于 2016-4-15 08:57 编辑

删除------------------------------
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11554
金钱
11554
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-15 08:59:19 | 显示全部楼层
happydog 发表于 2016-4-15 08:51
补充问题:
在MCU介入的场合,还需要开发者结合中断,状态标志位等逻辑从UART DR接收数据,或是向UART DR ...


配置以后,DMA并非立刻开始工作。
要等有触发才会动作。

触发源,就在request表格里面。

回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 13:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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