Skocz do zawartości

RTC w Nucleo-F103RB odmierza zbyt długie sekundy


Pomocna odpowiedź

Napisano

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
}

 

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.

 

 

  • Lubię! 1
  • Pomogłeś! 1

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.

  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...