士兰微sc32f5664芯片,cortex-m0内核;在做bootloader时需要进行中断向量表重映射,但是这个芯片没有这个功能;
目前是把应用程序中断向量表保存到RAM区,也没有像32芯片SYSCFG->CFGR1寄存器,告知芯片到RAM区寻找中断源;
想问一下该如何告知内核发生中断时,去RAM区寻找保存的中断向量源;在boot loader与应用程序都可以使用中断
士兰微sc32f5664芯片,cortex-m0内核;在做bootloader时需要进行中断向量表重映射,但是这个芯片没有这个功能;
目前是把应用程序中断向量表保存到RAM区,也没有像32芯片SYSCFG->CFGR1寄存器,告知芯片到RAM区寻找中断源;
想问一下该如何告知内核发生中断时,去RAM区寻找保存的中断向量源;在boot loader与应用程序都可以使用中断
在bootloader的中断里读取中断号,自己加一个偏移地址然后跳转到app的向量表
如果bootloader也要用中断的话,加一个标志位判断使用app的向量表还是bootloader的向量表
M0没办法,只能这么麻烦,而且速度也慢。
下面是一个例子
#define InterruptVectorTableOffset 0x20000000
__asm void IRQHandlersRemap(void)
{
MRS R0, IPSR
LSLS R0, R0, #0x02
LDR R1, =InterruptVectorTableOffset
ADDS R1, R1, R0
LDR R1, [R1]
BX R1
nop
}
#define ALIAS(x) __attribute__ ((alias (#x)))
void NMI_Handler(void) ALIAS(IRQHandlersRemap);
void HardFault_Handler(void) ALIAS(IRQHandlersRemap);
void SVC_Handler(void) ALIAS(IRQHandlersRemap);
void PendSV_Handler(void) ALIAS(IRQHandlersRemap);
void SysTick_Handler(void) ALIAS(IRQHandlersRemap);
void EXTI0_IRQHandler(void) ALIAS(IRQHandlersRemap);
void EXTI1_IRQHandler(void) ALIAS(IRQHandlersRemap);
void EXTI2_IRQHandler(void) ALIAS(IRQHandlersRemap);
void EXTI3_IRQHandler(void) ALIAS(IRQHandlersRemap);
void EXTI4_IRQHandler(void) ALIAS(IRQHandlersRemap);
void EXTI5_IRQHandler(void) ALIAS(IRQHandlersRemap);
......