主题 : 求教各位,led裸机程序为什么在MINI2440上不行 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 94086
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2013-07-08
最后登录: 2017-09-13
楼主  发表于: 2014-09-10 16:01

 求教各位,led裸机程序为什么在MINI2440上不行

我的开发板是MINI2440,在使用VIVI的a命令将程序下到nand flash成功后,下电从nandflash启动,开发板按程序按键,程序不动。
将CRT0.S中的关闭看门狗0x53000000改为0x56000010后,再用同样方法下到nand flash成功后,下电从nandflash启动,程序正常。
按道理应该是CRT0.S中的关闭看门狗0x53000000是正确的,希望得到解答。谢谢
韦东山程序如下:
@******************************************************************************
@ 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

key_led.c
#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)

#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

/*
* LED1,LED2,LED4对应GPB5、GPB6、GPB7、GPB8
*/
#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))

/*
* K1,K2,K3,K4对应GPG0,GPG3,GPG5,GPG6
*/
#define GPG0_in     (0<<(0*2))
#define GPG3_in     (0<<(3*2))
#define GPG5_in     (0<<(5*2))
#define GPG6_in     (0<<(6*2))

#define GPG0_msk    (3<<(0*2))
#define GPG3_msk    (3<<(3*2))
#define GPG5_msk    (3<<(5*2))
#define GPG6_msk    (3<<(6*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;
        
        // K1,K2,K3,K4对应的4根引脚设为输入
        GPGCON &= ~(GPG0_msk | GPG3_msk | GPG5_msk | GPG6_msk);
        GPGCON |= GPG0_in | GPG3_in | GPG5_in | GPG6_in;


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

    return 0;
}
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
我艹
级别: 新手上路
UID: 104847
精华: 0
发帖: 46
金钱: 235 两
威望: 47 点
贡献值: 0 点
综合积分: 92 分
注册时间: 2014-06-06
最后登录: 2019-06-21
1楼  发表于: 2014-09-10 22:58
打电话给客服