www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [STM32] RealTimeClock


Autor: Bernhard B. (schluchti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bin gerade dabei die RTC des STM32 zum Laufen zu bekommen. Die 
Existenz der Firmware-Library von ST ist mir bekannt, aber ich möchte es 
gerne selbst hinbekommen.

Meine Initialisierungsroutine sieht im Moment so aus:
void rtc_init(void)
{
 //access to backup register & RTC
 RCC->APB1ENR |= RCC_APB1ENR_PWREN; 
 RCC->APB1ENR |= RCC_APB1ENR_BKPEN; 
 PWR->CR |= PWR_CR_DBP;   //access to backup register

 RCC->BDCR |= RCC_BDCR_RTCEN; //enable RTC
 RCC->BDCR |= RCC_BDCR_RTCSEL_NOCLOCK; //LSE oscillator clock used as RTC clock
 RCC->BDCR |= RCC_BDCR_LSEON; //External Low Speed oscillator enable

 while((RCC->BDCR & RCC_BDCR_LSERDY) == 0) //external Low Speed oscillator Ready?
 {
 }
 
 
  while ((RTC->CRL & RTC_CRL_RTOFF)== 0)   //end of write operation?
  {
  }
  //enter configuration mode
 RTC->CRL |= RTC_CRL_CNF;

  RTC->PRLL = 0x7FFF;  //signal period of 1sec.
  RTC->DIVL = 0x7FFF; //set RTC Prescaler
  
  //reset 32bit counter
  RTC->CNTH = 0x0000;
  RTC->CNTL = 0x0000;


 RTC->CRL &= ~(RTC_CRL_CNF); //exit configuration mode
 while ((RTC->CRL & RTC_CRL_RTOFF)== 0)   //end of write operation?
 {
 }

}

Das Problem ist, dass RTOFF nach dem Ende des Schreibprozesses nicht 
mehr "1" wird (mit dem Debugger überprüft).

Eigentlich hab ich ja alles, wie im Manual beschrieben, gemacht:

Configuration procedure:
1. Poll RTOFF, wait until its value goes to ‘1’
2.  Set the CNF bit to enter configuration mode
3.  Write to one or more RTC registers
4.  Clear the CNF bit to exit configuration mode
5.  Poll RTOFF, wait until its value goes to ‘1’ to check the end of the 
write operation.

The write operation only executes when the CNF bit is cleared; it takes 
at least three RTCCLK cycles to complete.

Jemand ne Idee was ich übersehe?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard B. schrieb:

>  RCC->BDCR |= RCC_BDCR_RTCSEL_NOCLOCK; //LSE oscillator clock used as
> RTC clock

Das NOCLOCK kommt dir überhaupt nicht seltsam vor?

Denk dran, sowohl Controller wie Compiler sind "I do what you say not 
what you mean" Geräte, auch wenn man es, wie der Kommentar zeigt, gern 
andersrum hätte.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: DIVL ist r/o.

Autor: Bernhard B. (schluchti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh, hab die falsche Bitdefinition aus dem Headerfile kopiert...
Eigentlich hätts ja schon bei NOCLOCK klick machen sollen, da hast du 
Recht. Aber irgendwie ist mir das überhaupt nicht aufgefallen. Sowas ist 
echt ärgerlich..
Auf jeden Fall vielen Dank!

edit: Auch Danke für den Hinweis mit read only

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.