Skip to main content
Graduate
March 18, 2025
Question

Why is the DBP bit not set to '1'

  • March 18, 2025
  • 1 reply
  • 523 views

Hello,

 

I designed a similar board using STM32H743ZIT6 and STM32H743VIT6. (Rev. V)

The board works fine normally.

It has been in production for 3 years already.

 

Boards that have already been produced and shipped sometimes become unusable. (since a few months ago)

We retrieved the board and debugged it.

 

In the code below, it stays in Error_Handle() due to Time Out.

 

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

 /** Supply configuration update enable
 */
 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
 /** Configure the main internal regulator output voltage
 */
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

 /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
 __HAL_RCC_D2SRAM3_CLK_ENABLE();

 /** Macro to configure the PLL clock source
 */
 HAL_PWR_EnableBkUpAccess();
 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
 /** Macro to configure the PLL clock source
 */
 __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
 /** Initializes the RCC Oscillators according to the specified parameters
 * in the RCC_OscInitTypeDef structure.
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.LSIState = RCC_LSI_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLM = 5;
 RCC_OscInitStruct.PLL.PLLN = 160;
 RCC_OscInitStruct.PLL.PLLP = 2;
 RCC_OscInitStruct.PLL.PLLQ = 20;
 RCC_OscInitStruct.PLL.PLLR = 8;
 RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
 RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
 RCC_OscInitStruct.PLL.PLLFRACN = 0;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB buses clocks
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
 {
 Error_Handler();
 }
 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART3
 |RCC_PERIPHCLK_LPUART1|RCC_PERIPHCLK_USART2
 |RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_UART7
 |RCC_PERIPHCLK_USART6|RCC_PERIPHCLK_FDCAN
 |RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_UART8
 |RCC_PERIPHCLK_UART5|RCC_PERIPHCLK_SDMMC
 |RCC_PERIPHCLK_USB;
 PeriphClkInitStruct.PLL3.PLL3M = 25;
 PeriphClkInitStruct.PLL3.PLL3N = 192;
 PeriphClkInitStruct.PLL3.PLL3P = 2;
 PeriphClkInitStruct.PLL3.PLL3Q = 4;
 PeriphClkInitStruct.PLL3.PLL3R = 2;
 PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
 PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
 PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
 PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL;
 PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL;
 PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
 PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;
 PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
 /** Enable USB Voltage detector
 */
 HAL_PWREx_EnableUSBVoltageDetector();
}

 

 

it call HAL_RCC_OscConfig() in SystemClock_Config() above.

And a timeout occurs in the part where DBP is set to 1 for LSE initialization.

 

__weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
{
 uint32_t tickstart;
 uint32_t temp1_pllckcfg, temp2_pllckcfg;

 /* Check Null pointer */
 if(RCC_OscInitStruct == NULL)
 {
 return HAL_ERROR;
 }

 /* Check the parameters */
 assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));
 /*------------------------------- HSE Configuration ------------------------*/
 if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
 {
 /* Check the parameters */
 assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));

 const uint32_t temp_sysclksrc=__HAL_RCC_GET_SYSCLK_SOURCE();
 const uint32_t temp_pllckselr = RCC->PLLCKSELR;
 /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */
 if((temp_sysclksrc== RCC_CFGR_SWS_HSE) || ((temp_sysclksrc== RCC_CFGR_SWS_PLL1) && ((temp_pllckselr & RCC_PLLCKSELR_PLLSRC) == RCC_PLLCKSELR_PLLSRC_HSE)))
 {
 if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
 {
 return HAL_ERROR;
 }
 }
 else
 {
 /* Set the new HSE configuration ---------------------------------------*/
 __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);

 /* Check the HSE State */
 if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
 {
 /* Get Start Tick*/
 tickstart = HAL_GetTick();

 /* Wait till HSE is ready */
 while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == 0U)
 {
 if((uint32_t) (HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
 {
 return HAL_TIMEOUT;
 }
 }
 }
 else
 {
 /* Get Start Tick*/
 tickstart = HAL_GetTick();

 /* Wait till HSE is disabled */
 while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != 0U)
 {
 if((uint32_t) (HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
 {
 return HAL_TIMEOUT;
 }
 }
 }
 }
 }

 // ... //

 /*------------------------------ LSE Configuration -------------------------*/
 if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
 {
 /* Check the parameters */
 assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));

 /* Enable write access to Backup domain */
 PWR->CR1 |= PWR_CR1_DBP;

 /* Wait for Backup domain Write protection disable */
 tickstart = HAL_GetTick();

 while((PWR->CR1 & PWR_CR1_DBP) == 0U)
 {
 if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE)
 {
 return HAL_TIMEOUT;
 }
 }

 /* Set the new LSE configuration -----------------------------------------*/
 __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
 /* Check the LSE State */
 if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF)
 {
 /* Get Start Tick*/
 tickstart = HAL_GetTick();

 /* Wait till LSE is ready */
 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == 0U)
 {
 if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
 {
 return HAL_TIMEOUT;
 }
 }
 }
 else
 {
 /* Get Start Tick*/
 tickstart = HAL_GetTick();

 /* Wait till LSE is disabled */
 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != 0U)
 {
 if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)
 {
 return HAL_TIMEOUT;
 }
 }
 }
 }
}

 

 

In other words, the timeout occurs where DBP is set to 1 in PWR_CR1 and waits.

 

 /* Enable write access to Backup domain */
 PWR->CR1 |= PWR_CR1_DBP;

 /* Wait for Backup domain Write protection disable */
 tickstart = HAL_GetTick();

 while((PWR->CR1 & PWR_CR1_DBP) == 0U)
 {
 if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE)
 {
 return HAL_TIMEOUT;
 }
 }

 

I am curious as to why there's a timeout here, and why it waits here unlike other codes?

 

By any chance, does this happen when DBP is already 1 and I set it back to 1?

 

Finally, this symptom goes away then the battery is removed from VBAT.

 

Thank you for reading this article.

    This topic has been closed for replies.

    1 reply

    Technical Moderator
    March 18, 2025

    Dear @JongOk Baek ,

     

    As the board was running for 3 Years and only recently this behavior is observed,  also 
    the symptom goes away when the battery is removed from VBAT.  it might be an issue with the power supply ( VBAT)  or the state of the backup domain, it might lead to unexpected behavior.   if possible, to share your schematics and also check between a working board and non-working board the status of VBAT pin / Back up domain registers and flags set/reset ?  

     

    Hope it helps you.

    STOne-32.

    Graduate
    March 18, 2025

    Dear STOne-32,

    Thanks for your reply.

    First of all, there is an expression of misunderstanding.

    It has been n production for 3 years, and occurs in recently produced board.

     

    These symptoms do not appear easily.

     

    So, I don't have the error board.

     

    I want to comment out the waiting code.

     /* Wait for Backup domain Write protection disable */
     tickstart = HAL_GetTick();
    
     while((PWR->CR1 & PWR_CR1_DBP) == 0U)
     {
     if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE)
     {
     return HAL_TIMEOUT;
     }
     }

    Without this part, it seems possible to proceed next.

    Because, the other code does not wait in SystemClock_Config() function.

     /** Macro to configure the PLL clock source
     */
     HAL_PWR_EnableBkUpAccess();
     __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

     

    It seems like it won't go into an infinite loop because of the Error_Handle().

     

    Best regards,

    JongOk, Baek