Función de activación STM32L011 RTC

Tengo un dispositivo con batería limitada con STM32L011. En este momento estoy usando la placa de desarrollo Nucleo-32. Al final, quiero usar el modo de suspensión con RTC para despertarme cada dos minutos. Primero quiero que el RTC genere una interrupción usando la función de activación.

Puedo ver en mi registro de UART que RTC se está ejecutando (RTC_TR se incrementa), también puedo ver que RTC_ISR es inicialmente 0x23 y en el siguiente segundo es 0x423, lo que significa que se ha establecido el indicador WUTF. Sin embargo, no se produce ninguna interrupción.

Mi ISR ​​simplemente enciende un LED y borra el indicador EXTI. Cuando hago, EXTI_SWIER |= BIT17;la interrupción se dispara correctamente (así que supongo que EXTI y NVIC están configurados correctamente). Mi problema es que aunque la interrupción está habilitada, RTC se está ejecutando, el indicador WUTF está configurado, la interrupción no ocurre. No tengo fallas duras, ni resets.

Este es mi código RTC:

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;

Este es mi registro de UART (se repite aproximadamente cada segundo):

------
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

Respuestas (1)

Culpa mía. La activación de RTC usa la línea 20 de EXTI, no la línea 17 (como lo hacen las alarmas de RTC) - tabla 53, RM0337 . Ahora funciona bien.