Mikrokontrolery Infineon XMC4500 w praktyce, część 6. Obsługa zegara czasu rzeczywistego (RTC)
W artykule pokazano w jaki sposób, przy wykorzystaniu pakietu DAvE 3, napisać program obsługujący wewnętrzny zegar RTC w mikrokontrolerach XMC4500 firmy Infineon. Jako platformę sprzętową wykorzystano płytkę uruchomieniową XMC4500 Relax Kit (dostępna jest także jej tańsza wersja, pozbawiona interfejsu Ethernet – XMC4500 Relax Kit Lite).
Zegar czasu rzeczywistego (RTC) to zasób występujący w większości dostępnych na rynku mikrokontrolerów. Można go traktować jako licznik, który zwiększa swoją wartość o 1 co sekundę, co de facto oznacza odmierzanie czasu z rozdzielczością jednej sekundy. Stan odczytywanego licznika ma wygodną dla programisty postać liczby sekund, minut i godzin. Analogicznie jest z datą – jest ona podawana w przystępnym formacie liczby dni, miesięcy i lat. Zegar czasu rzeczywistego aktualizuje czas i datę z uwzględnieniem specyfiki kalendarza (liczby dni danego miesiąca, lat przestępnych itp.). Za pomocą zegara czasu rzeczywistego można m.in. odmierzać czas w systemach wykonujących zadania z zadeklarowanym interwałem czasowym, bądź udostępnianie użytkownikowi informacji o aktualnym czasie i dacie.
Budowa zegara czasu rzeczywistego w mikrokontrolerze z rodziny XMC4500
Budowę zegara czasu rzeczywistego w mikrokontrolerze XMC4500 przedstawiono na rysunku 1. Ma on prostą konstrukcję i składa się z trzech bloków: licznika czasu (Time Counter), preskalera (Prescaler) oraz rejestrów (RTC registers).
Do działania zegara czasu rzeczywistego wymagany jest sygnał zegarowy o częstotliwości 32,768 kHz. Generować go może dołączony do mikrokontrolera kwarc o częstotliwości rezonansowej 32,768 kHz lub wbudowane w mikrokontroler źródło sygnału zegarowego o takiej samej częstotliwości pracy.
W celu ułatwienia programiście korzystania z zegara czasu rzeczywistego, blok ten ma możliwość zgłaszania przerwań. Mogą one sygnalizować zmianę wybranych pól czasu albo daty (sekund, minut, godzin, dni, miesięcy, lat) lub osiągnięcie zadeklarowanej czasu albo daty (jest to tak zwany alarm).
Rys. 1. Schemat blokowy zegara czasu rzeczywistego w mikrokontrolerach XMC4500 [1]
Zegar czasu rzeczywistego może być zasilany na dwa sposoby. Pierwszym sposobem jest wykorzystanie tego samego źródła napięcia, z którego korzysta mikrokontroler (wyprowadzenia VDDP). Drugi sposób zasilania zegara czasu rzeczywistego polega na wykorzystaniu alternatywnego źródła napięcia (wyprowadzenie VBAT), co pozwala temu blokowi peryferyjnemu działać (aktualizować czas i datę) nawet w przypadku niedostępności lub zaniku napięcia zasilania dla mikrokontrolera.
Zegar czasu rzeczywistego ma możliwość wybudzania mikrokontrolera ze stanu uśpienia. Umożliwia to zaimplementowanie mechanizmu periodycznego wybudzania układu w celu wykonania określonych zadań, a następnie przywrócenia stanu uśpienia, co pozwala zminimalizować zużycie energii całego urządzenia.
Zegar czasu rzeczywistego połączony jest z modułem SCU (System Control Unit), z którym komunikuje się poprzez magistralę szeregową. Do zakresu obowiązków SCU należy zarządzanie i sterowanie zużyciem energii, sygnałami zegarowymi oraz blokiem zerowania mikrokontrolera.
Oznaczenia rejestrów sterujących zegarem czasu rzeczywistego wraz z pełną ich nazwą przedstawiono w tabeli 1.
Tab. 1. Oznaczenia oraz nazwy rejestrów sterujących zegarem czasu rzeczywistego [1]
Rejestr |
Pełna nazwa rejestru |
ID |
ID Register |
CTR |
Control Register |
RAWSTAT |
Raw Service Request Register |
STSSR |
Status Service Request Register |
MSKSR |
Mask Service Request Register |
CLRSR |
Clear Service Request Register |
ATIM0 |
Alarm Time Register 0 |
ATIM1 |
Alarm Time Register 1 |
TIM0 |
Time Register 0 |
TIM1 |
Time Register 1 |
DAvE Apps przewidziane do sterowania zegarem czasu rzeczywistego
Do sterowania zegarem czasu rzeczywistego firma Infineon opracowała komponent oprogramowania DAvE App o nazwie RTC001. W tabeli 2 przedstawiono krótki opis funkcji tworzących API (Application Programming Interface) tego komponentu. Kompletną dokumentację można znaleźć w systemie pomocy pakietu DAvE 3.
Tab. 2. Opis API komponentu DAvE App RTC001 [2]
Nazwa elementu API |
Opis |
RTC001_Init |
Inicjalizacja zegara czasu rzeczywistego |
RTC001_DeInit |
Inicjalizacja zegara czasu rzeczywistego z domyślnymi parametrami działania |
RTC001_Enable |
Włączenie zegara czasu rzeczywistego |
RTC001_Disable |
Wyłączenie zegara czasu rzeczywistego |
RTC001_ClearFlagStatus |
Wyzerowanie wybranej flagi zegara czasu rzeczywistego |
RTC001_GetFlagStatus |
Odczytanie stanu wybranej flagi zegara czasu rzeczywistego |
RTC001_ConfigAlarm |
Ustawienie alarmu zegara czasu rzeczywistego |
RTC001_Clock_GetTime |
Odczytanie czasu i daty zegara czasu rzeczywistego |
RTC001_Clock_SetTime |
Ustawienie czasu i daty zegara czasu rzeczywistego |
RTC001_Time |
Obliczenie liczby sekund od początku epoki Uniksa (01.01.1970 r.) |