设置 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 在尝试设置时将引发失败。