|
重新置IVR,SIRn寄存器的值
不一定需要REMAP到RAM。 因为EIC的中断,每次都是读EIC_IRV这个寄存器的,即0X18处的指令其实是跳到EIC_IRV处。EIC_IRV其实是EIC_IVR+SIRn组成的,这个合成动作是硬件自动完成的。这样在需要升级的应用程序开始的地方重新置IVR,SIRn寄存器的值即可保证IRQ中断能进入到正确的ISR程序中。
是不是只要重置用到的SIRx 和 IVR 就可以了 ?
keil 的例子 :
Vectors: LDR PC,Reset_Addr LDR PC,Undef_Addr LDR PC,SWI_Addr LDR PC,PAbt_Addr LDR PC,DAbt_Addr NOP /* Reserved Vector */ LDR PC,[PC, #-0x0808] /* Vector from EIC_IVR */ LDR PC,FIQ_Addr
Reset_Addr: DD Reset_Handler Undef_Addr: DD Undef_Handler?A SWI_Addr: DD SWI_Handler?A PAbt_Addr: DD PAbt_Handler?A DAbt_Addr: DD DAbt_Handler?A DD 0 /* Reserved Address */ IRQ_Addr: DD IRQ_Handler?A FIQ_Addr: DD FIQ_Handler?A
// Configure and enable IRQ for Timer 3 EIC->IVR = (u32)T3TIMI_IRQHandler; EIC->SIR[T3TIMI_IRQChannel] = ((u16)T3TIMI_IRQHandler << 16); EIC_IRQChannelConfig(T3TIMI_IRQChannel, ENABLE); EIC_IRQChannelPriorityConfig(T3TIMI_IRQChannel, 1);
// Configure and enable IRQ for A/D Converter EIC->SIR[ADC_IRQChannel] = ((u16)ADC12_IRQHandler << 16); EIC_IRQChannelConfig(ADC_IRQChannel, ENABLE); EIC_IRQChannelPriorityConfig(ADC_IRQChannel, 2);
EIC_IRQConfig(ENABLE); // Configure IRQ |
|