我正在使用
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; // 系统复位
}