środa, 28 czerwca 2017

[14] STM32F7 - Discovery - IWDG, WWDG za pomocą CubeMx

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]


Programowanie:


Watchdog wewnętrzny uruchamia się za pomocą następującej instrukcji:

  1.  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.

  1.   HAL_IWDG_Refresh(&hiwdg);

Watchdog okienkowy musi zostać uruchomiony w następujący sposób:

  1. HAL_WWDG_Start_IT(&hwwdg)

Procedura obsługi przerwania wygląda następująco:

  1. void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
  2. {
  3.     HAL_WWDG_Refresh(hwwdg, 127);
  4. }
  5. /* USER CODE END 4 */