I get an Error when setting PCROP STM32H7 (STM32H743)

641 views Asked by At

Goal

I'm trying to set a PCROP area on my STM32H743VI microcontroller, but I'm getting the error code HAL_FLASH_ERROR_OB_CHANGE when executing HAL_FLASH_OB_Launch() and my PCROP area is not set.

The relevant part of the code I'm using should be the following sections

My code

    #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();

The code is mostly inspired by the youtube video "Security Part3 - STM32 Security features - 07 - PCROP lab" (by STMicroelectronics) and the working code I have to change RDP level.

Setup

My secret function is in the expected address range, I did that by adding the memory area in the Flash.Id File

MEMORY
{
    [...]
    PCROP   (x)     : ORIGIN = 0x08030000,  LENGTH = 16K
}

and putting the function file into the section accordingly

SECTIONS
{
    [...]
    .PCROPed :
    {
        . = ALIGN(4);
        *led_blinking.o (.text .text*)
        . = ALIGN(4);
    } > PCROP
    [...]
}

I set the flag -mslow-flash-data for the file I'm keeping my secret function in. I did this without really understanding why, following the tutorial in the video (see above).

What I tried

I debugged my program with my J-Trace Debugger and it seems like I'm doing the Option byte modification sequence described in the STM32H743/753 reference manual (p. 159) succesfully.

Securing an entire Flashpage (start 0x080020000, end 0x0803FFFF) didn't work either, even though I did not expect it to make a difference.

I also tried the other option for PCROPConfig, namely the OB_PCROP_RDP_NOT_ERASE option.

HAL_FLASHEx_OBProgram(&OBInit) works as intended and the ObInit Configuration is set correctly into the _FLASH->PRAR_PRG1 register. For my code the content of the register is 0x80880080

I did disconnect and reconnect the microcontroller from power and debugger in case I did not POR correctly.

I checked the errata sheet, but there is no errata which would be applicable to my problem.

EDIT

I changed the area which is protected by PCROP in the My code section. I did this, since my code is generally functional and I found out it's not a good idea to protect an area in the first flash page!

1

There are 1 answers

0
Daimonion On BEST ANSWER

Hmm, the code looks good so far.

Are you sure PCROP is disabled before setting it again?

Check if PRAR_CUR1 is not set from somewhere else. PCROP will raise a failure when trying to set although it is set.