新唐MCU技术
直播中

李春梅

8年用户 1984经验值
私信 关注
[问答]

请问如何使用 NUC220 将应用程序从 APROM 0x0000切换到 APROM 0x4000?

我在 APROM 0x0000 中保存了 1 个应用程序,在 APROM 0x4000 中保存了 1 个应用程序,如何使用 NUC220 将应用程序从 APROM 0x0000切换到 APROM 0x4000?

回帖(1)

他在笑

2025-8-29 17:30:11

在 NUC220 中,从 APROM 0x0000 切换到 APROM 0x4000 的应用程序可以通过以下两种方法实现。两种方法的核心都是通过修改 CONFIG0 寄存器的启动地址配置,并触发芯片复位。




方法 1:通过用户代码(User Code)修改 CONFIG0 并复位芯片


步骤:




  1. 解锁 Flash 控制寄存器 (FMC)

    确保在执行 Flash 操作前解锁寄存器。


    SYS_UnlockReg();  // 解锁系统寄存器



  2. 使能配置区更新

    允许修改 CONFIG0 寄存器。


    FMC_ENABLE_CFG_UPDATE();  // 启用配置区更新



  3. 擦除配置区

    配置区大小为 512 字节,需整体擦除。


    FMC_Erase(FMC_CONFIG_BASE);  // 擦除配置区起始地址



  4. 计算并设置新的启动地址  



    • CONFIG0[21:0] 位存储启动地址的高 21 位(实际地址右移 1 位)。

    • 目标地址为 0x4000,计算方式:

      (0x4000 >> 1) & 0x003FFFFF → 结果值为 0x2000
      uint32_t u32Config0 = FMC_READ_CONFIG0();  // 读取当前 CONFIG0
      u32Config0 = (u32Config0 & ~0x003FFFFFUL) | 0x2000;  // 保留其他位,更新启动地址位




  5. 写入新的 CONFIG0 值  


    FMC_WriteConfig(u32Config0, FMC_READ_CONFIG1());  // 写入新 CONFIG0 和原 CONFIG1



  6. 锁定配置区并复位

    锁定配置区防止误操作,并重启芯片。


    FMC_DISABLE_CFG_UPDATE();  // 禁用配置区更新
    SYS_LockReg();             // 锁定寄存器
    NVIC_SystemReset();        // 系统复位





方法 2:通过 ICP 编程工具(推荐)


使用 ICP (In-Circuit Programmer) 工具直接更新 CONFIG0,无需用户代码:



  1. 连接 ICP 工具(如 Nu-Link)到 NUC220。

  2. 打开 NuMicro ICP Programming Tool

  3. 载入目标应用程序(位于 APROM 0x4000)。

  4. 设置启动地址

    • Config 标签页中找到 Boot Address 设置。

    • 输入 0x4000 作为启动地址(工具自动计算 CONFIG0 值)。


  5. 执行编程

    • 点击 Program 按钮,工具自动更新配置并烧录代码。

    • 复位后芯片从 0x4000 启动。





注意事项



  1. 启动地址对齐

    NUC220 要求启动地址必须对齐到 2字节边界(最低位固定为 0)。0x4000 符合要求。

  2. 中断向量表处理  

    • Cortex-M0 没有 VTOR 寄存器,中断向量表固定映射到 0x00000000

    • 若应用程序在 0x4000 需处理中断,必须在链接脚本中重新定位向量表到 0x4000,并确保在 0x0000 放置跳转到 0x4000 中断处理程序的跳转指令(或使用 Bootloader 管理中断转发)。


  3. 复位后执行流程

    修改 CONFIG0 后,芯片会在下次复位时从新地址启动。务必执行复位操作(如 NVIC_SystemReset())。

  4. 配置区保护

    操作 CONFIG0 前必须使能更新(FMC_ENABLE_CFG_UPDATE()),完成后禁用以防意外修改。




示例代码(方法 1 完整片段)


#include "NUC200Series.h"

void SwitchToAPROM4000(void) {
    // 解锁系统及FMC
    SYS_UnlockReg();
    FMC_Open();

    // 允许配置区更新
    FMC_ENABLE_CFG_UPDATE();

    // 擦除配置区
    FMC_Erase(FMC_CONFIG_BASE);

    // 计算新启动地址: 0x4000 >> 1 = 0x2000
    uint32_t u32Config0 = FMC_READ_CONFIG0();
    u32Config0 = (u32Config0 & ~0x003FFFFFUL) | 0x2000;

    // 写入CONFIG0/CONFIG1 (保留原CONFIG1值)
    FMC_WriteConfig(u32Config0, FMC_READ_CONFIG1());

    // 锁定配置区
    FMC_DISABLE_CFG_UPDATE();
    FMC_Close();
    SYS_LockReg();

    // 复位芯片生效
    NVIC_SystemReset();
}

使用此代码后,芯片复位后将直接从 0x4000 执行应用程序。




验证方法



  1. 检查 CONFIG0 值

    使用 ICP 工具读取 CONFIG0,确认低 22 位为 0x2000(即 0x4000 地址的编码)。

  2. 复位后观察 PC 指针

    通过调试器连接,复位后查看程序计数器 (PC) 是否跳转到 0x4000


根据实际需求选择合适的方法。推荐使用 ICP 工具避免代码风险。

举报

更多回帖

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