Hallo,
ich benutze ein STM32F103C8T6 Minimum System Dev. Board (2€ Chinateil).
Das Problem ist, dass die RTC-Komponenten auf diesem Board scheinbar
nicht sehr stabil ausgelegt sind (32,768kHz Quarz mit 100pF
Kondensatoren). Ich verwende ein Steckernetzteil (Schaltnetzteil) und
habe auch ein paar Kondensatoren in Nähe der Versorgungspins platziert.
VBat habe ich wie im Reference Manual empfohlen mit VDD verbunden;
PC13,PC14,PC15 sind unbeschaltet.
Das Problem: In dem Moment, wenn ich den Programmieradapter abziehe (die
Masseverbindung zum PC), läuft die RTC mit ca. der halben
Geschwindigkeit.
Ich gehe davon aus, dass ich mir irgendwo Störungen einfange. Hat
irgendjemand eine Idee, ob ich noch die Beschaltung RTC-relevanter Pins
vergessen habe (neben VBat,PC13,PC14,PC15).
Mit dem Oszi habe ich mir die Spannungsversorung angeschaut. Abgesehen
von dem üblichen Schaltnetzteil-Rauschen sind keine riesigen Störungen
zu sehen. Wenn ich Gnd mit PE von der Steckdose verbinde läuft die RTC
auch gut (die Verbindung würde ich mir aber auch gerne sparen).
Vielen Dank für die Infos.
Nachfolgend ist noch mein Code zur Initialisierung der RTC:
1 | NVIC_InitTypeDef NVIC_InitStructure;
|
2 |
|
3 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // Enable PWR and BKP clocks
|
4 | PWR_BackupAccessCmd(ENABLE); // Allow access to BKP Domain
|
5 | BKP_DeInit(); // Reset Backup Domain
|
6 | RCC_LSEConfig(RCC_LSE_ON); // Enable LSE (32,768kHz Quarz)
|
7 | while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){} // Wait till LSE is ready (Einschwingvorgang abwarten)
|
8 |
|
9 | RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // LSE as Clock source (32,768kHz Quarz)
|
10 | RCC_RTCCLKCmd(ENABLE); // Enable RTC Clock
|
11 | RTC_WaitForSynchro(); // Wait for RTC registers synchronization
|
12 | RTC_WaitForLastTask(); // Wait until last write operation on RTC registers has finished
|
13 | RTC_ITConfig(RTC_IT_SEC, ENABLE); // Enable the RTC Second Interrupt
|
14 | RTC_WaitForLastTask(); // Wait until last write operation on RTC registers has finished
|
15 | RTC_SetPrescaler(32767); // Set RTC prescaler: set RTC period to 1sec
|
16 | RTC_WaitForLastTask(); // Wait until last write operation on RTC registers has finished
|
17 |
|
18 |
|
19 | NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
|
20 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
21 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
22 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
23 | NVIC_Init(&NVIC_InitStructure);
|