W tym poście chciałbym przedstawić sposób generacji projektu z obsługą IWDG za pomocą środowiska CubeMx oraz SystemWorkbench.
CubeMx:
Przedstawię dwie konfiguracje IWDG, pierwsza z nich wymaga odświeżania w pętli głównej bądź w przerwaniu od timera. Druga natomiast będzie dotyczyła WWDG, którego odświeżanie nastąpi w przerwaniu.
IWDG:
Uruchomienie układu IWDG:
Ustawienia Watchdoga wyglądają następująco:
Jego taktowanie odbywa się z zegara 32kHz. W przypadku zastosowanie dzielnika o wartości 32 uzyska się 1kHz. Co oznacza, że dla takich ustawień watchdog się przepełni po upływie 2000ms.
WWDG:
Włączenie okienkowego watchdoga:
Ustawienia:
Kolejnym ważnym elementem jest włączenie przerwań:
Dzięki nim odświeżanie nastąpi podczas obsługi przerwania a nie w czasie normalnego wykonywania programu w pętli głównej.
Mikrokontroler ustawiłem z maksymalną szybkością taktowania, która pozwala na uzyskanie 54MHz na APB1 (PCLK1).
Obliczanie taktowania dla dzielnika 8 wygląda następująco (54MHz/4096)/4 = 3296 [Hz] czyli 1/3296 [Hz] = 304 [us]
Oznacza to że licznik zostanie przeładowany po czasie: 304 * (127 - 64) = 19 [ms]
Mikrokontroler ustawiłem z maksymalną szybkością taktowania, która pozwala na uzyskanie 54MHz na APB1 (PCLK1).
Obliczanie taktowania dla dzielnika 8 wygląda następująco (54MHz/4096)/4 = 3296 [Hz] czyli 1/3296 [Hz] = 304 [us]
Oznacza to że licznik zostanie przeładowany po czasie: 304 * (127 - 64) = 19 [ms]
Programowanie:
Watchdog wewnętrzny uruchamia się za pomocą następującej instrukcji:
- HAL_IWDG_Start(&hiwdg);
Po uruchomieniu należy pamiętać o jego odświeżaniu w pętli głównej lub w przerwaniach od licznika. Tutaj należy tylko pamiętać aby przerwanie następowało szybciej niż przepełnienie licznika od watchdoga.
- HAL_IWDG_Refresh(&hiwdg);
- HAL_WWDG_Start_IT(&hwwdg)
Procedura obsługi przerwania wygląda następująco:
- void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
- {
- HAL_WWDG_Refresh(hwwdg, 127);
- }
- /* USER CODE END 4 */