Estoy tratando de interrumpir 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 me di cuenta de que mi controlador SysTick tampoco se ejecuta mientras ejecuta el código dentro de los controladores RTC_Alarm.
¿Cómo obtengo la interrupción para anidar?
Aquí está parte del resto del código:
Así que tengo este ciclo esperando una interrupción de un UART para establecer el modo actual, 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, realmente no necesito usar la interrupción en este código, pero quiero entender por qué no funciona.
Dado que no ha asignado un grupo de prioridad NVIC, se deja con un valor predeterminado de 2. Esto significa que tiene 2 bits para la prioridad de preferencia y 2 bits para la subprioridad. Eso le permite usar niveles de prioridad de 0 a 3 (2^n). Los niveles de prioridad permitidos para cada grupo se ilustran en la siguiente tabla:
Como puede ver, se debe usar el Grupo 4 para establecer los niveles de prioridad de prioridad 0-15 .
Puede dejar el grupo sin asignar para la interrupción de UART (ya que se asignará al grupo 2 de forma predeterminada).
Para obtener más información y ejemplos, puede consultar este artículo.
Ok, aparentemente la biblioteca de periféricos estándar STM32 está totalmente rota. Usé NVIC_SetPriority para establecer la prioridad y finalmente funcionó.
Aquí está el código NVIC:
void NVIC_Configuration() {
NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(4,0,0));
NVIC_EnableIRQ(SysTick_IRQn);
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(4,1,0));
NVIC_EnableIRQ(USART1_IRQn);
NVIC_SetPriority(RTCAlarm_IRQn, NVIC_EncodePriority(4,15,0));
NVIC_EnableIRQ(RTCAlarm_IRQn);
}
Roh
Miguel
Roh
Miguel
Ashton H.
venny
Miguel
Miguel
Miguel
Ashton H.
Miguel