Forum: Mikrocontroller und Digitale Elektronik STM32 - RTC will nicht starten


von RTC (Gast)


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!

von Jim M. (turboj)


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?

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.