OpenEdv-开源电子网

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

《有关DMA控制器Normal模式下的数据传输配置和重新启动配置》

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
发表于 2014-11-6 04:55:15 | 显示全部楼层 |阅读模式
最近看到好多人问这个问题:DMA在配置为Normal模式时只能进入一次中断,随后就擦擦了。其实你要看英文资料你就会发现"DMA传输通道配置为Normal模式时也就是单次传输,这时DMA通道是被锁定的,就是说执行完一次读写之后不管你CPU发多少request(例如:USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);),DMA都不会响应,如果重新启动DMA进行数据传输,那么首先要先将DMA关闭"关闭之后怎么操作呢?这才是重点:
其实加载一个新的数据ST的库里面有一个专门的函数,好多网友说的其实也是对的,就是没有把具体的操作方式晒出来,说白了就是修改要传送数据的数量,软件监控就会发现,DMA是属于减计数,发送读取完成之后计数器的值会自动减为0,所以你要发送(以发送为例子)新的数据,就必须重新配置其数据的数目或者长度。具体的如下:
第一步:DMA_Cmd(DMA1_ChannelX,DISABLE);//关闭DMA
第二步:DMA_SetCurrDataCounter(DMA1_Channel4,SENDBUFFER_SIZE);//这是关键,这个函数就是ST库里面用来重新设置当前数据计数器值的。
第三步:DMA_Cmd(DMA1_Channel4,ENABLE);//重新启动DMA
               USART_DMACmd(USART1, USART_DMAReq_Xx, ENABLE);//向DMA发送request请求。
第二步的函数原型如下:
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber)
{
  /* Check the parameters */
  assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));
  /* Write to DMAy Channelx CNDTR */
  DMAy_Channelx->CNDTR = DataNumber;  
}
就这么简单。下面附上代码大家学习。
实验代码的原理是:1;DMA 循环扫描ADC1通道1(C1)上的电压信号。2:将12位的AD转换原始数据同过DMA发到串口发送数据寄存器,通过串口发送给PC机,为什么不用扫描模式呢?像温度这些也没必要那么快的发,消耗资源,还有就是要给上位机给够充裕的数据处理时间,我的数据比较海,每秒钟发送一次也就差不多了。
DMA本身比较高效,但是个人感觉不是特别的舒服,受控程度不高,尤其是串口在接受数据时候,那就相当麻烦了各种异常标志要去清理。说实话ST没有一个全面的库函数说明,目前比较少起码,我和德国日本的高科技产品打交道比较多,之前做视觉,像德国小工厂出的视觉系统,介绍资料2000多页,里面对硬件和每一个函数都有非常详细的解释和讲义,ST对其函数库的说明是一塌糊涂,再加上本身是他们工程师写的库,库里面嵌套比较多,比较混乱,就上面的那个函数软体,要是在PDF里面有详细的解释说明,我相信可能不会有这么多人问这个问题。国际惯例,先贴上调试截图:


差点上了苍老师,擦擦

DriveWheel_ADC_DMA.rar

3.37 MB, 下载次数: 746

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-6 15:58:31 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-6 15:58:46 | 显示全部楼层
苍老师都能上到,不错啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-6 18:51:59 | 显示全部楼层
差点把苍老师的图上上去了!!!!
回复 支持 反对

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-11-8 09:46:46 | 显示全部楼层
你串口回复【4楼】drivewheel:
---------------------------------
你串口发送的一堆数据,PC怎能识别? 也没个结束标志。
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-12 20:54:04 | 显示全部楼层
这个是个测试程序,到工程上面肯定呀增加标志位置啊,比如","之类 的,怎么可能没办法识别????
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-11-1
在线时间
0 小时
 楼主| 发表于 2014-11-12 20:56:05 | 显示全部楼层
那串口调试软件又不是我写的,我写的话当然会处理数据,数据分类,分拣,别人的软件,就算你能给个标志位又能说明什么?我写的串口软件是工程应用,上位监控用的,肯定是处理好的。呵呵
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-7-29
在线时间
0 小时
发表于 2015-10-9 14:38:18 | 显示全部楼层
刚好碰到这方面的问题! 看了这个帖子的这几句句话
“DMA传输通道配置为Normal模式时也就是单次传输,这时DMA通道是被锁定的,就是说执行完一次读写之后不管你CPU发多少requestDMA都不会响应”
“修改要传送数据的数量”
我这么修改后“case 0x31MA1_Channel1->CCR &= 0xfffe; 
             DMA1_Channel1->CNDTR = 9;
             DMA1_Channel1->CMAR =(INT32U)&RX_Buffer1;
 DMA1_Channel1->CCR |= 0x0001;                  
             break;
   case 0x32MA1_Channel1->CCR &= 0xfffe; 
             DMA1_Channel1->CNDTR = 9;  
             DMA1_Channel1->CMAR =(INT32U)&RX_Buffer2;
 DMA1_Channel1->CCR |= 0x0001;                  
             break;
   case 0x33MA1_Channel1->CCR &= 0xfffe; 
             DMA1_Channel1->CNDTR = 9;
 DMA1_Channel1->CMAR =(INT32U)&RX_Buffer3;
 DMA1_Channel1->CCR |= 0x0001;                
             break;
   case 0x35MA1_Channel1->CCR &= 0xfffe; 
             DMA1_Channel1->CNDTR = 9;
 DMA1_Channel1->CMAR =(INT32U)&RX_Buffer5;
 DMA1_Channel1->CCR |= 0x0001;
 OSQPost(TaskQ,(void *)&RX_Buffer5);                
             break;”
已经成功解决了。谢谢!
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-7-29
在线时间
0 小时
发表于 2015-10-9 14:38:58 | 显示全部楼层
回复【8楼】那一片天空:
---------------------------------
不需要重头开始配置
回复 支持 反对

使用道具 举报

17

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2015-12-22
在线时间
128 小时
发表于 2016-1-23 11:04:59 | 显示全部楼层
吊啊,挺有用
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 05:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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