poniedziałek, 27 lipca 2020

[42] STM32F4 - Brownout Reset

W tym poście chciałbym opisać uruchomienie oraz sposób działania układu BOR w mikrokontrolerach STM32.

[Źródło: http://www.st.com/en/evaluation-tools/stm32f4discovery.html]

Brownout Reset (BOR):

Układ ten pozwala na utrzymanie mikrokontrolera w stanie resetu, aż nie pojawi się napięcie wyższe od zadanego progu. Dodatkowo pozwala on na programowanie progu zadziałania. Dostępne są trzy granice do ustawienia:

  • VBOR3
  • VBOR2
  • VBOR1

Konfiguracja układu dostępna jest przez modyfikację tzw. Option Bytes.

Tutaj w przypadku modyfikacji wartości umieszczonych w tych bitach należy pamiętać, że modyfikacja bitów RDP a dokładniej ustawienia ich na Level 2. Gdy ten poziom zabezpieczeń zostanie ustawiony nie ma możliwości aby został on zmniejszony ([1] str. 93).

Dane wprowadzane są do rejestru FLASH_OPTCR (Flash option control register):


Dane do modyfikacji rejestrów umieszczone są w strukturze FLASH_OBProgramInitTypeDef (stm32f4xx_hal_flash_ex.h). 

  1. typedef struct
  2. {
  3.   uint32_t OptionType;   /*!< Option byte to be configured.
  4.                               This parameter can be a value of @ref FLASHEx_Option_Type */
  5.   uint32_t WRPState;     /*!< Write protection activation or deactivation.
  6.                               This parameter can be a value of @ref FLASHEx_WRP_State */
  7.   uint32_t WRPSector;         /*!< Specifies the sector(s) to be write protected.
  8.                               The value of this parameter depend on device used within the same series */
  9.   uint32_t Banks;        /*!< Select banks for WRP activation/deactivation of all sectors.
  10.                               This parameter must be a value of @ref FLASHEx_Banks */        
  11.   uint32_t RDPLevel;     /*!< Set the read protection level.
  12.                               This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */
  13.   uint32_t BORLevel;     /*!< Set the BOR Level.
  14.                               This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */
  15.   uint8_t  USERConfig;   /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */
  16. } FLASH_OBProgramInitTypeDef;

Odczytanie ustawionego poziomu BOR można wykonać za pomocą funkcji.

  1. void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)
  2. {
  3.   pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_BOR;
  4.   /*Get WRP*/
  5.   pOBInit->WRPSector = (uint32_t)FLASH_OB_GetWRP();
  6.   /*Get RDP Level*/
  7.   pOBInit->RDPLevel = (uint32_t)FLASH_OB_GetRDP();
  8.   /*Get USER*/
  9.   pOBInit->USERConfig = (uint8_t)FLASH_OB_GetUser();
  10.   /*Get BOR Level*/
  11.   pOBInit->BORLevel = (uint32_t)FLASH_OB_GetBOR();
  12. }

Funkcja w bibliotece pozwalająca na modyfikacje aktualnego poziomu BOR.

  1. BOR_Result_t BOR_SetLevel(BOR_Level_t BORNewLevelValue)
  2. {
  3.   HAL_StatusTypeDef status;
  4.   FLASH_OBProgramInitTypeDef FLASH_OBProgramHandle;
  5.   HAL_FLASHEx_OBGetConfig(&FLASH_OBProgramHandle);
  6.   BOR_Level_t BorSetLevelValue = (BOR_Level_t)FLASH_OBProgramHandle.BORLevel;
  7.   if (BorSetLevelValue != BORNewLevelValue)
  8.   {
  9.     FLASH_OBProgramHandle.BORLevel = (uint32_t)BORNewLevelValue;
  10.     FLASH_OBProgramHandle.OptionType = OPTIONBYTE_BOR;
  11.     HAL_FLASH_OB_Unlock(); 
  12.     HAL_FLASHEx_OBProgram(&FLASH_OBProgramHandle);
  13.     status = HAL_FLASH_OB_Launch();
  14.     HAL_FLASH_OB_Lock();   
  15.     if (status != HAL_OK) {
  16.       return BOR_Result_Error;
  17.     }
  18.   }
  19.   return BOR_Result_Ok;
  20. }

Na samym początku następuje sprawdzenie aktualnego poziomu BOR. Jeśli jest on inny niż nowa wprowadzana wartość. To następuje wprowadzenie danych do zmiennej w typie struktury FLASH_OBProgramInitTypeDef. Następnie w celu modyfikacji opisanych danych należy odblokować modyfikacje danych w rejestrze. Dalej dane zostają modyfikowane i ustawione. Ostatnim elementem jest ponowne zablokowanie bitów operacji. 

Dokumentacja: