OpenEdv-开源电子网

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

又DMA

[复制链接]

22

主题

55

帖子

0

精华

初级会员

Rank: 2

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

u8 SendBuff[5200];
const u8 TEXT_TO_SEND[]={"ALIENTEK Warship STM32 DMA 串口实验"}; 
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;
  }    
 }
}

这是战舰版做DMA实验中的主程序部分,就是黑色粗体那一部分的程序,因为它把传输数据长度设置为5168是刚好能在最后一次传输完“ALIENTEK Warship STM32 DMA 串口实验”的,

但把这个数值改大一点或者改小一点的话,可能最后一次传输只能传输“ALIENTEK Warship STM32 DMA 串口实验”中的一部分字符,比如最后一行只显示“ALIENTEK Warship ”,所以我就想问这个数值该怎么设置才能在最后一次传输的时候也能完完整整的把它输出来,求原子哥和各位大侠指点迷津!!!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-14 16:20:46 | 显示全部楼层
回复【楼主位】烧年:
---------------------------------
buf的大小,等于完整字符串总长度的整数倍。
满足这个关系即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 01:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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