Destroyer2137 Napisano Grudzień 20, 2022 Udostępnij Napisano Grudzień 20, 2022 Cześć, próbowałem pobawić się STM32 na rejestrach i mam problem z RTC na tytułowej płytce. Skonfigurowałem wszystko i faktycznie RTC odmierza czas i miga diodą, ale jedna odmierzona "sekunda" trwa jakieś dwie rzeczywiste. Próbowałem zmienić prescaler na 16384, ale nie pomogło - jedna odmierzona "sekunda" trwa... może 1,8 zwykłej. Próbowałem wyłączyć pin A5 i wysyłać sobie czas przez USART, problem ten sam. Do pinu VBAT podłączona jest bateria CR2032. Nie mam pomysłu, co może być nie tak, więc proszę o pomoc. #include "stm32f1xx.h" void A5_config() void RTC_config(); int main(void) { SystemCoreClock = 8000000; HAL_Init(); A5_config(); RTC_config(); uint32_t czas_obecny = RTC->CNTL; uint32_t czas_poprzedni = czas_obecny; while (1) { czas_obecny = RTC->CNTL; if (czas_obecny != czas_poprzedni) { czas_poprzedni = czas_obecny; GPIOA->ODR ^= (1<<5); } } } void A5_config() { RCC->APB2ENR |= (1<<2); //włącz zegar dla portu A GPIOA->CRL |= (1<<20); //mode output... GPIOA->CRL &= ~(0b11<<22); //...general purpose output push-pull } void RTC_config() { RCC->APB1ENR |= (0b11<<27); //wlacz zegar dla power interface i backup interface PWR->CR |= (1<<8); //disable backup domain write protection RCC->BDCR |= (1<<0); //LSE on while((RCC->BDCR & (1<<1)) == 0); //poczekaj na ustabilizowanie LSE RCC->BDCR |= (0b01<<8); //wybierz LSE jako zrodlo RCC->BDCR |= (1<<15); //wlacz rtc while((RTC->CRL & (1<<5)) == 0); //poczekaj na zakonczenie ostatniego wpisu do rejestrow RTC RTC->CRL |= (1<<4); //wejdz w tryb konfiguracyjny RTC while((RTC->CRL & (1<<5)) == 0); RTC->PRLL |= (32767<<0); //prescaler na 32kHz while((RTC->CRL & (1<<5)) == 0); while((RTC->CRL & (1<<3)) == 0); //czekaj na synchronizacje rejestrow RTC RTC->CRL &= ~(1<<4); //opusc tryb konfiguracyjny RTC } Cytuj Link do komentarza Share on other sites More sharing options...
kaworu Grudzień 20, 2022 Udostępnij Grudzień 20, 2022 Sprawdź co faktycznie zawiera RCC->BDCR, RTC->PRLL i PRLH po konfiguracji. I na litość dowolnego bóstwa, używaj stałych CMSIS, bo mózg boli od analizowanie tego kodu. 1 1 Cytuj Link do komentarza Share on other sites More sharing options...
Destroyer2137 Grudzień 20, 2022 Autor tematu Udostępnij Grudzień 20, 2022 Działa 🙂 Okazuje się, że pomogło wyzerowanie rejestru PRLL przed wpisaniem tam 32767, najwyraźniej w starszych bitach pojawiły się jakieś "śmieci". Dziękuję za naprowadzenie na rozwiązanie i kłaniam się w pas. 2 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!