目标
我试图在我的STM32H743VI微控制器上设置一个PCROP区域,但是在执行HAL_FLASH_OB_Launch()时,我得到了错误代码HAL_FLASH_ERROR_OB_CHANGE,并且没有设置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视频“安全Part3 - STM32安全特性- 07 - PCROP实验室”(由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-跟踪调试器调试了我的程序,似乎我正在成功地执行STM32H743/753参考手册(第159页)中描述的选项字节修改序列。
保护整个Flashpage (start 0x080020000,end 0x0803FFFF)也不起作用,尽管我并不认为它会产生影响。
我还尝试了PCROPConfig的另一个选项,即OB_PCROP_RDP_NOT_ERASE选项。
HAL_FLASHEx_OBProgram(& ObInit )按预期工作,ObInit配置被正确地设置为_FLASH->PRAR_PRG1 1寄存器。对于我的代码,寄存器的内容是0x80880080。
我确实断开和重新连接的微控制器从电源和调试器,以防止我没有正确的POR。
我检查了勘误表,但没有一个勘误表适用于我的问题。
编辑
我在“我的代码”部分更改了PCROP保护的区域。我这样做了,因为我的代码通常是功能性的,我发现保护第一个flash页面中的区域不是个好主意!
发布于 2022-03-18 14:20:37
嗯,到目前为止代码看起来还不错。
确定在再次设置PCROP之前已禁用PCROP吗?
检查是否从其他地方设置了PRAR_CUR1。尽管设置了PCROP,但在尝试设置时,PCROP将引发失败。
https://stackoverflow.com/questions/71509895
复制相似问题