Timer SysTick jako licznik czasu – ćwiczenie dla początkujących

Przedstawiamy prosty projekt ilustrujący działanie przerwania od timera SysTick. Jest to 24-bitowy timera, pozwalający na ustawienie początkowej wartości od jakiej będzie odliczał, przy przechodzeniu przez “0” licznika w dół jest zgłaszane przerwanie, które możemy wykorzystać np. do odliczania czasu tak jak ma to miejsce w projekcie.

Przedstawiony projekt jest modyfikacją przykładowego programu dla zestawu STM32F4Discovery. W przykładzie dodano obsługę wyświetlacza 7-segmentowego, który jest podłączony do mikrokontrolera w sposób pokazany na rysunku 1.

 

Rys. 1. Sposób podłączenia przykładowego wyświetlacza LED do linii GPIO mikrokontrolera STM32F4

Rys. 1. Sposób podłączenia przykładowego wyświetlacza LED do linii GPIO mikrokontrolera STM32F4

 

Pomiędzy liniami GPIO mikrokontrolera i segmentami wyświetlacza powinny znajdować się rezystory ograniczające natężenie prądu płynącego przez segmenty wyświetlaczy. Wykorzystany będzie również przycisk dostępny na mojej płytce ewaluacyjnej.

Ważne jest by podłączyć wyświetlacz do płytki w odpowiedni sposób, bowiem różne wyświetlacze mogą mieć różnie rozłożone wyprowadzenia, wystarczy sprawdzić je w nocie katalogowej od producenta. W przykładzie zastosowano dwucyfrowy wyświetlacz firmy Kingbright o nazwie DC56-11EWA, którego rozmieszczenie wyprowadzeń pokazano na rysunku 2.

 

Rys. 2. Rozmieszczenie segmentów wyświetlacza DC56-11EWA

Rys. 2. Rozmieszczenie segmentów wyświetlacza DC56-11EWA

 

Tab. 1. Zestawienie liczb zapisanych w kodzie wyświetlacza 7-segmentowego, binarnym i szesnastkowym

Tab. 1. Zestawienie liczb zapisanych w kodzie wyświetlacza 7-segmentowego, binarnym i szesnastkowym

 

Poniżej przedstawię sposób przeliczania wartości dla wyświetlacza. Jak widać w tabeli 1 każdemu segmentowi przyporządkowano literowe oznaczenie, któremu odpowiada pojedynczy bit (pojedyncza linia GPIO portu). Przykładowe wartości dla jednej liczby dwucyfrowej pokazano na rysunku 3.

 

Rys. 3. Przykład wysterowania wyświetlacza LED

Rys. 3. Przykład wysterowania wyświetlacza LED

 

Działanie aplikacji zaczynamy od konfiguracji timera SysTick, do czego służą polecenia:

 

 

Ta część kodu odpowiada za ustawienie odstępu czasu po jakim nastąpi przerwanie. W powyższym przykładzie widać, że przerwanie będzie następowało według taktowania zegara systemowego co milisekundę. Ponieważ częstotliwość taktowania przykładowo wynosi 9 MHz, dzieląc to przez 1000 otrzymamy 9000 taktów, czyli czas w którym upłynie 1 ms:

9 MHz = 9 000 000 Hz = 9 000 000 taktów na sekundę = 9000 taktów na 1 ms

Kolejne funkcje pozwolą na ustalanie w programie głównym na ustalenia opóźnienia:

 

 

Ważne by zmienna TimingDelay była wcześniej w pliku zadeklarowana w taki sposób:
static __IO uint32_t TimingDelay;
Funkcja Delay jest wywoływana z parametrem, który określa ilość milisekund opóźnienia dla programu. Dla przykładu wpisując wartość 1000 otrzymamy opóźnienie o wartości jednej sekundy.
Zmienna TimingDelay  jest ustawiana w funkcji Delay  po to by póżniej w funkcji void TimingDelay_Decrement  być dekrementowaną do zera, kiedy to Delay kończy działanie i pozwala na dalsze wykonywanie programu.
TimingDelay_Decrement  jest wywoływana podczas przerwania spowodowanego przez SysTick. Funkcja przerwania SysTick:

 

 

Następnie konfigurujemy linie wyjściowe sterujące segmenty wyświetlacza LED oraz linię wejściową przycisku.
Funkcja obsługująca linie wyświetlacza:

 

 

Konfiguracja wejścia przycisku:

 

 

Funkcja przekształcająca cyfry na kod liczby dla wyświetlacza:

 

 

Funkcja pozwalająca na wyświetlenie liczby:

 

 

Liczba jest dzielona przez 16 by uzyskać cyfry: jedności oraz dziesiątek. Jednak ze względu na to że nie ma pewności, że liczba nie będzie większa od 0xff wynik, który ma być przekształcony, zostanie ponownie podzielony, jednak tym razem wynikiem jest reszta z dzielenia. GPIO_Write zapisuje wartość do określonego portu. Zapis low | (high << 8)  powoduje zapisanie cyfr obok siebie, gdzie high staje się starszymi bajtami a low młodszymi.
Oto główna funkcja przykładowego programu:

 

 

Wciśnięcie i przytrzymanie przycisku powoduje wyzerowanie licznika. Licznik zmienia swoją wartość co sekundę dzięki Delay(1000). STM_EVAL_LEDToggle(LED4) to funkcja dla płytki ewaluacyjnej którą posiadam pozwala ona na negacje stanu diody w przypadku innej plytki lub samego procesora powinna być pominięta. To samo tyczy się STM_EVAL_LEDInit(LED4).
Tomasz Ciborowski

Do pobrania

Autor: