在 STM32H7 上从 RDP 级别 1 回归到 0
Regression from RDP Level 1 to 0 on STM32H7
我正在 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 级时,我不确定发生了什么,因为我无法调试:我知道闪存会被完全擦除。但我希望在那之后我能够通过调试器进行连接。但事实并非如此,该软件似乎不再 运行。
这段代码有什么问题吗?
编辑:回归后我试图关闭电路板
答案很简单,在 STM32 文档中有解释。当您将 RDP 从级别 1 更改为级别 0 时,需要进行开机重置。所以你需要断开电源,然后重新连接。
显然这是由于勘误表 sheet“选项字节加载可以通过用户等待状态配置”中描述的错误造成的。我将软件中的等待状态数从 4 更改为 7,并解决了这个问题。我可以毫无问题地切换回 Level 0。
我知道这是一个较旧的 post 但是...我过去在这上面花了很多时间。如果您将 RDP 正确设置为 0 级,CPU 将擦除所有闪存,将 RDP 级别清除为零,然后自行重置。但是,如果连接了像 ST-Link 这样的调试器,它将擦除闪存,将 RDP 设置为零级,然后 CPU 将挂起。需要手动 reset/power 循环。这在内存中某处的参考手册中有记录。因此,具有自动重置功能的 RDP 程序在没有附加调试器的生产代码中工作正常,我们每天都在使用它。
我正在 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 级时,我不确定发生了什么,因为我无法调试:我知道闪存会被完全擦除。但我希望在那之后我能够通过调试器进行连接。但事实并非如此,该软件似乎不再 运行。
这段代码有什么问题吗?
编辑:回归后我试图关闭电路板
答案很简单,在 STM32 文档中有解释。当您将 RDP 从级别 1 更改为级别 0 时,需要进行开机重置。所以你需要断开电源,然后重新连接。
显然这是由于勘误表 sheet“选项字节加载可以通过用户等待状态配置”中描述的错误造成的。我将软件中的等待状态数从 4 更改为 7,并解决了这个问题。我可以毫无问题地切换回 Level 0。
我知道这是一个较旧的 post 但是...我过去在这上面花了很多时间。如果您将 RDP 正确设置为 0 级,CPU 将擦除所有闪存,将 RDP 级别清除为零,然后自行重置。但是,如果连接了像 ST-Link 这样的调试器,它将擦除闪存,将 RDP 设置为零级,然后 CPU 将挂起。需要手动 reset/power 循环。这在内存中某处的参考手册中有记录。因此,具有自动重置功能的 RDP 程序在没有附加调试器的生产代码中工作正常,我们每天都在使用它。