我有一些代码通过所谓的从 RDP 级别 1 到级别 0 的“回归”删除了
STM32H75x 上的“安全区域”,这会导致完全擦除。
(实际上这段代码是基于 ST 支持非常友好地提供的示例)
- void EraseAll(void)
- {
- uint32_t flashUserOpt;
- printf("Launching erase all process. Requires RDPL1 already setn");
- __HAL_FLASH_CLEAR_FLAG_BANK1(FLASH_FLAG_ALL_ERRORS_BANK1);
- HAL_FLASH_OB_Unlock();
- FLASH->OPTSR_PRG = 0x13BEAAF0; /* RDP level 0 */
- FLASH->PRAR_PRG1 = 0x80000FFF; /* No PCROP */
- FLASH->SCAR_PRG1 = 0x80000FFF; /* No secure area */
- FLASH->WPSN_PRG1 = 0x000000FF; /* No WRP */
- OBLaunchWithCheck();
- HAL_FLASH_OB_Lock();
- }
- void OBLaunchWithCheck(void)
- {
- HAL_StatusTypeDef error;
- if ((error=HAL_FLASH_OB_Launch()) != HAL_OK)
- {
- printf("HAL_FLASH_OB_Launch failed. HAL_ERROR: %d Error code : %8.8x ...rn", error, pFlash.ErrorCode);
- printf("Flash->SR1: 0x%8.8xrn", FLASH->SR1);
- }
- }
擦除通常 (*) 有效,但在
电源循环后 ST-LINK 实用程序无法访问芯片,显示“删除保护”。
在此状态下,选项字节对话框显示安全位已设置。
然后我清除安全位,保存选项字节,然后 ST-LINK 实用程序重新获得对芯片的完全访问权限,可以读取和编程等。
我的问题是,是否可以跳过 SECURITY 位的重置?
在上面的代码片段的第 9 行中,写入 FLASH_OPTSR_PRG 的值设置了 SECURITY 位 (21)。
应该是这样还是错误?
已经把我所有的廉价 H75x 板库存都用砖砌成砖块,等待新订单。
很抱歉,在更多
电路板到达之前,我不能自己尝试和测试它。
顺便说一句——我的测试板有 H750 修订版 Y。修订版 V 中有什么相关的更改/改进吗?
提前致谢,
-- 帕维尔 A。
(*) 当电路板变砖时,ST-LINK 实用程序可以正确检测到芯片 - 但既不能读取闪存也不能读取选项字节;然后它会断开连接,并且在没有电源循环的情况下无法再次连接。看起来安全区域和/或 RDP1 仍然处于活动状态,但安全区域中的代码已被删除(没有此代码运行的迹象)。