1. 问题背景客户使用 NUCLEO-U385RG-Q 开发板调试例程 NUCLEO-U385RGQ\Examples\FLASH\FLASH_EraseProgram,FLASH 可以正常擦除,此时主频为 96MHz。客户为了控制功耗,将 MSIS Source 时钟频率改为 24MHZ,SYSCLK 为 12MHz 时,做Flash 擦写操作,擦除 Flash 的时候报错,error code=128,解析为 Programmingsequence error 错误。需要寻找问题的原因。
2. 复现问题找到 STM32U3 CUBE 包中的例程,修改时钟树配置重新生成代码,烧录到 MCU 中。通过调试,可以看到擦除 Flash 报错 error code 为 128,查看 Flash_SR 寄存器,可以看到PGSERR 置 1。复现了客户的问题。
3. 分析问题
找到了错误代码和错误标志,分析产生 PGSERR 的原因。在 RM0487 Rev 17.3.8 Flash memory errors flags 中错误产生条件的描述中。产生PGSERR 的条件如下图所示:
错误状态寄存器如下图所示:
依次对比各个条件。只有 An erase, program, or option-byte programming (OPTSTRT)operation is launched while voltage range is set to range 2.这一条比较符合。对于 Flash 的擦写时序,第一步都是需要检查 voltage range 是否是 range 1,也就是说Flash 的擦写需要在 range 1 下进行。以 Mass erase 为例,其时序如下图所示:
将有问题的代码和例程对比,可以看到例程中的 voltage range 设置为 range1,而修改过后有问题的代码的配置为 range2。如下所示:
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2) != HAL_OK)
- {
- Error_Handler();
- }
- /** Configure the main internal regulator output voltage
- */
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK
- {
- Error_Handler();
- }
- /** Enable Epod Booster
- */
- if (HAL_RCCEx_EpodBoosterClkConfig(RCC_EPODBOOSTER_SOURCE_MSIS,
- RCC_EPODBOOSTER_DIV1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_PWREx_EnableEpodBooster() != HAL_OK)
- {
- Error_Handler();
- }
- /** Configure the main internal regulator output voltage
- */
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2) != HAL_OK)
- {
- Error_Handler();
- }
|