Forum: Mikrocontroller und Digitale Elektronik stm32L476 RTC Problem


von Schorsch X. (bastelschorsch)


Lesenswert?

Moin zusammen,
hab ein Problem mit der RTC vom STM32L476 (Nucleo 64 Board). Ich benutze 
CubeMx für die Initialisierung. Die RTC an sich tut was sie soll, 
allerding geht sie bei jedem Reset ein bisschen mehr nach. Fast so als 
würde der Oszillator kurz stehen bleiben. Das passiert sowohl beim Reset 
per Taster als auch bei Reset per Versorgungsunterbrechung. 
Batteriestrom sieht sinnvoll aus (ca. 0,6uA).

Hat irgendjemand da eine Idee zu ?

Vielen Dank und die besten Grüße
Schorsch

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Speist Du die RTC aus dem 32,xxx kHz Quarz oder aus HSE?

von Schorsch X. (bastelschorsch)


Lesenswert?

Ich hab den LSE Oszillator (32.768KHz) Quarz eingeschaltet. Soweit ich 
verstanden hab, läuft der auch beim Reset weiter - was ich auch mit dem 
Oszi messen kann. Irgendwie verlier ich von 0.1 - 1 Sekunde / Reset. Ist 
irgendwie komisch ???? Der Controller selbst läuft mit 48MHz aus dem 
stabilisierten MSI. Hab alles andere auch schon abgeschaltet (ADC, DAC, 
USB , USART etc.)

: Bearbeitet durch User
von Gerhard G. (xmega)


Lesenswert?

Hallo,

so funktioniert es bei mir:


void RTC_Clock_Config(void) {

  RCC_OscInitTypeDef        RCC_OscInitStruct;
  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;

  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  __HAL_RCC_RTC_ENABLE();

}

void MX_RTC_Init(void)
{

    //Initialize RTC and set the Time and Date
    hrtc.Instance = RTC;
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    hrtc.Init.AsynchPrediv = 127;
    hrtc.Init.SynchPrediv = 255;
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    HAL_RTC_Init(&hrtc);
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sTime.StoreOperation = RTC_STOREOPERATION_RESET;

    sTime.Hours = 0x21;
    sTime.Minutes = 0x36;
    sTime.Seconds = 0x00;

    sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
    sDate.Month = RTC_MONTH_AUGUST;
    sDate.Date = 0x12;
    sDate.Year = 0x16;



  //  HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD);
  //  HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD);


}

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Mit dem HAL Obfuscation Schicht setzte ich mich nicht auseinander...

Kann es sein, dass die Sequenz oben den LSE aus, und dann wieder 
einschaltet? Warum prueftst Du nicht, ob LSE/RTC sachon laeuft und 
laesst die Finger von den Teilen wenn sie schon laufen.

von Schorsch X. (bastelschorsch)


Lesenswert?

In der HAL Funktion RTC_EnterInitMode() bleibt die Uhr stehen und es 
dauert (warum weiß ich noch nicht) einige Zeit bis diese wieder anläuft. 
Wenn ich nach einmaliger erfolreicher Initialisierung nur noch mit dem 
Makro:

__HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);

den Zugriff auf die Uhr freigebe passiert nix mit der Uhrzeit.

Da muss wohl die Initialisierung irgendwie anders gelöst werden.

Danke für die Anregung und noch einen schönen Tag.

Schorsch

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.