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

刘建华

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

为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?

我把韦老师关于祼板跑LED的例子烧写在TQ2440板子上的NAND-Flash上跑是没有问题的,灯会按计数的方式依次点亮,而我把这个程序烧在Nor-Flash上跑,灯就显示全亮了。经过多次调试,发现是如果存在那个Wait()函数就有问题,好象那个Wait()函数在Nor-flash上跑是起不到延时的作用。请韦老师指导一下。我是用你的OpenJTAG工具下载到TQ2440的板子上的。但我点亮单一个LED是没有问题的,但按计数的方式点亮,放在Nor-Flash上跑就不行,灯会全亮,我把Wait函数的参数设到最大也没用,最小也没用。

回帖(6)

石栓成

2019-8-14 06:16:40
今天又测了韦老师的key_led的案例程序,针对TQ2440开发板进行相关管脚定义的修改后,用oflash软件烧写入Nand Flash运行是没有问题的,但烧写到Nor Flash上就出问题了,对于按键按下后,灯不亮。我怀疑是TQ2440开发板的Nor Flash启动地址不是以00000000开始的。但我编写了一个极为简单的点亮单个LED的程序,又运行正常啵,所以百思不得其解,请板主给予指教和回复,谢谢。
Key_led.c的源码是:
#define GPBCON      (*(volatile unsigned long *)0x56000010)                        //定义LED灯
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

#define GPFCON      (*(volatile unsigned long *)0x56000050)     //定义按键
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

/*
* LED1,LED2,LED4对应GPF4、GPF5、GPF6
*/
#define        GPB5_out        (1<<(5*2))
#define        GPB6_out        (1<<(6*2))
#define        GPB7_out        (1<<(7*2))
#define GPB8_out  (1<<(8*2))

#define        GPB5_msk        (3<<(5*2))                                                               
#define        GPB6_msk        (3<<(6*2))                 
#define        GPB7_msk        (3<<(7*2))                                                               
#define GPB8_msk  (3<<(8*2))                                                               

/*
* K0,K1,K2,K32,对应GPF0、GPF1、GPF2、GPF4
*/
#define GPF0_in     (0<<(0*2))                //“右”按键,对应K0   EINT0
#define GPF1_in     (0<<(1*2))                //“上”按键,对应K1  EINT1
#define GPF2_in     (0<<(2*2))    //"左“按键,对应K3   EINT2
#define GPF4_in                        (0<<(4*2))    //”下“按键,对应K2   EINT4


#define GPF0_msk    (3<<(0*2))
#define GPF1_msk    (3<<(1*2))
#define GPF2_msk    (3<<(2*2))
#define GPF4_msk    (3<<(4*2))

int main()
{
        unsigned long dwDat;
        // LED1,LED2,LED3,LED4对应的4根引脚设为输出
        GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk);
        GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out;
        
        // K0,K1,K2,K3对应的2根引脚设为输入
        GPFCON &= ~(GPF0_msk | GPF1_msk | GPF2_msk |GPF4_msk);
        GPFCON |= GPF0_in | GPF1_in | GPF2_in | GPF4_in;


        while(1){
            //若Kn为0(表示按下),则令LEDn为0(表示点亮)
            dwDat = GPFDAT;             // 读取GPF管脚电平状态
        
            if (dwDat & (1<<0))        // K0没有按下
                GPBDAT |= (1<<5);       // LED1熄灭
            else   
                GPBDAT &= ~(1<<5);      // LED1点亮
               
            if (dwDat & (1<<1))         // K1没有按下
                GPBDAT |= (1<<6);       // LED2熄灭
            else   
                GPBDAT &= ~(1<<6);      // LED2点亮
   
            
            if (dwDat & (1<<2))         // K2没有按下
                GPBDAT |= (1<<7);       // LED3熄灭
            else   
                GPBDAT &= ~(1<<7);      // LED3点亮
               
            if (dwDat & (1<<4))         // K3没有按下
                GPBDAT |= (1<<8);       // LED4熄灭
            else   
                GPBDAT &= ~(1<<8);      // LED4点亮
    }

    return 0;
}

Ctr0.S的原码是:
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************      

.text
.global _start
_start:
            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启
            
            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
            bl      main                @ 调用C程序中的main函数
halt_loop:
            b       halt_loop

Makefile的源码是:
key_led.bin : crt0.S  key_led.c
        arm-linux-gcc -g -c -o crt0.o crt0.S
        arm-linux-gcc -g -c -o key_led.o key_led.c
        arm-linux-ld -Ttext 0x0000000 -g  crt0.o key_led.o -o key_led_elf
        arm-linux-objcopy -O binary -S key_led_elf key_led.bin
        arm-linux-objdump -D -m arm  key_led_elf > key_led.dis
clean:
        rm -f   key_led.dis key_led.bin key_led_elf *.o
举报

李丽虹

2019-8-14 06:29:40
NOR启动时,也是从0运行;
你要重新设置栈,把
  ldr     sp, =1024*4  
改为:
  ldr     sp, =(0x40000000 + 1024*4  )

栈要指向内存,NOR启动时,0地址这一块对应NOR FLASH,它可像内存一样读不可像内存一样写
举报

崔业萍

2019-8-14 06:34:40
果然OK了,非常感谢版主的指导。
举报

刘晓英

2019-8-14 06:42:22
我也在这个实验上发现了问题,同样的代码,烧到Nor flash和Nand flash里,运行的时候,Nor flash闪烁交替的频率要慢一些。
举报

更多回帖

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