ST意法半导体
直播中

李巍

7年用户 1466经验值
私信 关注
[问答]

使用引导加载程序更新固件问题求解?

我正在使用 STM32L452 Nucleo-64 开发套件。我正在尝试使用引导加载程序更新固件。我的理解是您可以设置闪存选项位以便在复位时进入系统内存(引导加载程序模式),这似乎确实有效。我能够通过 STM32CubeProgrammer 接口成功刷新 MCU。但是当我尝试使用 Cube Programmer 的命令行版本时,有时下载命令没有执行并且我得到一个 NACK 响应,有时我确实看到进度条达到 100%,但 MCU 停留在引导加载程序模式。如果我使用板上的重置开关重置电路板,它只会恢复到之前的程序,而不是应该刷新的程序(它没有被正确充实)。当我使用 Cube Programmer UI 时,我可以看到固件已成功更新。不过,我需要为我们的产品使用 CLI 版本。我正在通过 UART1 闪存 MCU,这在 UI 版本中有效。我想知道这个问题是否与闪存选项位操作有关?还有其他想法吗?我附上了命令行的屏幕截图和来自 CubeProgrammer 的日志文件。请参阅下面的选项位代码。谢谢你。
void configureBoot(){
                 while((FLASH->SR & FLASH_SR_BSY_Msk) == FLASH_SR_BSY_Msk ); // 等待闪存操作忙(设置 BSY)
                 FLASH->KEYR = 0x45670123; // 设置闪存密钥以允许写入 FLASH_CR
                 FLASH->KEYR = 0xCDEF89AB;
                 FLASH->OPTKEYR = 0x08192A3B;// 设置 Flash optkey 允许写入 FLASH_OPTR
                 FLASH->OPTKEYR = 0x4C5D6E7F;
                 FLASH->OPTR &= ~FLASH_OPTR_nSWBOOT0_Msk; //nBoot0_SW 位 0
                 FLASH->OPTR |= FLASH_OPTR_nBOOT1_Msk ; // nBoot1 位 1
                 FLASH->OPTR &= ~FLASH_OPTR_nBOOT0_Msk ;// nBoot0 位 0
                 FLASH->CR |= FLASH_CR_OPTSTRT_Msk; // 设置 OPSTRT
                 while((FLASH->SR & FLASH_SR_BSY_Msk) == FLASH_SR_BSY_Msk ); // 等待闪存操作忙(设置 BSY)
                 FLASH->CR |= FLASH_CR_OBL_LAUNCH_Msk; // 系统复位
}








回帖(1)

尹聪

2023-1-4 10:38:48
使用命令“ob nBOOT0 = 1”解决了这个问题。重新配置闪存选项位允许用户选择在引导时运行的内存位置(主闪存、系统(引导加载程序)或 sRAM)。MCU 需要在编程选项字节后复位以加载它们。输入-ob 命令后,指定内存位置的程序将开始运行。另外,我这里不是在外部驱动 BOOT0 引脚。这一切都是通过软件完成的。
举报

更多回帖

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