JohnKorsh 1 1 февраля Опубликовано 1 февраля · Жалоба Добрый день! Работаю с 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 (); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 1 февраля Опубликовано 1 февраля · Жалоба Читаем мануал: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 1 февраля Опубликовано 1 февраля · Жалоба Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 5 февраля Опубликовано 5 февраля · Жалоба On 2/1/2024 at 2:33 PM, JohnKorsh said: Есть ли способ программно приостановить WatchDog? В этом случае лучше сразу не использовать сторожевой таймер. Хотя бы не будет иллюзии надёжного устройства. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
JohnKorsh 1 8 февраля Опубликовано 8 февраля (изменено) · Жалоба Добрый день! Нет, думаю, надо сделать. Не поможет ли кто в следующей проблеме? Как и должно быть 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 (); } Изменено 8 февраля пользователем haker_fox Для оформления кода есть кнопка <>. Длинный код прячется под спойлер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться