Перейти к содержанию
    

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 ();

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

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

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

Как и должно быть 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 ();
 }

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...