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!