Jump to content
    

STM32 программное отключение WatchDog

Добрый день!

Работаю с STM32L452VEI. Для экономии энергии перевожу микроконтроллер в Sleep, пробуждаю по нажатию кнопки.

Пока микроконтроллер в Sleep WatchDog "остаётся без присмотра" и раз в пол-секунды пробуждает микроконтроллер. Если при инициализации не включать WatcDog, то всё работает как надо. Есть ли способ программно приостановить WatchDog?

Вот код перевода в Sleep:

HAL_SuspendTick ();

HAL_PWR_DisableSleepOnExit ();

HAL_PWR_EnterSLEEPMode (PWRMAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

// Без WatchDog-а нормально спит и просыпается по кнопке.

HAL_ResumeTick ();

HAL_NVIC_SystemReset ();

Share this post


Link to post
Share on other sites

Читаем мануал:

36.3.4 Low-power freeze
Depending on the IWDG_STOP and IWDG_STBY options configuration, the IWDG can
continue counting or not during the Stop mode and the Standby mode, respectively. If the
IWDG is kept running during Stop or Standby modes, it can wake up the device from this
mode. Refer to Section : User and read protection option bytes for more details.

Share this post


Link to post
Share on other sites

On 2/1/2024 at 2:33 PM, JohnKorsh said:

Есть ли способ программно приостановить WatchDog?

В этом случае лучше сразу не использовать сторожевой таймер. Хотя бы не будет иллюзии надёжного устройства.

Share this post


Link to post
Share on other sites

Добрый день!

Нет, думаю, надо сделать.

Не поможет ли кто в следующей проблеме?

Как и должно быть WatchDog на время Sleep отключается сложно. Есть область Flash из пяти значений. При включении микроконтроллера данные из этой области загружаются во внутренние регистры, недоступные пользователю. Также эти данные загружаются в регистры, доступные пользователю по фиксированному навсегда паролю. Эти регистры (5 штук) можно модифицировать также по фиксированному навсегда паролю и по специальной команде все пять записываются в FLASH. Результат должен быть виден только при следующей перезагрузке микроконтроллера.

Я написал функцию, но она не работает, не подскажет ли кто, чего я недопонял ? (При отладке этой функции WatchDog не включал.)

Spoiler
//  
// IWDG set to stop in Sleep mode.
//***************************************************************   
//    
// !!! Do not use - under development.
//    
// FLASH OPTION cells status before the correction.
// (The values are equal of the corresponding registers).
// Some value are different from the DataSheet.    
//  (RM0394 Reference manual, p. 85)    
//   Name              Addr               Value.                   Default
//   OPTR                0x1FFF7800    0xFFFFF8AA    -   0xFFFEFF8AA
//   PCPROP1SR      0x1FFF7808    0xFFFFFFFF    +   0xFFFFFFFF 
//   PCPROP1ER      0x1FFF7810    0x7FFF0000      -   0x00000000
//   WRP1AR           0x1FFF7818    0xFF00FFFF     -   0x000000FF
//   WRP1BR           0x1FFF7820    0xFF00FFFF     -   0x000000FF
// The HAL function HAL_FLASH_OB_Launch rewrite all of the registers to the FLASH.
// My function set to 0 only two bytes of the FLASH->OPTR register.
// Bit 18 IWDG_STDBY: Independent watchdog counter freeze in Standby mode
//            0: Independent watchdog counter is frozen in Standby mode
//            1: Independent watchdog counter is running in Standby mode
// Bit 17 IWDG_STOP: Independent watchdog counter freeze in Stop mode
//            0: Independent watchdog counter is frozen in Stop mode
//            1: Independent watchdog counter is running in Stop mode    
//     
 void Set_IWDG_Sleep_Stop (void)
  {
//
// Check of the current bytes status.
//        
     if ((ReadFlash(0x1FFF7800, uint32_t) & 0x00060000) == 0)    
     {
       return;                                                  // Если нужные биты сброшены, то ничего не делаем.
     }
//
// Set of the IWDG Stop during of the Sleep Mode.
//
   FLASH_Stat = HAL_FLASH_Unlock ();          // Разрешаем запись в  FLASH.
   FLASH_Stat = HAL_FLASH_OB_Unlock ();    // Разрешаем изменения в регистрах, управляющих работой WatchDOg в режиме Sleep.
//
   FLASH->OPTR &= 0xFFF9FFFF;                    // FLASH->OPTR устанавливается в 0x FFF9F8AA. В регистр FLASH->OPTR данные записываются.      
   FLASH_Stat = HAL_FLASH_OB_Launch ();    // Запись во FLASH - после этой строки Debug прерывается, непрерывная перезагрузка микроконтроллера.    

                                                                    // При следующем включении микроконтроллера FLASH->OPTR читается как 0xFFFFF8AA, то есть, данные не записываются.
//        
   FLASH_Stat = HAL_FLASH_OB_Lock ();       // До этой точки программа не доходит.
   FLASH_Stat = HAL_FLASH_Lock ();
 }

 

Edited by haker_fox
Для оформления кода есть кнопка <>. Длинный код прячется под спойлер.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...