今天又测了韦老师的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
今天又测了韦老师的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
举报