Obsługa RTC w STM32
List. 4
void SysTick_Handler(void) { extern uint8_t req_alarm; if(req_alarm == 1) {BEEPER_INV;} }
W przypadku przerwania od RTC wywoływanego w momencie inkrementacji licznika, mamy do czynienia z bardziej rozbudowaną formą (listing 5). Obsługa przerwania składa się z trzech działań. Pierwsze zadanie to sprawdzenie czy licznik nie przekroczył dozwolonej wartości. Napisany program zegarka wykorzystuje czas w zapisie 24h, tak więc maksymalna wartość to 23h59m59s, co odpowiada wartości 86399. Jeśli licznik posiada niepoprawną wartość, wykonywane jest działanie modulo – reszta z dzielenia. Drugim zadaniem jest warunkowe pobranie aktualnej wartości licznika oraz wartości rejestru alarmu. Jest to realizowane tylko wtedy, gdy nie jest przeprowadzana edycja aktualnego czasu i alarmu. Trzecim realizowanym zadaniem jest przełączanie diody LED – realizowane jest to przez polecenie LED_1_INV.
List. 5
void RTC_IRQHandler(void) { extern uint32_t rtc_time; extern uint32_t rtc_alarm; extern uint8_t req_alarm; extern uint8_t set_pos; if(RTC_GetITStatus(RTC_IT_SEC) != RESET) { //sprawdzenie czy RTC się nie przekręcił 24h if(RTC_GetCounter() >= (86400 - 1)) { RTC_SetCounter(RTC_GetCounter() % (86400 - 1)); } //pobieranie aktualnego czasu tylko gdy nie jest przeprwadzane ustawiane czasu/alarmu if(set_pos == 0) { rtc_time = RTC_GetCounter(); rtc_alarm = RTC->ALRL | (RTC->ALRH << 16); } LED_1_INV; //wyczyszczenie bitu generujacego przerwanie RTC_ClearITPendingBit(RTC_IT_SEC); //odczekanie na zakończenie operacji na RTC RTC_WaitForLastTask(); } }
Obsługa przerwania wywołanego wystąpieniem alarmu RTC jest bardzo prosta, realizuje ona jedynie zapalenie wszystkich diod LED oraz ustawienie zmiennej informującej o wystąpieniu alarmu, która to operacja powoduje, że program zacznie obsługiwać generowanie dźwięku informującego o alarmie. Program obsługi przerwania został przedstawiono na listingu 6.
List. 6
void RTCAlarm_IRQHandler(void) { extern uint8_t req_alarm; if(EXTI_GetITStatus(EXTI_Line17) != RESET) { //wyczyszczenie flagi przerwania EXTI_ClearITPendingBit(EXTI_Line17); //ustawienie zmiennej do żądania generowania sygnału alarmu req_alarm = 1; LED_ALL_ON; //odczekanie na zakończenie operacji na RTC RTC_WaitForLastTask(); //wyczyszczenie flagi przerwania RTC_ClearITPendingBit(RTC_IT_ALR); //odczekanie na zakończenie operacji na RTC RTC_WaitForLastTask(); } }
W programie została wykorzystana własna, prosta biblioteka obsługi wyświetlacza zamontowanego w module KAmodLCD1. Dodatkowo projekt zawiera plik z makrami umożliwiającymi realizacje prostych operacji poprzez odwołanie się do elementu, na którym ma zostać przeprowadzone działanie. Makra te realizują operacje na diodach LED oraz zmianę stanu wyjścia, do którego jest dołączony generator akustyczny. Przykładowe makra to LED_1_ON, LED_1_OFF, LED_1_INV oraz analogicznie dla pozostałych diod LED, LED_ALL_ON, LED_ALL_OFF, LED_ALL_INV i działanie na generatorze BEEPER_ON, BEEPER_OFF i BEEPER_INV.
Mariusz Dziębowski
m.dziebowski@interia.pl
Odnośniki:
Moduł wyświetlacza LCD KAmodLCD1
Zestaw uruchomieniowy ZL27ARM