设置 PCROP STM32H7 (STM32H743) 时出现错误
I get an Error when setting PCROP STM32H7 (STM32H743)
目标
我正在尝试在我的 STM32H743VI 微控制器上设置 PCROP 区域,但在执行 [ 时收到错误代码 HAL_FLASH_ERROR_OB_CHANGEHAL_FLASH_OB_Launch() 并且我的 PCROP 区域没有设置。
我使用的代码的相关部分应该是以下部分
我的代码
#include "stm32h7xx_hal.h"
FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASHEx_OBGetConfig(&OBInit);
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
// program OB
OBInit.OptionType = OPTIONBYTE_PCROP;
OBInit.PCROPStartAddr = 0x8030000;
OBInit.PCROPEndAddr = 0x8031000;
OBInit.PCROPConfig = OB_PCROP_RDP_ERASE;
OBInit.Banks = FLASH_BANK_1; // (1, 2 oder BOTH)
HAL_FLASHEx_OBProgram(&OBInit);
/* write Option Bytes */
if (HAL_FLASH_OB_Launch() != HAL_OK) {
// Error handling
while (1)
{
}
}
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
该代码的灵感主要来自 youtube 视频“Security Part3 - STM32 Security features - 07 - PCROP lab”(来自 STMicroelectronics)和我必须更改 RDP 级别的工作代码。
设置
我的秘密函数在预期的地址范围内,我通过在 Flash.Id 文件
中添加内存区域来做到这一点
MEMORY
{
[...]
PCROP (x) : ORIGIN = 0x08030000, LENGTH = 16K
}
并将函数文件放入相应的部分
SECTIONS
{
[...]
.PCROPed :
{
. = ALIGN(4);
*led_blinking.o (.text .text*)
. = ALIGN(4);
} > PCROP
[...]
}
我为保存我的秘密函数的文件设置了标志 -mslow-flash-data。我这样做并没有真正理解为什么,按照教程视频(见上文)。
我试过的
我用我的 J-Trace 调试器调试了我的程序,似乎我正在执行选项字节修改序列 STM32H743/753 参考手册中描述的(p . 159) 成功.
保护整个 Flashpage(开始 0x080020000,结束 0x0803FFFF)也没有用,尽管我没想到它会有所作为。
我还尝试了 PCROPConfig 的另一个选项,即 OB_PCROP_RDP_NOT_ERASE 选项。
HAL_FLASHEx_OBProgram(&OBInit) 按预期工作并且 ObInit 配置正确设置到 _FLASH->PRAR_PRG1 注册。对于我的代码,寄存器的内容是 0x80880080
我确实断开并重新连接了微控制器与电源和调试器的连接,以防我没有正确 POR。
我检查了勘误表 sheet,但没有适用于我的问题的勘误表。
编辑
我在我的代码部分更改了受PCROP保护的区域。
我这样做了,因为我的代码通常可以正常运行,而且我发现在第一个 Flash 页面中保护一个区域并不是一个好主意!
嗯,到目前为止代码看起来还不错。
您确定在重新设置 PCROP 之前禁用它吗?
检查 PRAR_CUR1 是否未从其他地方设置。尽管已设置,但 PCROP 在尝试设置时将引发失败。
目标
我正在尝试在我的 STM32H743VI 微控制器上设置 PCROP 区域,但在执行 [ 时收到错误代码 HAL_FLASH_ERROR_OB_CHANGEHAL_FLASH_OB_Launch() 并且我的 PCROP 区域没有设置。
我使用的代码的相关部分应该是以下部分
我的代码
#include "stm32h7xx_hal.h"
FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASHEx_OBGetConfig(&OBInit);
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
// program OB
OBInit.OptionType = OPTIONBYTE_PCROP;
OBInit.PCROPStartAddr = 0x8030000;
OBInit.PCROPEndAddr = 0x8031000;
OBInit.PCROPConfig = OB_PCROP_RDP_ERASE;
OBInit.Banks = FLASH_BANK_1; // (1, 2 oder BOTH)
HAL_FLASHEx_OBProgram(&OBInit);
/* write Option Bytes */
if (HAL_FLASH_OB_Launch() != HAL_OK) {
// Error handling
while (1)
{
}
}
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
该代码的灵感主要来自 youtube 视频“Security Part3 - STM32 Security features - 07 - PCROP lab”(来自 STMicroelectronics)和我必须更改 RDP 级别的工作代码。
设置
我的秘密函数在预期的地址范围内,我通过在 Flash.Id 文件
中添加内存区域来做到这一点MEMORY
{
[...]
PCROP (x) : ORIGIN = 0x08030000, LENGTH = 16K
}
并将函数文件放入相应的部分
SECTIONS
{
[...]
.PCROPed :
{
. = ALIGN(4);
*led_blinking.o (.text .text*)
. = ALIGN(4);
} > PCROP
[...]
}
我为保存我的秘密函数的文件设置了标志 -mslow-flash-data。我这样做并没有真正理解为什么,按照教程视频(见上文)。
我试过的
我用我的 J-Trace 调试器调试了我的程序,似乎我正在执行选项字节修改序列 STM32H743/753 参考手册中描述的(p . 159) 成功.
保护整个 Flashpage(开始 0x080020000,结束 0x0803FFFF)也没有用,尽管我没想到它会有所作为。
我还尝试了 PCROPConfig 的另一个选项,即 OB_PCROP_RDP_NOT_ERASE 选项。
HAL_FLASHEx_OBProgram(&OBInit) 按预期工作并且 ObInit 配置正确设置到 _FLASH->PRAR_PRG1 注册。对于我的代码,寄存器的内容是 0x80880080
我确实断开并重新连接了微控制器与电源和调试器的连接,以防我没有正确 POR。
我检查了勘误表 sheet,但没有适用于我的问题的勘误表。
编辑
我在我的代码部分更改了受PCROP保护的区域。 我这样做了,因为我的代码通常可以正常运行,而且我发现在第一个 Flash 页面中保护一个区域并不是一个好主意!
嗯,到目前为止代码看起来还不错。
您确定在重新设置 PCROP 之前禁用它吗?
检查 PRAR_CUR1 是否未从其他地方设置。尽管已设置,但 PCROP 在尝试设置时将引发失败。