要注意几点吧:1. 等全部设置好了,再enable TIMER0.2.要想有中断响应,必须开NVIC的中断。3.之前要先清中断。定时器差不多介绍完了。 其次,中断向量表的重映射问题。 如果要实现中断向量表的重映射问题,就要对VTOR寄存器进行设置。这里做的是重映射到0x20004000.好像设置VTOR寄存器与中断向量拷贝并没有一定的先后顺序。 Q:这里就有一个疑问:VTOR的范围为0x00000080-0x3FFFFF80的范围,但是当我将VTOR设置为0x30000000的时候,是没有问题的。问题是将中断向量表拷贝到0x30000000的时候,是无法复制的。0x30000000这个区域在内存映射中是reserved。 SCB->VTOR = 0x20004000;
TIMER0_IRQHandler
LDR R15, = TIMER0;这是将用户代码放置到ROM中,如果代码已经放置到SDRAM,且要在SDRAM中运行的话,必须修改如下:
LDR R0, =0xA0000000
LDR R1, =TIMER0
ADD R0,R0,R1
MOV R15, R0
TIMER0的程序为熄灭一个LED灯。void TIMER0()
{
*(INT32U*) T0IR = 0x1<<0;
*(INT32U*) P4_22_IO = 0x00000021;
}
向量表拷贝汇编代码:five
LDR R0, =0x00000000
LDR R2, =0x20004000
LDR R3, =0x20004400
four
LDM R0!,{R4-R7}
STM R2!,{R4-R7}
CMP R2,R3
BCC four
BX R14 ;;;汇编时,如果BLX,BX过去的程序时C程序的话,则不用加返回指令,如果是汇编的
;话,就要BX R14
Q:调试的过程中,遇到的一些问题,还没有解决。 当main函数中,不是用while(1)的时候,中断就无**常响应。
|