微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 裸机程序,简单的LED驱动问题,为什么LED灯不闪烁?

裸机程序,简单的LED驱动问题,为什么LED灯不闪烁?

时间:10-02 整理:3721RD 点击:
做一个裸机程序,点亮LED灯,想要达到使得LED灯闪烁的效果,
但是用下面的程序生成的bin文件,下载到开发板,为什么LED1一直亮,而不闪烁?
C代码如下:

  1. #define GPFCON (*(volatile unsigned long *)0x56000050)
  2. #define GPFUP  (*(volatile unsigned long *)0x56000058)
  3. #define GPFDAT (*(volatile unsigned long *)0x56000054)

  4. #define GPF0_Out (1<<(0*2))
  5. #define GPF1_Out (1<<(1*2))
  6. #define GPF2_Out (1<<(2*2))
  7. #define GPF3_Out (1<<(3*2))

  8. #define LED1_ON  (GPFDAT &= (~(1<<0)));
  9. #define LED1_OFF (GPFDAT |= (1<<0));
  10. #define LED2_ON  (GPFDAT &= (~(1<<1)));
  11. #define LED2_OFF (GPFDAT |= (1<<1));
  12. #define LED3_ON  (GPFDAT &= (~(1<<2)));
  13. #define LED3_OFF (GPFDAT |= (1<<2));
  14. #define LED4_ON  (GPFDAT &= (~(1<<3)));
  15. #define LED4_OFF (GPFDAT |= (1<<3));


  16. void Delay(void);

  17. int main()
  18. {
  19.         GPFCON = GPF0_Out|GPF1_Out|GPF2_Out|GPF3_Out; //将LED1,2,3,4对应的GPF0,1,2,3的三个引脚设为输出
  20.        
  21.         //先熄灭所有的LED灯
  22.         LED1_OFF;
  23.         LED2_OFF;
  24.         LED3_OFF;
  25.         LED4_OFF;
  26.        
  27.         while(1)
  28.         {
  29.                 Delay();
  30.                 LED1_ON;//单独运行该行代码,可以点亮LED1
  31.                 Delay();
  32.                 LED1_OFF;//单独运行该行代码,可以熄灭LED1                               
  33.         }
  34.        
  35.         return 0;
  36. }

  37. void Delay(void)
  38. {
  39.         volatile unsigned long MaxNum1 = 9000;
  40.         volatile unsigned long MaxNum2 = 9000;
  41.         volatile unsigned long MaxNum3 = 9000;
  42.         volatile unsigned long  i = 0;
  43.         volatile unsigned long  j = 0;
  44.         volatile unsigned long  k = 0;
  45.        
  46.         for(i=0;i<MaxNum1;i++)
  47.         {
  48.                 for(j=0;j<MaxNum2;j++)
  49.                 {
  50.                         for(k=0;k<MaxNum3;k++)
  51.                         {
  52.                                 ;
  53.                         }
  54.                 }
  55.         }               
  56.        
  57.         return;
  58. }

复制代码




在while循环中,若只将LED1_ON运行,注释掉LED1_OFF,那么LED1灯一直是亮着的;
                      若只将LED1_OFF运行,注释掉LED1_ON,那么LED1灯将熄灭;
不知道为什么LED1_ON和LED1_OFF都运行时,为什么LED1不闪烁呢?
另外Delay延时函数的,延时时间长短也进行了调整测试,没发现有什么影响变化。

你试试先打开开LED1,然后延时一段时间熄灭,看看有木有反应~

我把代码改成下面这样,效果是,灯一直亮,不灭

  1.         //while(1)
  2.         //{
  3.                 Delay();       
  4.                 LED1_ON;//单独运行该行代码,可以点亮LED1
  5.                 Delay();       
  6.                 LED1_OFF;//单独运行该行代码,可以熄灭LED1                               
  7.         //}

复制代码

你这个很明显是延时时间不够长,身边要是有示波器可以测试下对应的引脚输出,应该有方波输出

我把延时函数改成下面的样子,还是不行,LED1灯不闪烁

  1. void Delay(void)
  2. {
  3.         volatile unsigned long MaxNum1 = 90000000;
  4.         volatile unsigned long MaxNum2 = 90000000;
  5.         volatile unsigned long MaxNum3 = 90000000;
  6.         volatile unsigned long MaxNum4 = 90000000;
  7.         volatile unsigned long MaxNum5 = 90000000;
  8.         volatile unsigned long MaxNum6 = 90000000;
  9.         volatile unsigned long  i = 0;
  10.         volatile unsigned long  j = 0;
  11.         volatile unsigned long  k = 0;
  12.         volatile unsigned long  l = 0;
  13.         volatile unsigned long  m = 0;
  14.         volatile unsigned long  n = 0;
  15.        
  16.         for(i=0;i<MaxNum1;i++)
  17.         {
  18.                 for(j=0;j<MaxNum2;j++)
  19.                 {
  20.                         for(k=0;k<MaxNum3;k++)
  21.                         {
  22.                                 for(l=0;l<MaxNum4;l++)
  23.                                 {
  24.                                         for(m=0;m<MaxNum5;m++)
  25.                                         {
  26.                                                 for(n=0;n<MaxNum6;n++)
  27.                                                 {
  28.                                                         ;
  29.                                                 }
  30.                                         }
  31.                                 }
  32.                         }
  33.                 }
  34.         }               
  35.        
  36.         return;
  37. }

复制代码

感觉上是延时时间太长了,你写的裸机程序,时钟有没有倍频,板子就和很普通的单片机一样,你的delay里面嵌套了那么多,时间应该是太长了。

延时时间太长了
算给你看看:
9000的3重循环就是9000 * 9000 * 9000 = 729000000000
你的单片机如果有4GHz主频,估计可以闪
就算40M,时间也是大于 729000000000 * (1/40)us   =  18225 s = 50小时
你放着等两天它就闪一下....

你写成下面那种,估计等到头发白了也不闪,时间还是稍微计算一下比较好

应该调整下延迟参数,慢慢实践噻

你的延遲函式會造成假性的無窮迴圈的,建議寫法如下

  1. void delay(uint32_t us)
  2. {
  3.    while(us--);
  4. }

复制代码


注意,實際時間還是要看你CPU多少Hz,再去校準

一直亮可能是延时太长了,或者就是I/O设置的问题了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top