使用单片机平台:MT031, 32位处理器,最高运行频率72Mhz, 32kb FLASH, 4kb sram。
目标:在该平台上实现bootloader+app的软件结构,bootloader和app分阶段加载,bootloader阶段负责检查需不需要对APP进行固件升级,升级的固件由CAN总线发送过来,然后写入app的固件地址即可。
遇到的问题:该单片机的中断向量表固定在flash的0x0地址,app工程的中断无法响应。
解决思路:bootloader阶段不使用任何中断(reset中断除外),bootloader启动app之前先拷贝app的中断向量表覆盖到bootloader的中断向量表。这样APP阶段使用的中断就能正常响应。
拷贝方式如下:
#define jump_addr FIRMWARE_START_ADDERSS
__align(4) uint32_t * code_buffer;
__align(4) uint8_t code_buf[512] = {0};
void update_rom(void)
{
int i, flag = 0;
code_buffer = (uint32_t *)code_buf;
if (((*(volatile uint32_t *)(jump_addr)) & 0x2FFF0000) != 0x20000000){
return;
}
for (i=1; i<48; i++){
if ((*(volatile uint32_t *)(jump_addr+ i*4)) > 0x8000){
return;
}
}
for (i=8; i<192; i++){
if ((*(volatile uint8_