STM32F103, tiene problemas para anidar interrupciones

2

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.

    
pregunta Mike

2 respuestas

2

Ok, entonces aparentemente la Biblioteca Periférica Estándar STM32 está totalmente dañada. He usado NVIC_SetPriority para establecer la prioridad y finalmente funcionó.

Aquí está el código 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);

    NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(4,0,0));
    NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(4,1,0));
    NVIC_SetPriority(RTCAlarm_IRQn, NVIC_EncodePriority(4,15,0));

}
    
respondido por el Mike
4

Dado que no ha asignado el grupo de prioridad NVIC, se le deja un valor predeterminado de 2. Esto significa que tiene 2 bits para prioridad de prioridad y 2 bits para prioridad secundaria. 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:

Comopuedever,Grupo4debeutilizarseparaestablecerlosnivelesdeprioridaddepreferencia0-15.

PuededejarelgruposinasignarparalainterrupcióndeUART(yaqueseasignaráalgrupo2demanerapredeterminada).

Paraobtenermásinformaciónyejemplos,puedeconsultar este artículo.

    
respondido por el Ashton H.

Lea otras preguntas en las etiquetas