首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在STM32H7上从RDP级别1到0的回归

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

Stack Overflow用户
提问于 2019-12-09 14:53:39
回答 3查看 2.2K关注 0票数 0

我正在使用STM32H743 (核心板,STM32CubeIDE)上的RDP级别。

下面是我测试过的代码:

代码语言:javascript
运行
复制
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级时,我不知道发生了什么,因为我无法调试:我知道闪存的全部擦除发生了。但我希望在那之后我能够通过调试器进行连接。但事实并非如此,软件似乎不再运行了。

这段代码有什么问题吗?

编辑:在回归之后,我试图关闭董事会。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-10 14:20:24

显然,这是由于勘误表中描述的错误“选项字节加载可以通过用户等待状态配置完成”。我将软件中的等待状态号从4改为7,它解决了这个问题。我可以切换到0级,没有问题。

票数 2
EN

Stack Overflow用户

发布于 2019-12-09 16:28:00

答案非常简单,并在STM32文档中进行了解释。当您将RDP从1级更改为0级时,需要重置电源。所以你需要切断电源,然后再连接它。

票数 0
EN

Stack Overflow用户

发布于 2021-02-08 21:06:51

我知道这是个老职位但是..。我过去在这件事上花了不少时间。如果您正确地将RDP设置为0级,CPU将擦除所有闪存,将RDP级别清除为零,然后重新设置自身。但是,如果像ST-Link这样的调试器被连接,它将擦除闪存,将RDP设置为零,那么CPU就会挂起。需要手动复位/电源循环。这是记录在参考手册某处的内存。因此,在没有附加调试器的生产代码中,带有自动重置的RDP过程可以很好地工作,我们每天都使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59251368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档