单片机利用bootloader阶段对app进行升级的方案

本文介绍了一个在MT031单片机上实现bootloader+app结构的方案,通过CAN总线接收固件升级,并在bootloader阶段检查与更新APP。由于中断向量表位置冲突,解决方案是在bootloader启动前将APP的中断向量表覆盖到bootloader的中断向量表,以确保APP阶段的中断正常响应。拷贝过程包括检查和拷贝中断向量表,避免重复拷贝以保护FLASH寿命。最后,通过调整bootloader代码存放区域以确保拷贝动作的顺利进行。
摘要由CSDN通过智能技术生成

使用单片机平台: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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值