USB论坛
直播中

任凭风吹

10年用户 1084经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 制造/封装 模拟技术
私信 关注
[问答]

fx10 bootloader有什么办法可以通过代码来切换模式,进入启动模式吗?

fx10 bootloader通过外部按钮进入启动模式。但是由于项目上没有外接按键,有什么办法可以通过代码来切换模式,进入启动模式吗?

回帖(1)

h1654155275.5916

2025-7-25 18:13:57

在 FX10 微控制器的应用中,如果无法使用外部按钮进入启动模式,可以通过软件方式实现切换。以下是几种可行的代码级解决方案:




方案 1:通过软件复位 + 寄存器标志进入启动模式


这是 最推荐 的方法,依赖 Bootloader 检测特定寄存器的值。


实现步骤:



  1. 定义共享寄存器:选择一个在复位后保持值的寄存器(如备份寄存器 RTC_BKPxR 或 SRAM 中的保留地址)。

  2. 应用程序代码:在需要时设置标志并触发复位:
    // 设置标志位(例如使用 RTC 备份寄存器)
    RTC->BKP0R = 0x5A5A; // 任意约定值
    // 触发软件复位
    NVIC_SystemReset();

  3. Bootloader 代码:在初始化时检测标志:
    if (RTC->BKP0R == 0x5A5A) {
       RTC->BKP0R = 0; // 清除标志
       enter_boot_mode(); // 进入启动模式
    } else {
       // 正常启动应用程序
    }



关键:需确保 Bootloader 支持该机制(如需修改 Bootloader,需预先刷入新版本)。





方案 2:修改选项字节(Option Bytes)


通过调整启动源配置,需谨慎操作以避免设备锁死。


实现步骤:


// 解锁选项字节
FLASH_Unlock();
FLASH_OB_Unlock();

// 设置启动模式为系统存储器(Bootloader)
OB_BootConfig boot_config = {.BootMode = OB_BOOT_SYSTEM_MEMORY};
FLASH_OB_BootConfig(&boot_config);

// 重新锁定并复位
FLASH_OB_Lock();
FLASH_Lock();
NVIC_SystemReset();

复位后将从 Bootloader 启动。

注意:  



  • 操作前需备份选项字节。

  • 退出 Bootloader 时需将选项字节改回 OB_BOOT_MAIN_FLASH




方案 3:直接跳转到 Bootloader


从应用程序直接跳转到 Bootloader 的入口地址。


实现步骤:


typedef void (*bootloader_entry)(void);

void jump_to_bootloader() {
    __disable_irq(); // 关闭全局中断

    // Bootloader 的入口地址(需查手册确认,如 0x1FFF0000)
    uint32_t boot_address = 0x1FFF0000;
    bootloader_entry boot_entry = (bootloader_entry)(*(uint32_t*)(boot_address + 4));

    // 重置堆栈指针
    __set_MSP(*(uint32_t*)boot_address);

    // 跳转
    boot_entry();
}

注意:  



  • 需查阅芯片手册确认 Bootloader 基地址。

  • 跳转前需关闭所有外设和中断。




方案 4:利用看门狗或复位源区分


通过复位原因判断是否需要进入 Bootloader。



  1. 在应用程序中检测特定条件(如串口命令)。

  2. 若满足条件,触发看门狗复位(或其他软复位)。

  3. Bootloader 通过 RCC_GetResetSource() 判断复位来源:
    if (RCC_GetResetSource() == RESET_WATCHDOG) {
       enter_boot_mode();
    }




选择建议:



  1. 优先方案 1:若可修改 Bootloader,通过寄存器标志是最可靠的方法。

  2. 次选方案 3:无法修改 Bootloader 时,直接跳转(确保 Bootloader 能处理外设状态)。

  3. 谨慎使用方案 2:选项字节操作有风险,需严格验证。

  4. 方案 4:适用于需要区分复位场景的场景。




注意事项



  • 所有操作前需关闭全局中断(__disable_irq())。

  • 操作前需清理外设状态(关闭 ADC、DMA、定时器等)。

  • 查阅《FX10 Reference Manual》确认寄存器地址和选项字节细节。

  • 测试时预留恢复机制(如串口命令强制退出 Bootloader)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分