韦东山Linux嵌入式课程社区
直播中

王慧

7年用户 203经验值
私信 关注

为什么我的leds程序使用uboot启动,延时效果不对?

今天又来试下老师的leds程序,效果是移动点亮led1 2 3 。
makefile、程序也没咋个改,就是重新编译了一次。
uboot :tftp 30400000 leds.bin ;go 30400000
编译工具用的CD1里面的CD1toolsARM-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2


我做起来LED3闪烁很快,LED1 2 常亮 。wait从30000改到30000000 ,怎么改效果都不变
问题在哪里呢?编译工具吗?
_________________________________
leds.c:
void  wait(volatile unsigned long dly)
{
        for(; dly > 0; dly--);
}

int main(void)
{
        unsigned long i = 0;

        GPFCON = GPF4_out|GPF5_out|GPF6_out;                // 将LED1-3对应的GPF4/5/6三个引脚设为输出

        while(1){
                wait(30000000);
                wait(30000000);
                wait(30000000);
                wait(30000000);
                wait(30000000);
                wait(30000000);
                wait(30000000);         
                GPFDAT = (~(i<<4));                 // 根据i的值,点亮LED1-3
                if(++i == 8)
                        i = 0;
        }

        return 0;
}

//LED3闪烁很快,LED1 2 常亮 。wait从30000改到30000000 ,怎么改效果都不变
// uboot :tftp 30400000 leds.bin ;go 30400000
_________________________________
leds.lds:
SECTIONS {
        . = 0x30400000;
          .text          :   { *(.text) }
        .rodata ALIGN(4) : {*(.rodata)}
          .data ALIGN(4) : { *(.data) }
          .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
}

回帖(4)

李天竹

2019-6-20 16:10:43
不错,这个程序请注意while循环内关于点亮灯的那段GPFDAT赋值语句,那个i的值初始为0,配合下面的if语句内的,建议你手动把每一次循环写下来,看看每次到底亮几个灯,亮哪个灯,和你wait多长时间没关系,不关wait的事,造成灯闪烁不规律的原因在于GPFDAT赋值语句和i的值。或者直接在论坛里裸机板块搜索点灯关键字,记得以前看到过有人写过详细的过程
举报

王娜

2019-6-20 16:17:19
这里有个因为烧进norflash而造成失败的例子,可惜不适合我现在的情况。我是使用bootloader下载到ram中运行的。
http://www.100ask.org/bbs/forum. ... hlight=%B5%E3%B5%C6
举报

陈秀珍

2019-6-20 16:22:30
灯的延时对了,还是那个代码。。。
不理解,也许是某处小错误。
结了。
举报

蔡丹青

2019-6-20 16:38:38
另外 crt0.S  的注释写错,还原。
举报

更多回帖

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