cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F405 - Backup SRAM not preserved

Scott_DeltaDev
Associate II

I have a STM32F405 with a coin cell on VBAT and I haven't been able to get the Backup SRAM or RTC to preserve contents when removing main power.  The same code works fine on another board that has a STM32F407.

 

//Works on STM32F407 - Fails on STM32F405

backup_SRAM_data_t* backup_SRAM_data_ptr = (backup_SRAM_data_t*)BKPSRAM_BASE;

//Enable backup SRAM
__HAL_RCC_BKPSRAM_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
HAL_PWREx_EnableBkUpReg();

printf("[%u] Read = %u\n", (unsigned int)HAL_GetTick(), (unsigned int)backup_SRAM_data_ptr->test_var);
backup_SRAM_data_ptr->test_var = 7;
printf("[%u] Write = %u\n", (unsigned int)HAL_GetTick(), (unsigned int)backup_SRAM_data_ptr->test_var);
printf("[%u] Read = %u\n", (unsigned int)HAL_GetTick(), (unsigned int)backup_SRAM_data_ptr->test_var);

 

 

Adding an enable of the PWR clock doesn't fix it - that's already done in SystemClock_Config(), which is called earlier in the code.

 

//Still fails on STM32F405

//Enable backup SRAM
__HAL_RCC_PWR_CLK_ENABLE();       //Enable PWR clock
HAL_PWR_EnableBkUpAccess();       //Enable access to backup domain
__HAL_RCC_BKPSRAM_CLK_ENABLE();   //Enable backup SRAM clock       
HAL_PWREx_EnableBkUpReg();        //Enable backup SRAM low power regulator

 

 

A 3V (~3.3V fully charged) coin cell is directly connected to the VBAT pin.  The STM32F405 is the 64-pin package, so there's no PDR_ON pin.  The working STM32F407 is the 100 pin package.  There's an external 32.768kHz XTL and LSE is enabled.  The only obvious difference between the two boards is that the working F407 has a 25MHz XTL used for HSE and the F405 uses the internal 16MHz HSI.

Any thoughts on why VBAT isn't preserving SRAM?  Please let me know if there's any additional info or debugging steps I can provide that would be useful.

 

 

//Autogenerated by CubeMX - STM32F405

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

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** 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_LSE;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  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_HSI;
  RCC_OscInitStruct.PLL.PLLM = 16;
  RCC_OscInitStruct.PLL.PLLN = 128;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}
//Auto-generated by CubeMX - STM32F407

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

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
                              |RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 320;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV8;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

 

10 REPLIES 10

Jan,

You were right about VDDA != VDD causing the issue.  Thanks for the help!

I removed the +3.0V regulator and shorted VDDA to VDD (+3.3V) and now Vbat is preserving backup SRAM as expected.