2440 norflash 启动进不了中断解决

 


前一阵一直纠结一个问题,同样的中断测试程序,烧写到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
	


 

修改过后中断测试程序就可以正确运行了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值