Estoy utilizando el módulo UART4 de un STM32F105. Estoy usando la interrupción RXNE ("RX Buffer Not Empty") para capturar los datos a medida que ingresan. Funciona como se esperaba.
Cuando la interrupción RXNE está habilitada, también habilita la interrupción de saturación (ORE). Esto también parece funcionar como se esperaba.
El indicador de estado ORE se asigna como USART_FLAG_ORE
. El indicador de interrupción correspondiente es USART_IT_ORE
. Si la interrupción de RXNE está habilitada, cuando se establece el bit de bandera, también se debe establecer el bit de TI. Copiado del Manual del usuario :
Estoy manejando la interrupción así:
void usartISR(void)
{
// Did we receive data?
if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET)
{
// Add it to the active buffer
}
// Did the receiver overrun?
else if(USART_GetITStatus(UART4, USART_IT_ORE) == SET)
{
// Clean up and clear the Overrun condition
}
// No other triggers have been enabled
else
{
ErrorHandler(ERR_BAD_INTERRUPT);
}
}
El problema ocurre si el indicador ORE ya está establecido cuando habilito la interrupción:
{
// The USART_FLAG_ORE bit is already set
// The following command causes an immediate vector to the ISR:
USART_IT_Config(UART4, USART_IT_RXNE, ENABLE);
}
Los vectores de código para el ISR, pero el indicador USART_IT_ORE
no parece establecerse. El ISR salta alegremente hasta el final y llama al controlador de errores. Si miro los registros USART_CR, ninguno de los otros eventos de interrupción están habilitados. Si omito el controlador de errores, el código se envía repetidamente al ISR, aunque no se hayan configurado indicadores de TI.
¿Por qué se activa el ISR sin que se establezca la marca USART_IT_ORE
? ¿Me estoy perdiendo algo obvio?