STM32L011 RTC-Weckfunktion

Ich habe ein batteriebetriebenes Gerät mit STM32L011. Im Moment verwende ich das Nucleo-32-Entwicklungsboard. Am Ende möchte ich den Suspend-Modus mit RTC verwenden, um alle paar Minuten aufzuwachen. Zuerst möchte ich, dass die RTC mit der Wakeup-Funktion einen Interrupt generiert.

Ich kann in meinem UART-Protokoll sehen, dass die RTC läuft (RTC_TR wird inkrementiert), ich kann auch sehen, dass RTC_ISR anfänglich 0x23 ist und in der nächsten Sekunde 0x423, was bedeutet, dass das WUTF-Flag gesetzt wurde. Es erfolgt jedoch kein Interrupt.

Mein ISR schaltet nur eine LED ein und löscht das EXTI-Flag. Wenn ich EXTI_SWIER |= BIT17;die Interrupt-Feuer richtig mache (also vermute ich, dass EXTI und NVIC richtig eingestellt sind). Mein Problem ist, dass, obwohl der Interrupt aktiviert ist, RTC läuft, das WUTF-Flag gesetzt ist - der Interrupt nicht auftritt. Ich habe keine harten Fehler oder Resets.

Dies ist mein RTC-Code:

RCC_APB1ENR |= BIT28; //turn on power control circuit clock
PWR_CR |= BIT8; //unlock the RTC domain, set DBP in PWR_CR
RCC_CSR |= BIT0; //rurn on LSI
while ( (RCC_CSR & BIT1) == 0); //wait for LSI to be ready

RCC_CSR |=  BIT19;  //put RTC into reset
RCC_CSR &=  ~BIT19; //take it back out of reset

//RTC on, use LSI
RCC_CSR |= BIT17;
RCC_CSR &= ~BIT16;

RCC_CSR |= BIT18; //RTC enable
RTC_WPR = 0xca; //RTC unlock
RTC_WPR = 0x53;

// RTC Initialization procedure (see reference manual)
RTC_ISR |= BIT7; //set INIT bit, request RTC stop
while ((RTC_ISR & BIT6)==0); //wait for RTC to stop

ISER |= BIT2; // enable RTC IRQ in NVIC (via EXTI line)

//wakeup configuration
RTC_CR &= ~BIT10; //clear WUTE bit
while( !(RTC_ISR & BIT2 /*WUTWF*/) ){} //wait for the bit to be set
uart_puts("RTC_ISR=");
uart_puthex(RTC_ISR);
RTC_ISR |= BIT10/*WUTWF*/; //has to be set before writing to WUTR (manual 22.7.6)
RTC_WUTR = 0x9C0; //very short wakeup period
RTC_CR = BIT14 /*WUTIE*/ | BIT10 /*WUTE*/ | BIT0|BIT1 /*WUCKSEL - RTC/2 wakeup clock*/ ; //enable wakeup function and interrupt, RTC/2 clock

RTC_ISR &= ~BIT7; //start the RTC (clear INIT bit)

EXTI_IMR |= BIT17; //enable RTC alarm going through EXTI 17 line to NVIC
EXTI_EMR |= BIT17;
EXTI_RTSR |= BIT17;

Dies ist mein UART-Protokoll (wiederholt sich ungefähr jede Sekunde):

------
Hello
RTC_ISR=c7
wutr=2496
RTC_ISR=23
RTC_TR=0
RTC_CR=4403
EXTI_PR=0
wutr=2496
RTC_ISR=423
RTC_TR=1
RTC_CR=4403
EXTI_PR=0
wutr=2496
RTC_ISR=423
RTC_TR=1
RTC_CR=4403
EXTI_PR=0
wutr=2496
RTC_ISR=423
RTC_TR=2
RTC_CR=4403
EXTI_PR=0
wutr=2496
RTC_ISR=423
RTC_TR=3
RTC_CR=4403
EXTI_PR=0
wutr=2496
RTC_ISR=423
RTC_TR=4

Antworten (1)

Mein Fehler. Die RTC-Weckfunktion verwendet die EXTI-Leitung 20, nicht die Leitung 17 (wie dies bei RTC-Alarmen der Fall ist) – Tabelle 53, RM0337 . Jetzt funktioniert gut.