通常情况下,为了产品后续的升级,程序都会分为两部分Bootloader+App,因为有两个程序,所以需要对中断向量表进行处理,否则,当程序已经跳转到app中运行,当中断产生的时候,响应函数仍然是Bootloader的中断函数,而不是app的
在STM32F103 M3内核上是可以配置寄存器SCB->VTOR设置中断向量表偏移,CH579是M0内核,并不支持这样操作,中断向量表位置固定在(地址0x00000000)位置上
解决思路:
- 将中断向量表重映射到RAM(内存)
- 根据当前运行程序将FLASH中的向量表拷贝到RAM中
解决步骤
- 将地址0x00000000的中断向量表中的全部中断函数都设置为同一个函数,用于映射
- 编写映射函数
- 修改RAM配置信息
- 根据前当前运行的程序拷贝中断向量表到RAM
(注意:以下代码都是编写在Bootloader程序中)
第一步:设置映射
这里利用编译器设置函数属性的就可以简单实现
#define ALIAS(x) __attribute__ ((alias (#x)))
void NMI_Handler(void) ALIAS(interrupt_vector_relay);
void HardFault_Handler(void)ALIAS(interrupt_vector_relay);
void SVC_Handler(void) ALIAS(interrupt_vector_relay);
void PendSV_Handler(void) ALIAS(interrupt_vector_relay);
void SysTick_Handler(void) ALIAS(interrupt_vector_relay);