OpenEdv-开源电子网

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

DMA实验中的一些疑惑

[复制链接]

14

主题

101

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2011-9-6
在线时间
3 小时
发表于 2011-9-19 16:51:45 | 显示全部楼层 |阅读模式
 DMA实验过程中有以下疑问:
1 当DMA将数据发送至UASRT->DR全部完成后,串口依然在发送数据,如何停止USART发送数据?

2 传入USART->DR中的数据后传入的数据将覆盖先前传入的数据,为什么当DMA传送数据完毕后,UASRT依然可以发送完整的TEXT_TO_SEND[]数据?
3 UASRT发送完整TEXT_TO_SEND[]数据的次数可否实现控制?
4 在DMA数据传送完毕后,试图通过禁止DMA传送或禁止USART的DMA发送方式实现UASRT停止发送数据,但是都失败了.请问有方法实现吗?
5 能否讲解以下USART发送数据和USART DMA方式发送数据的区别? 为什么主程序中只设置USART为DMA方式发送数据,而不需要USART发送数据的程序就可以实现数据的发送?

期待解答......
事无巨细 循序渐进
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-9-19 16:59:59 | 显示全部楼层
回复【楼主位】葱花鱼:
---------------------------------
1,全部完了之后串口不会发送数据.你所看到的是表象,因为我的助手显示数据过慢,导致数据早就完了,但是还是串口调试助手还是在显示.
2,后传入的数据都是在先传入的收据发送完之后才传的,为什么会覆盖?
3,没有什么不能控制的.
4,DMA完毕后是不会再发送数据的.你那是多此一举.
5,普通发送和dma发送在少量数据零星发送的时候,基本上没啥区别. 在大量数据频繁发送的时候,dma的优势就明显了.它可以不用cpu参与,而直接发送内存中的数据给串口. 你多看看资料吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

101

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2011-9-6
在线时间
3 小时
 楼主| 发表于 2011-9-20 10:53:00 | 显示全部楼层
原子哥, 资料里面的资料我看了,DMA方式传输速度快,不需要CPU停止,基本设置我看明白了.我用丁丁串口测试了下,确实是显示数据速度的问题.但是我在测试过程中发现了一个问题:cndtr 数据传输量的设置不同得到结果不同 测试结果如下:


       五次测试cndtr的设置数值依次分别为: 31  34  62  68  102 , 有以下几点不明白:
    1 TEXT_TO_SEND[]={"ALIENTEK MiniSTM32 DMA 串口实验"}; 这个数组共有20个字符,4个汉字,3个空格,在转化为ASCII码过程中数组长度为 20*1+4*2(汉字)+3*1(空格)+1*1(数组结束符)+2*1(回车)=34   那么为什么cndtr=31 和cndtr=34 结果相同?  难道是ASCII码转化后的数组长度计算错误?  不解中.....
    2 cndtr=31 和cndtr=62  的结果表明传输的长度肯定不是31,那为什么第一次cndtr=31 可以完整显示呢?
    3 cndtr=62   cndtr=68   cndtr=102  的结果表明传输数据长度为34的倍数可以完整显示数据.

  请原子哥帮忙解答一下,谢谢!
事无巨细 循序渐进
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-9-20 12:52:44 | 显示全部楼层
不知道你代码怎么改的。无法确定原因。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

101

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2011-9-6
在线时间
3 小时
 楼主| 发表于 2011-9-20 14:44:20 | 显示全部楼层

原子哥,我只是修改了主程序里面的cndtr的值(标记为红色),就是修改了原来程序中的5200(数据传输量),其他都没有修改,具体代码如下:
 #include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"   
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
#include "dma.h"
//Mini STM32开发板范例代码15
//DMA 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com

u8 SendBuff[68];      //修改处
const u8 TEXT_TO_SEND[]={"ALIENTEK MiniSTM32 DMA 串口实验"}; 
int main(void)
{  
 u16 i;
 u8 t=0;
 u8 j,mask=0;
 float pro=0;//进度
     
   Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化  
 LED_Init();
 KEY_Init(); 
 LCD_Init();
 MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,68);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5200.

  OINT_COLOR=RED;//设置字体为蓝色   
 LCD_ShowString(60,50,"Mini STM32"); 
 LCD_ShowString(60,70,"DMA USART TEST"); 
 LCD_ShowString(60,90,"ATOM@ALIENTEK");
 LCD_ShowString(60,110,"2010/12/30");
 //显示提示信息
 LCD_ShowString(60,130,"Press KEY0 To Start!");

 j=sizeof(TEXT_TO_SEND);   
 for(i=0;i<68;i++)//填充ASCII字符集数据
    {
  if(t>=j)//加入换行符
  {
   if(mask)
   {
    SendBuff=0x0a;
    t=0;
   }else
   {
    SendBuff=0x0d;
    mask++;
   } 
  }else//复制TEXT_TO_SEND语句
  {
   mask=0;
   SendBuff=TEXT_TO_SEND[t];
   t++;
  }      
    }  
 OINT_COLOR=BLUE;//设置字体为蓝色  
 i=0;
 while(1)
 {
  t=KEY_Scan();
  if(t==1)//KEY0按下
  {
   LCD_ShowString(60,150,"Start Transimit....");
   LCD_ShowString(60,170,"   %");//显示百分号
   printf("\n\nDMA DATA:\n");     
      USART1->CR3=1<<7;           //使能串口1的DMA发送      
   MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!  
      //等待DMA传输完成,此时我们来做另外一些事,点灯
      //实际应用中,传输数据期间,可以执行另外的任务
      while(1)
      {
    if(DMA1->ISR&(1<<13))//等待通道4传输完成
    {
     DMA1->IFCR|=1<<13;//清除通道4传输完成标志
     break;
          }
    pro=DMA1_Channel4->CNDTR;//得到当前还剩余多少个数据
    pro=1-pro/68;//得到百分比  
    pro*=100;      //扩大100倍
    LCD_ShowNum(60,170,pro,3,16);  
      }      
   LCD_ShowNum(60,170,100,3,16);//显示100%  
   LCD_ShowString(60,150,"Transimit Finished!");//提示传送完成
  }
  i++;
  delay_ms(10);
  if(i==20)
  {
   LED0=!LED0;//提示系统正在运行 
   i=0;
  }    
 }
}


 

事无巨细 循序渐进
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-9-20 15:10:38 | 显示全部楼层
"ALIENTEK MiniSTM32 DMA 串口实验"长度为31个字节,包含了结束符之后为32个字节。
在while(1)之前,把回车加进这个字符串紧跟结束符之后,所以一个完整的发送长度为34个字符。
当长度为31的时候,刚好把字符串全部发完(结束符及回车未发送)所以是可以看到完整的字符串的。
当长度为34的时候,把回车发送完了就没其他数据发送了,所以看到的结果和31的时候是一样的。
当长度为62的时候,发送了第一次数据,34个字节后还剩28个字符未发送,“ALIENTEK MiniSTM32 DMA 串口”占了27个字符,还有“实”字发送了第一个字符,因为没有完整发送一个汉字,所以串口助手不会显示出来。结果就是你看到的样子。
当长度为68和102的时候,均是34的倍数,故结果是完整的,没什么好说的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

101

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2011-9-6
在线时间
3 小时
 楼主| 发表于 2011-9-20 16:04:57 | 显示全部楼层
哦,知道了,谢谢原子哥!
事无巨细 循序渐进
回复 支持 反对

使用道具 举报

19

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2011-11-6
在线时间
1 小时
发表于 2011-11-27 16:56:37 | 显示全部楼层
原子哥的串口助理不好用,用超级终端很爽,到了100%,马上接受完毕。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-27 18:59:03 | 显示全部楼层
回复【8楼】rfw8797:
---------------------------------
确实,以后有时间在整个好点的.
用丁丁的也不错.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-7-22
在线时间
5 小时
发表于 2012-8-23 15:44:00 | 显示全部楼层
原子哥  你好 我用的也是这个实验,  但是奇怪的是  我用你们给我的 hex 码下载后就可以进行动作;  而 我自己用keil4.23编译之后下载  到按键 单片机就不动作了,  灯也不闪 数据也不串
请问原因在哪?  晕中..
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-23 17:44:38 | 显示全部楼层
回复【10楼】dbird:
---------------------------------
下载最新版本的代码,老版本的代码有些小bug
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-8-14
在线时间
0 小时
发表于 2014-8-21 23:59:14 | 显示全部楼层
mark   。。。。。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2014-8-22 16:15:45 | 显示全部楼层
串口的速度怎么能跟DMA比的,串口很慢的................
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 11:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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