LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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