STM32 - RTC will nicht starten

Gast #5086944
Lesenswert?
• ▲
▼
Hallo,

ich habe folgendes Problem, die RTC beim STM32 ein zu binden:

Der Code ist mit dem CubeMX erzeugt, ich möchte eigentlich nur einen 
periodischen Wakeup realisieren.

Ansatz:

Clock aktivieren
LSI aktivieren
MX_RTC Init durchlaufen lassen
dort drin: HAL_RTCEx_SetWakeUpTimer_IT aktivieren.



Zunächst läuft die System Clock Config durch.

Dort finden sich u.a. folgende Zeilen:
1
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE;
2
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
3
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
4
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
5
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
6
RCC_OscInitStruct.PLL.PLLM = 25;
7
RCC_OscInitStruct.PLL.PLLN = 336;
8
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
9
RCC_OscInitStruct.PLL.PLLQ = 7;
10
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
11
{kein Fehler}

und weiter:
1
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
2
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
3
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
4
{
5
kein Fehler
6
}


Folglich scheint mein Wunsch, die RTC mit dem LSI zu speisen erstmal 
funktioniert zu haben.


Danach rufe ich die eigentliche MX_RTC_Init() Funktion auf, diese läuft 
bis zu dem Punkt:

if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 3000, 
RTC_WAKEUPCLOCK_RTCCLK_DIV2) != HAL_OK)

und erzeugt dann offenbar einen Fehler:
Steppe ich dort rein, siehe unten, dann läuft das Programm

1
HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock)
2
{
3
  __IO uint32_t count;
4

5
  /* Check the parameters */
6
  assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock));
7
  assert_param(IS_RTC_WAKEUP_COUNTER(WakeUpCounter));
8

9
  /* Process Locked */ 
10
  __HAL_LOCK(hrtc);
11

12
  hrtc->State = HAL_RTC_STATE_BUSY;
13

14
  /* Disable the write protection for RTC registers */
15
  __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
16

17
  /* Check RTC WUTWF flag is reset only when wake up timer enabled */
18
  if((hrtc->Instance->CR & RTC_CR_WUTE) != RESET)
19
  {
20
    /* Wait till RTC WUTWF flag is reset and if Time out is reached exit */
21
    count = RTC_TIMEOUT_VALUE  * (SystemCoreClock / 32U / 1000U);
22
    do
23
    {
24
      if(count-- == 0U)
25
      {
26
        /* Enable the write protection for RTC registers */
27
        __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
28

29
        hrtc->State = HAL_RTC_STATE_TIMEOUT;
30

31
        /* Process Unlocked */
32
        __HAL_UNLOCK(hrtc);
33

34
        return HAL_TIMEOUT;
35
      }
36
    }
37
    while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(hrtc, RTC_FLAG_WUTWF) == SET);
38
  }
39

40
--> hier wird die Funktion offenbar im oben stehenden Return verlassen!
41
Rest der Funktion wird nicht erreicht!
42

43
...
44
... Rest der Funktion
45
...}



Kann mir einer von euch sagen, wo ich einen Fehler gemacht habe?


Danke!
#5086962
Lesenswert?
• ▲
▼
RTC schrieb:
> Kann mir einer von euch sagen, wo ich einen Fehler gemacht habe?

Da ist möglicherweise irgendein Clock Gate noch aus. Such doch mal bei 
den ganzen Clock Enables ob da auch noch eins für die RTC AHB/APB dabei 
ist.

Ich gehe mal davon aus das Du auf Deiner Schaltung einen 32768Hz Quarz 
verbaut hast. Hausaufgabe: Hat der LSI ein Status Bit, mit dem man 
auslesen kann ob er vernünftig läuft?

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.