在STM32H7上从RDP级别1回归到0

时间:2019-12-09 14:53:39

标签: stm32 flash-memory

我正在STM32H743(Nucleo板,STM32CubeIDE)上使用RDP电平。

这是我测试过的代码:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART3_UART_Init();

  OBInit.Banks     = FLASH_BANK_1;
  HAL_FLASHEx_OBGetConfig(&OBInit);
  RdpLevel = OBInit.RDPLevel;

  BSP_PB_Init(BUTTON_USER,BUTTON_MODE_GPIO);
  BSP_LED_Init(LED1);

  if ( RdpLevel == OB_RDP_LEVEL_0 )
  {
    // toggle LED1 to show RDP level
    BSP_LED_Toggle(LED1);

    /* Wait for User push-button press before starting the Communication */
    while (BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_SET);

    // program OB
    HAL_FLASH_OB_Unlock();
    HAL_FLASH_Unlock();

    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel   = OB_RDP_LEVEL_1;
    HAL_FLASHEx_OBProgram(&OBInit);

    /* Start the Option Bytes programming process */
    if (HAL_FLASH_OB_Launch() != HAL_OK)
    {
        /* User can add here some code to deal with this error */
        while (1)
        {
            BSP_LED_Toggle(LED1);
            HAL_Delay(200);
        }
    }

  }
  else
  {
        BSP_LED_Toggle(LED2);

      /* Wait for User push-button press before starting the Communication */
        while (BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_SET);


        // program OB
        HAL_FLASH_OB_Unlock();
        HAL_FLASH_Unlock();

        OBInit.OptionType = OPTIONBYTE_RDP;
        OBInit.RDPLevel   = OB_RDP_LEVEL_0;
        HAL_FLASHEx_OBProgram(&OBInit);

        /* Start the Option Bytes programming process */
        if (HAL_FLASH_OB_Launch() != HAL_OK)
        {
            /* User can add here some code to deal with this error */
            while (1)
            {
                BSP_LED_Toggle(LED2);
                HAL_Delay(200);
            }
        }
  }
  while (1)
  {
  }
}

切换到1级可以正常工作。我看到考虑了级别(在下一次重置时,调试器不再起作用)。 LED也显示水平。

但是当我尝试回到0级时,我不确定发生了什么,因为我无法调试:我知道会完全擦除闪存。但是我希望在那之后我能够通过调试器进行连接。但事实并非如此,该软件似乎不再运行。

这段代码有什么问题吗?

编辑:回归后我试图关闭电路板

3 个答案:

答案 0 :(得分:1)

显然是由于勘误表中所述的错误“ 可以通过用户等待状态配置完成选项字节加载”。我将软件中的等待状态数从4更改为7,并解决了该问题。我可以毫无问题地切换回0级。

答案 1 :(得分:0)

答案很简单,并在STM32文档中进行了解释。当您将RDP从1级更改为0级时,需要上电复位。因此,您需要断开电源,然后重新连接。

答案 2 :(得分:0)

我知道这是一篇较旧的帖子,但是......我过去在这方面花了很多时间。如果您将 RDP 正确设置为级别 0,CPU 将擦除所有闪存,将 RDP 级别清零,然后自行复位。但是,如果连接了像 ST-Link 这样的调试器,它将擦除闪存,将 RDP 设置为零级,然后 CPU 将挂起。需要手动重置/电源循环。这在参考手册中的某处记录在内存中。因此,具有自动重置功能的 RDP 程序在没有附加调试器的生产代码中运行良好,我们每天都在使用它。