Deshabilitar la interrupción en ISR en STM32F4

0

¿Es posible desactivar una interrupción durante su rutina de servicio para evitar que vuelva a suceder durante algún tiempo?

Por ejemplo:

void TIM2_IRQHandler(void)
{

    if(TIM_GetITStatus(TIM2,TIM_IT_CC1) !=RESET)
    {
        //(some code)

       **TIM_ITConfig(TIM2,TIM_IT_CC1,DISABLE);**
       TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);
    }
}
    
pregunta Karol Żurowski

2 respuestas

2

Sí, puedes desactivar la fuente de interrupción dentro de la interrupción que estás manejando.

Este es realmente un procedimiento bastante común en cosas como USARTs, que pueden tener interrupciones como "TX buffer vacío". La interrupción se activa cuando el software necesita cargar un nuevo byte. Puede verificar si un búfer (circular) tiene algún byte restante. De lo contrario, el software debe deshabilitar esta interrupción; de lo contrario, el hardware seguiría solicitando la interrupción para nuevos bytes. La creación efectiva de un bucle infinito (ya que el "Bit Pendiente" se configura inmediatamente por el hardware nuevamente) no deja tiempo de CPU para la aplicación.

Sin embargo, volver a habilitar la interrupción "después de un tiempo" no ocurre por sí solo. Podría usar otro temporizador para esto, para crear el retraso que desea. O escriba una máquina de estados de algún tipo dentro del temporizador si desea usar la misma base de tiempo / fases. Otra solución es volver a habilitar la interrupción desde el código principal. Para repetir más en el ejemplo de USART: el software (por ejemplo, el código 'principal') puede volver a habilitar la interrupción vacía de TX una vez que tiene un nuevo búfer cargado que debe enviarse.

    
respondido por el Hans
0

siempre debe borrar la interrupción pendiente que hace que se ejecute la rutina de servicio de interrupción, en la rutina de servicio de interrupción. Lo ideal es comenzar con el periférico que causó la interrupción y despejar hacia la CPU si hay varios lugares donde está enclavado.

no siempre es posible, pero es una buena idea comprender la generación y la eliminación de la interrupción utilizando primero el sondeo porque es mucho más fácil, luego, una vez que se comprende todo, haga la última habilitación para permitir que la CPU vea la interrupción y llame a un manejador , aún se requiere depuración para eso, pero hay menos cosas que lo descarrilen en ese momento.

si dejar o no la interrupción activada y la devolución provoca otra interrupción inmediata o una instrucción posterior depende del diseño del sistema, pero puede suceder y sucede en algunos diseños. Del mismo modo, si hay una excepción adicional que sucedió mientras la lógica cambiaba a la interrupción o si estaba entregando la interrupción, es posible que no lo vuelva a interrumpir, antes de salir del controlador de interrupciones, debe sondear el periférico y manejar cualquier otro evento. repita hasta que no haya más eventos y salga del controlador (para los eventos que comparten una línea de interrupción en la CPU).

para un temporizador que es quizás lo que estás preguntando. borre la interrupción en el temporizador y otros cierres hacia la CPU. Si el temporizador requiere otra acción para reiniciar otro período de tiempo, este también sería el momento para hacerlo. si continúa automáticamente en el siguiente período de tiempo y solo necesita borrar la interrupción para obtener otra, entonces haga esto aquí en el controlador.

    
respondido por el old_timer

Lea otras preguntas en las etiquetas