ARM技术william hill官网
直播中

心中一片海

12年用户 15经验值
擅长:可编程逻辑
私信 关注
[问答]

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

做一个裸机程序,点亮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
  47.         {
  48.                 for(j=0;j
  49.                 {
  50.                         for(k=0;k
  51.                         {
  52.                                 ;
  53.                         }
  54.                 }
  55.         }               
  56.        
  57.         return;
  58. }





已退回10积分

回帖(11)

心中一片海

2015-9-28 22:30:41
在while循环中,若只将LED1_ON运行,注释掉LED1_OFF,那么LED1灯一直是亮着的;
                      若只将LED1_OFF运行,注释掉LED1_ON,那么LED1灯将熄灭;
不知道为什么LED1_ON和LED1_OFF都运行时,为什么LED1不闪烁呢?

另外Delay延时函数的,延时时间长短也进行了调整测试,没发现有什么影响变化。。。
举报

格古落

2015-9-28 22:53:02
你试试先打开开LED1,然后延时一段时间熄灭,看看有木有反应~
举报

心中一片海

2015-9-28 23:20:40
引用: 格古洛 发表于 2015-9-28 22:53
你试试先打开开LED1,然后延时一段时间熄灭,看看有木有反应~

我把代码改成下面这样,效果是,灯一直亮,不灭
  1.         //while(1)
  2.         //{
  3.                 Delay();       
  4.                 LED1_ON;//单独运行该行代码,可以点亮LED1
  5.                 Delay();       
  6.                 LED1_OFF;//单独运行该行代码,可以熄灭LED1                               
  7.         //}
举报

李仁杰

2015-9-29 07:29:08
引用: 心中一片海 发表于 2015-09-28 22:30
在while循环中,若只将LED1_ON运行,注释掉LED1_OFF,那么LED1灯一直是亮着的;
                      若只将LED1_OFF运行,注释掉LED1_ON,那么LED1灯将熄灭;
不知道为什么LED1_ON和LED1_OFF都运行时,为什么LED1不闪烁呢?

另外Delay延时函数的,延时时间长短也进行了调整测试,没发现有什么影响变化。。。

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

心中一片海

2015-9-29 19:36:41
引用: xiongrz944 发表于 2015-9-29 07:29
你这个很明显是延时时间不够长,身边要是有示波器可以测试下对应的引脚输出,应该有方波输出

我把延时函数改成下面的样子,还是不行,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
  17.         {
  18.                 for(j=0;j
  19.                 {
  20.                         for(k=0;k
  21.                         {
  22.                                 for(l=0;l
  23.                                 {
  24.                                         for(m=0;m
  25.                                         {
  26.                                                 for(n=0;n
  27.                                                 {
  28.                                                         ;
  29.                                                 }
  30.                                         }
  31.                                 }
  32.                         }
  33.                 }
  34.         }               
  35.        
  36.         return;
  37. }
举报

鸿宇

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

韦声健

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

举报

韦声健

2015-9-30 15:14:27
你写成下面那种,估计等到头发白了也不闪,时间还是稍微计算一下比较好
举报

Dowe2013

2015-10-14 19:54:57
应该调整下延迟参数,慢慢实践噻
举报

mop

2015-10-15 14:10:25
你的延遲函式會造成假性的無窮迴圈的,建議寫法如下

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

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

chenwei6991627

2016-1-12 14:24:26
一直亮可能是延时太长了,或者就是I/O设置的问题了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分