Estoy intentando interrumpir en un controlador USART desde dentro de un controlador RTC_Alarm, pero no funciona.
He configurado el NVIC:
void NVIC_Configuration() {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4);
/* Configure UART IRQ */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Configure RTC Alarm IRQ */
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
También he notado que mi controlador SysTick tampoco se está ejecutando al ejecutar código dentro de los controladores RTC_Alarm.
¿Cómo obtengo la interrupción para anidar?
Aquí está parte del resto del código:
Por lo tanto, tengo este bucle esperando una interrupción de un UART para establecer el modo de corriente, pero la interrupción nunca ocurre. La misma interrupción funciona en el resto del código.
void RTCAlarm_IRQHandler() {
/* Reset the Alarm in 24 Hours */
RTC_Set_Alarm(FALSE, (Get_Alarm_Time() + 3600*24));
RTC_ClearITPendingBit(RTC_IT_ALR);
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
Op_Mode_Type SwapTemp = CurrentMode;
CurrentMode = ModeOnAlarm;
Alarm_Mode(SwapTemp);
}
void Alarm_Mode(Op_Mode_Type Initial_Mode) {
/* Enable USART Interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_EnableIRQ(USART1_IRQn);
switch (ModeOnAlarm)
{
case Op_Mode_Single_Color:
Set_Color(&Alarm_Color);
while(CurrentMode == Op_Mode_Single_Color); //TODO - Add Timeout + UART Isn't interrupting here
break;
//Some more cases here....
}
CurrentMode = Initial_Mode;
}
void USART1_IRQHandler() {
uint8_t data;
if (USART_GetITStatus(USART1,USART_IT_RXNE)) {
data = USART_ReceiveData(USART1);
CurrentMode = (Op_Mode_Type)(data);
USART_ClearITPendingBit(USART1, USART_IT_RXNE); // Clear interrupt flag
/* Disable USART Interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
NVIC_DisableIRQ(USART1_IRQn);
}
}
Funcionalmente no necesito usar la interrupción en este código, pero quiero entender por qué no funciona.