OpenEdv-开源电子网

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

关于战舰stm32DMA实验中,串口传输数据的过程中LED灯为什么并没有闪烁,不是LED指示程序运行状态吗???

[复制链接]

4

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-2-20
在线时间
56 小时
发表于 2014-4-29 02:07:00 | 显示全部楼层 |阅读模式

 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //使能串口1的DMA发送 
   MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!  
      //等待DMA传输完成,此时我们来做另外一些事,点灯
      //实际应用中,传输数据期间,可以执行另外的任务

程序中说在传输数据过程中可以执行别的任务,下面有LED闪烁的程序,为什么等传输完成才执行?传输的过程中并不闪烁!!!


      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)
  {
   LED0=!LED0;//提示系统正在运行 
   i=0;
  }

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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-29 08:20:56 | 显示全部楼层
楼主还是好好啃下单片机的工作原理吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-4-29 08:27:51 | 显示全部楼层
你把程序排列下啊,至少把全部大括号给写出来,你这样都不知道谁对谁

 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)
          {
            LED0=!LED0;//提示系统正在运行 
            i=0;
            }

回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-2-20
在线时间
56 小时
 楼主| 发表于 2014-4-29 16:24:43 | 显示全部楼层
回复【楼主位】linhao091:
---------------------------------
不好意思,见笑了,问题找到了,改变一下LED闪烁代码的位置就好了,没有必要开启DMA传输后,在while语句中等待传输完成!多谢回复,第一次提问,考虑不周,见笑了!!!
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-2-20
在线时间
56 小时
 楼主| 发表于 2014-4-29 16:28:42 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
不好意思,见笑了,问题找到了,改变一下LED闪烁代码的位置就好了,没有必要开启DMA传输后,在while语句中等待传输完成!多谢回复,第一次提问,考虑不周,见笑了!!!
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-10-24 13:35:00 | 显示全部楼层
linhao091 发表于 2014-4-29 16:28
回复【2楼】Badu_Space:
---------------------------------
不好意思,见笑了,问题找到了,改变一下LED闪 ...

教程中就是你发的位置?为什么要换?我发现灯也不闪烁  。你找到的原因是为什么呢
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-10-24 14:22:17 | 显示全部楼层
我试了下发现,DMA传输过程,运行灯不闪烁,等传输完了,才开始重新闪烁。这也不是注释所说的等待传输过程,可以执行另外的任务。遇到了和楼主一样的问题  。楼主如何解决的
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-10-26 10:14:00 | 显示全部楼层
实际测试第二个WHILE(1)里面的程序能证明DMADMA传输过程,同时也可以执行其他任务比如向屏幕推送传输进度条,表示总线交替由CPU和DMA控制。运行指示灯恰恰证明DMA和CPU只能一个占有总线
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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