Uwaga! Pierwsza część cyklu jest dostępna pod adresem, a druga jest dostępna pod adresem.

Zgodnie z zapowiedzią z poprzedniego odcinka, wykonamy teraz prosty projekt, którybędzie cyklicznie zapalał i gasił jedną lub kilka LED. Do migania diodami będzie nam potrzebne odliczanie opóźnienia, co zrealizujemy za pomocą licznika i systemu przerwań.

Do odliczania opóźnień wybrałem licznik TIM10. Żeby go użyć, w zakładce Pinout trzeba wybrać TIM10 i zaznaczyć Activated. Wtedy ikona TIM10 pojawi się z okienku Control zakładki Configuration (rysunek 9).

 

Rys. 9. Wybór licznika TIM10

 

Wybrany licznik TIM 10 trzeba teraz skonfigurować. Liczniki w mikrokontrolerze zestawu STM32F4Discovery są taktowane częstotliwością 84MHz z APB1. TIM10 jest 16-bitowym licznikiem z funkcją automatycznego przeładowania oraz z 16-bitowym preskalerem (rysunek 10).

Rys. 10. Schemat blokowy licznika TIM10

 

W trybie zliczania UP (Upcounting) licznik zlicza od zera do wartości zapisanej do rejestru Auto-reload register. Kiedy zawartość licznika i rejestru Auto – reload są sobie równe, to rejestr licznika jest zerowany i odliczanie rozpoczyna się od nowa. W czasie zerowania licznika może być zgłaszane przerwanie.

Za pomocą STM32CubeMX skonfigurujemy licznik TIM10 tak by zgłaszał przerwanie co 1 ms, czyli 1000 razy na sekundę. W pierwszym kroku trzeba ustawić zliczanie w górę (UP) i preskaler TIM10 na 82, tak by na wejściu rejestru licznika była częstotliwość równa 1 MHz. Jeżeli teraz do Auto-reload register wpiszemy wartość 1000, to licznik będzie się przepełniał z częstotliwością 1MHz/1000 = 1kHz, czyli co 1 ms. W zakładce Configuration klikamy na ikonkę TIM10 i otwiera się okno TIM10 Settings. W zakładce Parameter Settings ustawiamy:

  • Wartość preskalera =82
  • Tryb zliczania UP
  • Okres zliczania =1000

Żeby licznik zgłaszał przerwanie trzeba to ustawić z w zakładce NVIC SettingsTIM10 Update Interrupt and TOM10 global Interrupt Enabled. Oba ustawienia zostały pokazane na rysunku 11.

 

Rys. 11. Konfiguracja TIM10

Na ich podstawie STM32CubeMX wygeneruje kod zawierający funkcję inicjalizacji licznika TIM10 pokazany na listingu 4, oraz funkcję obsługi przerwania – listing 5.

 

List. 4. Inicjalizacja licznika TIM10

 

List. 5. Funkcja obsługi przerwania od TIM10

Należy pamiętać o jednej rzeczy: kod generowany przez STM32CubeMX zawiera jedynie procedury konfigurujące układy peryferyjne. Jeżeli chcemy by te układy zaczęły działać użytkownik musi je samodzielnie programowo uruchomić wywołując odpowiednią funkcję. W naszym przypadku timer zostanie skonfigurowany, ale nie będzie zliczać impulsów wejściowych. Żeby wszystko działało musimy wywołać funkcję:

HAL_TIM_Base_Start_IT(&htim10);

uruchamiającą licznik i przerwania.

Na końcu pozostaje w obsłudze przerwania zapalać i gasić wybrana diodę. Ponieważ przerwania jest zgłaszane co 1 ms, to trzeba odliczyć 1000 przerwań by dioda zapalała się i gasła co 1 sekundę. Do tego celu zostanie użyta zmienna globalna blinklisting 6.

 

List. 6. Procedura przerwania od przepełnienia TIM10

 

Tomasz Jabłoński