在 NUC220 中,从 APROM 0x0000 切换到 APROM 0x4000 的应用程序可以通过以下两种方法实现。两种方法的核心都是通过修改 CONFIG0 寄存器的启动地址配置,并触发芯片复位。
方法 1:通过用户代码(User Code)修改 CONFIG0 并复位芯片
步骤:
解锁 Flash 控制寄存器 (FMC)
确保在执行 Flash 操作前解锁寄存器。
SYS_UnlockReg(); // 解锁系统寄存器
使能配置区更新
允许修改 CONFIG0 寄存器。
FMC_ENABLE_CFG_UPDATE(); // 启用配置区更新
擦除配置区
配置区大小为 512 字节,需整体擦除。
FMC_Erase(FMC_CONFIG_BASE); // 擦除配置区起始地址
计算并设置新的启动地址
写入新的 CONFIG0 值
FMC_WriteConfig(u32Config0, FMC_READ_CONFIG1()); // 写入新 CONFIG0 和原 CONFIG1
锁定配置区并复位
锁定配置区防止误操作,并重启芯片。
FMC_DISABLE_CFG_UPDATE(); // 禁用配置区更新
SYS_LockReg(); // 锁定寄存器
NVIC_SystemReset(); // 系统复位
方法 2:通过 ICP 编程工具(推荐)
使用 ICP (In-Circuit Programmer) 工具直接更新 CONFIG0,无需用户代码:
- 连接 ICP 工具(如 Nu-Link)到 NUC220。
- 打开 NuMicro ICP Programming Tool。
- 载入目标应用程序(位于 APROM 0x4000)。
- 设置启动地址:
- 在 Config 标签页中找到 Boot Address 设置。
- 输入
0x4000 作为启动地址(工具自动计算 CONFIG0 值)。
- 执行编程:
- 点击 Program 按钮,工具自动更新配置并烧录代码。
- 复位后芯片从
0x4000 启动。
注意事项
- 启动地址对齐
NUC220 要求启动地址必须对齐到 2字节边界(最低位固定为 0)。0x4000 符合要求。
- 中断向量表处理
- Cortex-M0 没有 VTOR 寄存器,中断向量表固定映射到
0x00000000。
- 若应用程序在
0x4000 需处理中断,必须在链接脚本中重新定位向量表到 0x4000,并确保在 0x0000 放置跳转到 0x4000 中断处理程序的跳转指令(或使用 Bootloader 管理中断转发)。
- 复位后执行流程
修改 CONFIG0 后,芯片会在下次复位时从新地址启动。务必执行复位操作(如 NVIC_SystemReset())。
- 配置区保护
操作 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 执行应用程序。
验证方法
- 检查 CONFIG0 值
使用 ICP 工具读取 CONFIG0,确认低 22 位为 0x2000(即 0x4000 地址的编码)。
- 复位后观察 PC 指针
通过调试器连接,复位后查看程序计数器 (PC) 是否跳转到 0x4000。
根据实际需求选择合适的方法。推荐使用 ICP 工具避免代码风险。
在 NUC220 中,从 APROM 0x0000 切换到 APROM 0x4000 的应用程序可以通过以下两种方法实现。两种方法的核心都是通过修改 CONFIG0 寄存器的启动地址配置,并触发芯片复位。
方法 1:通过用户代码(User Code)修改 CONFIG0 并复位芯片
步骤:
解锁 Flash 控制寄存器 (FMC)
确保在执行 Flash 操作前解锁寄存器。
SYS_UnlockReg(); // 解锁系统寄存器
使能配置区更新
允许修改 CONFIG0 寄存器。
FMC_ENABLE_CFG_UPDATE(); // 启用配置区更新
擦除配置区
配置区大小为 512 字节,需整体擦除。
FMC_Erase(FMC_CONFIG_BASE); // 擦除配置区起始地址
计算并设置新的启动地址
写入新的 CONFIG0 值
FMC_WriteConfig(u32Config0, FMC_READ_CONFIG1()); // 写入新 CONFIG0 和原 CONFIG1
锁定配置区并复位
锁定配置区防止误操作,并重启芯片。
FMC_DISABLE_CFG_UPDATE(); // 禁用配置区更新
SYS_LockReg(); // 锁定寄存器
NVIC_SystemReset(); // 系统复位
方法 2:通过 ICP 编程工具(推荐)
使用 ICP (In-Circuit Programmer) 工具直接更新 CONFIG0,无需用户代码:
- 连接 ICP 工具(如 Nu-Link)到 NUC220。
- 打开 NuMicro ICP Programming Tool。
- 载入目标应用程序(位于 APROM 0x4000)。
- 设置启动地址:
- 在 Config 标签页中找到 Boot Address 设置。
- 输入
0x4000 作为启动地址(工具自动计算 CONFIG0 值)。
- 执行编程:
- 点击 Program 按钮,工具自动更新配置并烧录代码。
- 复位后芯片从
0x4000 启动。
注意事项
- 启动地址对齐
NUC220 要求启动地址必须对齐到 2字节边界(最低位固定为 0)。0x4000 符合要求。
- 中断向量表处理
- Cortex-M0 没有 VTOR 寄存器,中断向量表固定映射到
0x00000000。
- 若应用程序在
0x4000 需处理中断,必须在链接脚本中重新定位向量表到 0x4000,并确保在 0x0000 放置跳转到 0x4000 中断处理程序的跳转指令(或使用 Bootloader 管理中断转发)。
- 复位后执行流程
修改 CONFIG0 后,芯片会在下次复位时从新地址启动。务必执行复位操作(如 NVIC_SystemReset())。
- 配置区保护
操作 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 执行应用程序。
验证方法
- 检查 CONFIG0 值
使用 ICP 工具读取 CONFIG0,确认低 22 位为 0x2000(即 0x4000 地址的编码)。
- 复位后观察 PC 指针
通过调试器连接,复位后查看程序计数器 (PC) 是否跳转到 0x4000。
根据实际需求选择合适的方法。推荐使用 ICP 工具避免代码风险。
举报