OpenEdv-开源电子网

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

DMA的问题

[复制链接]

22

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-7-9
在线时间
2 小时
发表于 2013-8-14 08:20:54 | 显示全部楼层 |阅读模式

int main(void)

 u16 i;
 u8 t=0;
 u8 j,mask=0;
 float pro=0;    //进度
 
 DELAY_Init();         
 LED_Init();   
 KEY_Init();       
 USART1_Init(9600);     
 LCD_Init();    
 LCD_Driver(); 
    
 MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,5168);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5168.   
 
 OINT_COLOR=RED;      //设置字体为红色
 LCD_ShowString(60,50,200,16,16,"WarShip STM32"); 
 LCD_ShowString(60,70,200,16,16,"DMA TEST"); 
 LCD_ShowString(60,90,200,16,16,"
ATOM@ALIENTEK");
 LCD_ShowString(60,110,200,16,16,"2012/9/8"); 
 LCD_ShowString(60,130,200,16,16,"KEY1:Start");

 //显示提示信息 
 j=sizeof(TEXT_TO_SEND);   
 for(i=0;i<5168;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(0);
  if(t==1)       //KEY1按下
  {
   LCD_ShowString(60,150,200,16,16,"Start Transimit....");
   LCD_ShowString(60,170,200,16,16,"   %");               //显示百分号
   printf("\r\nDMA DATA:\r\n");     
   USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);           //使能串口1的DMA发送 
   MYDMA_Enable(DMA1_Channel4);                           //开始一次DMA传输!
     
      //等待DMA传输完成,此时我们来做另外一些事,点灯
      //注意:实际应用中,传输数据期间,可以执行另外的任务
      while(1)
      {
    if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET) //判断通道4传输完成
    {
     DMA_ClearFlag(DMA1_FLAG_TC4);           //清除通道4传输完成标志
     break;
          }
    pro=DMA_GetCurrDataCounter(DMA1_Channel4);  //得到当前还剩余多少个数据
    pro=1-pro/5168;     //得到百分比  
    pro*=100;           //扩大100倍
    LCD_ShowNum(60,170,pro,3,16);  
      }      
   LCD_ShowNum(60,170,100,3,16);                          //显示100%  
   LCD_ShowString(60,150,200,16,16,"Transimit Finished!");//提示传送完成
  }
  i++;
  delay_ms(10);
  if(i==20)
  {
   LED1=!LED1;                                             //提示系统正在运行 
   i=0;
  }    
 }
}

我的疑问是:1.当程序进入第二个while语句的时候不是进入死循环了嘛 ,led灯怎么还会闪烁。
                    

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

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-14 08:37:37 | 显示全部楼层
看见  break 了吗

符合条件 就跳出循环
回复 支持 反对

使用道具 举报

4

主题

116

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2013-7-24
在线时间
13 小时
发表于 2013-8-14 08:40:03 | 显示全部楼层
进入第二个while(1)  我的灯怎么是不亮的= =
回复 支持 反对

使用道具 举报

22

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-7-9
在线时间
2 小时
 楼主| 发表于 2013-8-14 15:05:55 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
懂了!!
回复 支持 反对

使用道具 举报

22

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-7-9
在线时间
2 小时
 楼主| 发表于 2013-8-14 15:10:34 | 显示全部楼层
回复【3楼】培大少:
---------------------------------
这个正常啊,因为当你按下按键的时候,你的led灯可能是刚好不亮,又或者是刚好亮,而等到传输完的时候,led灯又会回到原来的一直在闪
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-11-18 15:16:15 | 显示全部楼层
忘了里面还有个break;
等待就是浪费时间!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 05:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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