前一阵一直纠结一个问题,同样的中断测试程序,烧写到nandflash运行一点问题没有,烧到norflash启动就发生诡异现象了,今天终于发现问题在哪了,以前写程序的时候因为是从nandflash启动的,所以程序一开始在片内的4K sram 运行,我就把堆栈设置在sram的最后面,sp设置为地址4096,但是现在是从norflash启动的,sram已经映射到0x40000000开始的地方了,所以原来的基于nandflash启动的代码中的堆栈指针地址必须进行修改,程序运行就没有问题了,下面把修改前后的代码记录下来:
1.原来的代码,烧到nandflash里面的
head.s
@本程序为定时器中断测试程序,使用0.5s发生一次的timer0中断
.text
.global _start
_start:
b Reset
b . @undefined instruction
b . @swi
b . @pregetch instruction
b . @data abort
b . @Reserved
b HandleIRQ @irq
b . @fiq
Reset:
ldr sp, =4096 @set the stack pointer of sys mode to 4096
bl disable_watchdog
bl init_led
mov r0, #1
bl blink
bl init_sdram
mov r0, #2
bl blink
bl copy_sdram
mov r0, #3
bl blink
ldr pc, =on_sdram
on_sdram:
msr cpsr_c, #0xd2 @set cpu to irq mode
ldr sp, =3072 @set the stack pointer of irq mode to 3072
msr cpsr_c, #0xdf @reset cpu to sys mode
bl init_clock
bl init_timer0
bl init_irq
msr cpsr_c, #0x5f @enable irq
bl main
b .
.ltorg
.ltorg
.ltorg
HandleIRQ:
sub lr, lr, #4
stmdb sp!, {r0-r12, lr}
ldr lr, =next
ldr pc, =timer0_func
next:
ldmia sp!, {r0-r12, pc}^ @return to main
.ltorg
.ltorg
2. 修改后运行正确的代码,烧写到norflash
head.s
@本程序为定时器中断测试程序,使用0.5s发生一次的timer0中断
.text
.global _start
_start:
b Reset
b . @undefined instruction
b . @swi
b . @pregetch instruction
b . @data abort
b . @Reserved
b HandleIRQ @irq
b . @fiq
Reset:
ldr sp, =0x40001000 @set the stack pointer of sys mode to 0x40001000
bl disable_watchdog
bl init_led
mov r0, #1
bl blink
bl init_sdram
mov r0, #2
bl blink
bl copy_sdram
mov r0, #3
bl blink
ldr pc, =on_sdram
on_sdram:
msr cpsr_c, #0xd2 @set cpu to irq mode
ldr sp, =0x40000c00 @set the stack pointer of irq mode to 0x40000400
msr cpsr_c, #0xdf @reset cpu to sys mode
bl init_clock
bl init_timer0
bl init_irq
msr cpsr_c, #0x5f @enable irq
bl main
b .
.ltorg
.ltorg
.ltorg
HandleIRQ:
sub lr, lr, #4
stmdb sp!, {r0-r12, lr}
ldr lr, =next
ldr pc, =timer0_func
next:
ldmia sp!, {r0-r12, pc}^ @return to main
.ltorg
.ltorg
修改过后中断测试程序就可以正确运行了。