STM32L011 Función de activación de RTC

1

Tengo un dispositivo con batería restringida con STM32L011. Ahora mismo estoy usando la placa de desarrollo Nucleo-32. Al final, quiero usar el modo de suspensión con RTC para despertarme cada par de 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 el 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, la marca WUTF está activada, la interrupción no se produce. No tengo fallas ni reinicios.

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

1 respuesta

2

Mi mal. La activación de RTC utiliza la línea 20 de EXTI, no la línea 17 (como hacen las alarmas de RTC) - table 53, RM0337 . Ahora funciona bien.

    
respondido por el filo

Lea otras preguntas en las etiquetas