裸机程序,简单的LED驱动问题,为什么LED灯不闪烁?
时间:10-02
整理:3721RD
点击:
做一个裸机程序,点亮LED灯,想要达到使得LED灯闪烁的效果,
但是用下面的程序生成的bin文件,下载到开发板,为什么LED1一直亮,而不闪烁?
C代码如下:
注意,實際時間還是要看你CPU多少Hz,再去校準
但是用下面的程序生成的bin文件,下载到开发板,为什么LED1一直亮,而不闪烁?
C代码如下:
- #define GPFCON (*(volatile unsigned long *)0x56000050)
- #define GPFUP (*(volatile unsigned long *)0x56000058)
- #define GPFDAT (*(volatile unsigned long *)0x56000054)
- #define GPF0_Out (1<<(0*2))
- #define GPF1_Out (1<<(1*2))
- #define GPF2_Out (1<<(2*2))
- #define GPF3_Out (1<<(3*2))
- #define LED1_ON (GPFDAT &= (~(1<<0)));
- #define LED1_OFF (GPFDAT |= (1<<0));
- #define LED2_ON (GPFDAT &= (~(1<<1)));
- #define LED2_OFF (GPFDAT |= (1<<1));
- #define LED3_ON (GPFDAT &= (~(1<<2)));
- #define LED3_OFF (GPFDAT |= (1<<2));
- #define LED4_ON (GPFDAT &= (~(1<<3)));
- #define LED4_OFF (GPFDAT |= (1<<3));
- void Delay(void);
- int main()
- {
- GPFCON = GPF0_Out|GPF1_Out|GPF2_Out|GPF3_Out; //将LED1,2,3,4对应的GPF0,1,2,3的三个引脚设为输出
-
- //先熄灭所有的LED灯
- LED1_OFF;
- LED2_OFF;
- LED3_OFF;
- LED4_OFF;
-
- while(1)
- {
- Delay();
- LED1_ON;//单独运行该行代码,可以点亮LED1
- Delay();
- LED1_OFF;//单独运行该行代码,可以熄灭LED1
- }
-
- return 0;
- }
- void Delay(void)
- {
- volatile unsigned long MaxNum1 = 9000;
- volatile unsigned long MaxNum2 = 9000;
- volatile unsigned long MaxNum3 = 9000;
- volatile unsigned long i = 0;
- volatile unsigned long j = 0;
- volatile unsigned long k = 0;
-
- for(i=0;i<MaxNum1;i++)
- {
- for(j=0;j<MaxNum2;j++)
- {
- for(k=0;k<MaxNum3;k++)
- {
- ;
- }
- }
- }
-
- return;
- }
在while循环中,若只将LED1_ON运行,注释掉LED1_OFF,那么LED1灯一直是亮着的;
若只将LED1_OFF运行,注释掉LED1_ON,那么LED1灯将熄灭;
不知道为什么LED1_ON和LED1_OFF都运行时,为什么LED1不闪烁呢?
另外Delay延时函数的,延时时间长短也进行了调整测试,没发现有什么影响变化。
你试试先打开开LED1,然后延时一段时间熄灭,看看有木有反应~
我把代码改成下面这样,效果是,灯一直亮,不灭
- //while(1)
- //{
- Delay();
- LED1_ON;//单独运行该行代码,可以点亮LED1
- Delay();
- LED1_OFF;//单独运行该行代码,可以熄灭LED1
- //}
你这个很明显是延时时间不够长,身边要是有示波器可以测试下对应的引脚输出,应该有方波输出
我把延时函数改成下面的样子,还是不行,LED1灯不闪烁
- void Delay(void)
- {
- volatile unsigned long MaxNum1 = 90000000;
- volatile unsigned long MaxNum2 = 90000000;
- volatile unsigned long MaxNum3 = 90000000;
- volatile unsigned long MaxNum4 = 90000000;
- volatile unsigned long MaxNum5 = 90000000;
- volatile unsigned long MaxNum6 = 90000000;
- volatile unsigned long i = 0;
- volatile unsigned long j = 0;
- volatile unsigned long k = 0;
- volatile unsigned long l = 0;
- volatile unsigned long m = 0;
- volatile unsigned long n = 0;
-
- for(i=0;i<MaxNum1;i++)
- {
- for(j=0;j<MaxNum2;j++)
- {
- for(k=0;k<MaxNum3;k++)
- {
- for(l=0;l<MaxNum4;l++)
- {
- for(m=0;m<MaxNum5;m++)
- {
- for(n=0;n<MaxNum6;n++)
- {
- ;
- }
- }
- }
- }
- }
- }
-
- return;
- }
感觉上是延时时间太长了,你写的裸机程序,时钟有没有倍频,板子就和很普通的单片机一样,你的delay里面嵌套了那么多,时间应该是太长了。
延时时间太长了
算给你看看:
9000的3重循环就是9000 * 9000 * 9000 = 729000000000
你的单片机如果有4GHz主频,估计可以闪
就算40M,时间也是大于 729000000000 * (1/40)us = 18225 s = 50小时
你放着等两天它就闪一下....
你写成下面那种,估计等到头发白了也不闪,时间还是稍微计算一下比较好
应该调整下延迟参数,慢慢实践噻
你的延遲函式會造成假性的無窮迴圈的,建議寫法如下
- void delay(uint32_t us)
- {
- while(us--);
- }
注意,實際時間還是要看你CPU多少Hz,再去校準
一直亮可能是延时太长了,或者就是I/O设置的问题了