dmb_delay_systick
Projekt zawiera prostą biblioteke obsługującą timer Systick w mikrokontrolerach z rdzeniami Mx. Udostępnie najczęściej wykorzystywane rzeczy. Pisana była z myślą o wykorzystaniu dla STM32F0/F3, ale dzięki wykorzystaniu makra gdzie podajemy jakie biblioteki zależne od platformy mają zostać dodane zyskała na uniwersalności.
Koncepcja użycia biblioteki w projekcie
Pliki Źródłowe możemy skopiować bezpośrednio do swojego projektu, dać je gdzię osobono i odpowiednio podlinkować, a najlepiej całe repozytorium podciągnąć jako submoduł gita. Biblioteka zakłada istnienie w projekcie katalogu "libs_config" w środku którego znajdzie sie plik "dmb_systick_settings.h" - tam zamieszczone będą ustawienia zależne od danego projektu. Przykładowy plik konfiguracyjny także został tutaj umieszczony.
Zawartość repozytorium
W repozytorium znajdziemy:
- pliki bilioteki w katalogu "dmb_delay_systick"
- przykładowy plik konfiguracyjny
- #todo - przykładowy projekt z wykorzystaniem tej biblioteki, aczkolwiek raczej opis jest wyczerpujący
- instrukcja w postaci tego pliku
- dokumentacja w doxygenia - dostępna też pod tym linkiem: https://dambo1993.github.io/dmb_delay_systick/index.html
Zasada działania i możliwości biblioteki
Zacznijmy moze czym jest SysTick - jest to 24-bitowy timer wbudowany w rdzenie Cortex-M. Jest taki sam dla wszystkich + niezależny od producenta układu. Podliczać czas, więc idealnie nadaje się do implementacji na nim timerów softwarowych, a sprzętowe timery możemy wtedy wykorzystać do bardziej rozbudowanych zadań.
Wstępnie zakładam, że będzie on wykorzystywany do "tykania" co milisekundę, ale nic nie stoi na przeszkodzie, zeby to zmienić.
Możliwości biblioteki:
- udostępnia funkcję "_delay_ms()" znaną z AVRek - zwykły blokujący delay, z tym, że możemy podać do niego 32bitową zmienną (co nie oznacza, że powinniśmy/wypada używać jej tak :p )
- generowanie co tyknięcie zarejestrowanego callbacka
- odliczanie czasu działania systemu - co może być wykorzystane do wyznaczania czasu, gdy wystąpił jakiś event
- możliwość ustawienia i sprawdzania blokujących timeoutów - dla prostych aplikacji
Wykorzystanie biblioteki:
- Jako pierwszy krok inicjalizujemy bibliotekę podając jej z jaką częstotliowścią jest taktowany SysTick:
// inicjalizacja SysTicka z aktualna predkoscia zegara
dmb_delay_systick_init(48000000);
- Jeśli chcemy wykorzystywać callback wywoływany co 1 ms musimy go zarejestrować:
/*
* Miganie ledkiem co milisekunde.
*/
void toogle_1ms()
{
DEBUG_LED1_TOG;
}
...
// podpiecie callbacka, ktory wykona sie co milisekunde
dmb_delay_systick_register_callback( toogle_1ms );
- Wykorzystanie timeoutu:
wyslij_do_ukladu_i_czekaj_za_odp();
systick_set_timeout(300);
while( !odebrano_odpowiedz() && systick_check_timeout() );
// tu wejdziemy, gdy gdy dostaniemy odpowiedź, lub minie timeout
- wykorzystanie uptime - czyli zwykłe wywołanie funkcji:
uint32_t aktualna_ms = systick_get_system_uptime();
Parametry do ustawienia
Raczej nie ma co opisywać dodatkowo - tak wygląda plik ustawień:
// Plik "systemowy" zalezny od plaftormy na jaka piszemy
#define DMB_SYSTICK_SYSTEM_INCLUDE "stm32f0xx.h"
// Priorytet przerwania do SysTicka
#define DMB_SYSTICK_INTERRUPT_PRIORITY 5
// Wybor, czy w czasie deleya mamy uspic mikrokontroler
// nie zawsze chcemy to robic, np RTT ma problemy z uruchomiona ta opcja
#define DMB_SYSTICK_ENABLE_WFI 1
UWAGA
Systick cały czas pracuje w tle, więc dokładność funkcji to +/- jedno tyknięcie - raczej zbyt często nie utrafimy z wywołanie _delay_ms() "idealnie podczas tyknięcia" - więc to nie jest biblioteka do mega precyzyjnych rzeczy!
Autor
- dambo - Blog