新唐科技(Nuvoton)的M051系列单片机基于ARM Cortex-M0内核,其Bootloader实现原理主要围绕双存储空间(APROM和LDROM)、启动选择机制以及固件升级流程展开。以下从核心原理、启动流程和实现要点三个方面详细解析:
一、Bootloader的核心架构
双存储空间设计
APROM(主程序区):存放用户应用程序,通常从0x0000_0000地址开始执行。
LDROM(引导程序区):存放Bootloader固件(如NuMicro ISP Tool),地址由配置字(Config0)指定,通常为Flash末尾的固定区域(如4KB)。
切换机制:通过硬件引脚(如PF.6接地)或配置字(Config0的CBS位)选择启动源。
启动选择逻辑
上电复位时,芯片根据以下顺序决定启动位置:
若启动选择引脚(如PF.6)为低电平,则从LDROM启动(Bootloader模式)。
若引脚为高电平,则检查配置字CBS位:
CBS=0:从APROM启动用户程序。
CBS=1:从LDROM启动Bootloader。
二、Bootloader的工作流程
阶段1:硬件初始化(汇编层)
关闭看门狗、中断,初始化时钟和RAM。
配置栈指针,为C代码执行准备环境。
阶段2:Bootloader主逻辑(C语言层)
外设初始化
启用串口、USB或CAN等通信接口,用于接收升级固件。
升级检测与处理
若检测到升级请求(如串口指令或USB连接),则进入下载模式:
擦除APROM目标区域。
通过通信接口接收新固件(bin/hex格式),写入APROM。
校验固件完整性(如CRC校验)。
跳转至用户程序
若无升级需求,则从APROM的起始地址(0x0000_0000)获取用户程序的栈指针和复位向量,并跳转执行。
关键代码示例:
- void jump_to_app(uint32_t app_addr) {
- typedef void (*app_entry_t)(void);
- uint32_t stack_pointer = *((uint32_t *)app_addr);
- uint32_t reset_vector = *((uint32_t *)(app_addr + 4));
- __set_MSP(stack_pointer); // 设置主栈指针
- ((app_entry_t)reset_vector)(); // 跳转到用户程序
- }
|