niedziela, 6 marca 2016

STM32F0 - RTC bez pinu 1Hz

Bawiąc się RTC w STM32F030F4 znalazłem jego małą wadę - kilkukrotnie przeglądałem dokumentacje, żeby to potwierdzić - brakuje przerwania od wybicia pełnej sekundy :( Jest to zawsze przydatne w zegarkach, aby je ładnie odświeżać. Można uzyskać taką funkcjonalność kosztem... alarmu, który jest tylko jeden, lub przerwania EXTI od pinu wyjściowego zegara.
Poniżej schemat RTC w tym mikrokontrolerku:



Widzimy, że sygnał o częstotliwości 1Hz może wyjść tylko na pin RTC_OUT, nie ma go niegdzie dodatkowo wyprowadzonego. Dla objaśnienia tego schematu - kwadraciki na początku/końcu linii sygnałowej oznaczają fizyczne piny, strzałki to sygnały wewnętrzne, przykładowo ALRAF może służyć do generowania przerwania od alarmu.

Mój obecny kod do inicjalizacji zegara:
void init_RTC( void )
{
 // wlaczenie zegara dla PWR
 RCC->APB1ENR |= RCC_APB1ENR_PWREN;

 // wlaczenie generatora LSI
 RCC->CSR |= RCC_CSR_LSION;

 // oczekiwanie na uruchomienie
 while( !( RCC->CSR & RCC_CSR_LSIRDY ) );

 // dostep do rejestrow RTC
 PWR->CR |= PWR_CR_DBP;

 // reset sekcji RTC
 RCC->BDCR |= RCC_BDCR_BDRST;
 RCC->BDCR &= ~RCC_BDCR_BDRST;

 // wybor zrodla taktowania dla rcc ( LSI )
 RCC->BDCR |= RCC_BDCR_RTCSEL_1;
 RCC->BDCR &= ~RCC_BDCR_RTCSEL_0;

 // wlaczenie rtc
 RCC->BDCR |= RCC_BDCR_RTCEN;

 // odblokowanie RTC - super sprawa
 RTC->WPR = 0xca;
 RTC->WPR = 0x53;

 // wejscie w tryb inicjalizacji
 RTC->ISR |= RTC_ISR_INIT;

 // oczekiwanie na inicjalizacje
 while( !( RTC->ISR & RTC_ISR_INITF ) );

 // teraz mozemy wprowadzac zmiany w rejestrach zegara

 RTC->ALRMASSR = 0x0f000000;  // kasowanie setnych sekundy

 RTC->TR = 0;

 // ustawienia przerwania co sekunde - niestety za pomoca ustawienia alarmu
 // ustawiamy alarm tak, zeby nie byl zalezny praktycznie od niczego
 // wtedy bedzie sprawdzany i uruchamiany co sekunde
 RTC->ALRMAR |= RTC_ALRMAR_MSK4;
 RTC->ALRMAR |= RTC_ALRMAR_MSK3;
 RTC->ALRMAR |= RTC_ALRMAR_MSK2;
 RTC->ALRMAR |= RTC_ALRMAR_MSK1;

 // wlaczenie alarmu i przerwania
 RTC->CR |= RTC_CR_ALRAIE | RTC_CR_ALRAE;

 // wyjscie z trybu inicjalizacji
 RTC->ISR &= ~RTC_ISR_INIT;

 RTC_wlacz_przerwanie();
}
Bez funkcji wpisywania do niego godziny - najpierw musiałem rozwikłać jak zdobyć ładny sygnał 1Hz.

2 komentarze:

  1. W RM od STM32F030 masz pięknie opisane jak uruchomić 1Hz.
    Strona 760, A.13.8 RTC Clock Output code example

    OdpowiedzUsuń
  2. no tak - jest opisane, ale wykorzystuje to alarm o czym pisałem wyżej, czyli tracimy możliwość korzystania ze sprzętowego alarmu niestety.

    OdpowiedzUsuń