[Internet de las cosas] ¿No está claro el mecanismo de interrupción de STM32? Basta con leer este artículo.

En los sistemas integrados, las interrupciones son un mecanismo importante para manejar eventos asincrónicos de dispositivos externos. Los microcontroladores de la serie STM32 proporcionan un potente controlador de interrupciones que puede manejar fácilmente varias interrupciones externas e internas. Este artículo presentará en detalle la estructura y el uso de las interrupciones STM32.
Insertar descripción de la imagen aquí



1. ¿Qué es la interrupción?

Una interrupción es un mecanismo en un sistema informático que se utiliza para manejar eventos inesperados o asincrónicos. Durante el funcionamiento de la computadora, la CPU generalmente ejecuta las instrucciones en secuencia, sin embargo, cuando ocurren ciertos eventos especiales, como entradas de dispositivos externos, desbordamiento del temporizador, etc., la CPU necesita interrumpir inmediatamente la tarea actual y en su lugar procesarlas. tareas evento. Esto mejora la velocidad de respuesta y la eficiencia del sistema.

La interrupción puede verse como una interrupción repentina, similar a cuando estamos haciendo algo y de repente recibimos una llamada telefónica, necesitamos detener inmediatamente lo que estamos haciendo para contestar el teléfono. Las interrupciones se pueden dividir en dos tipos : interrupciones de hardware e interrupciones de software .

Insertar descripción de la imagen aquí

Las interrupciones de hardware son provocadas por dispositivos externos, como entradas de teclado, clics del mouse, etc. Cuando un dispositivo externo activa una señal de interrupción, la CPU detendrá inmediatamente la tarea actual y ejecutará el programa de procesamiento relacionado con la interrupción. Después de manejar la interrupción, la CPU regresará al lugar donde fue interrumpida y continuará la ejecución.

Las interrupciones de software se activan mediante instrucciones especiales en el programa. El programa puede solicitar activamente a la CPU que interrumpa la tarea actual mediante instrucciones de interrupción del software y ejecutar procedimientos de procesamiento relacionados con las interrupciones. Las interrupciones de software se pueden utilizar para implementar funciones específicas, como llamadas al sistema desde el sistema operativo.


2. Prioridad de interrupción

En el microcontrolador STM32, la prioridad de interrupción se utiliza para determinar el orden en que se ejecuta la **rutina de servicio de interrupción (ISR)**. Los microcontroladores de la serie STM32 admiten múltiples fuentes de interrupción y cada fuente de interrupción tiene una prioridad de interrupción correspondiente.

La prioridad de interrupción se puede dividir en dos niveles: prioridad de preferencia y subprioridad .

Insertar descripción de la imagen aquí

  1. Prioridad de preferencia : la prioridad de preferencia determina qué interrupción puede interrumpir la interrupción que se está ejecutando actualmente cuando ocurren múltiples interrupciones al mismo tiempo. Una interrupción con una prioridad de preferencia más alta puede interrumpir una interrupción de menor prioridad en ejecución y ejecutar inmediatamente su propia rutina de servicio de interrupción.
  1. Subprioridad : la subprioridad se utiliza para determinar qué interrupción se ejecutará primero entre múltiples interrupciones del mismo nivel de prioridad de preferencia. Las interrupciones con niveles de subprioridad más altos se ejecutarán antes que otras interrupciones con el mismo nivel de prioridad de preferencia.

2.1 ¿Por qué necesitamos una subprioridad cuando existe una prioridad de preferencia?

La combinación de prioridad preventiva y subprioridad puede proporcionar un control y una programación de interrupciones más flexibles. La prioridad de preferencia se usa principalmente para manejar la relación de preferencia de interrupción cuando ocurren múltiples interrupciones al mismo tiempo, mientras que la subprioridad se usa para manejar el orden de ejecución de múltiples interrupciones con la misma prioridad de preferencia.

El uso de prioridad preventiva puede garantizar que las interrupciones críticas puedan interrumpir rápidamente la interrupción de baja prioridad en ejecución y ejecutar inmediatamente su propia rutina de servicio de interrupción. Esto es muy importante para aplicaciones con altos requisitos de tiempo real.

Sin embargo, cuando varias interrupciones tienen la misma prioridad de preferencia, sin soporte de subprioridad, se ejecutarán en secuencia y no se podrá realizar una programación más detallada. Generalmente, la cantidad de bits en el nivel de prioridad de preferencia es mayor que la cantidad de bits en el nivel de subprioridad, por lo que el rango de niveles de prioridad de preferencia es más amplio y puede proporcionar un control de interrupciones más detallado. Al utilizar subprioridades, puede determinar qué interrupción ejecutar primero entre múltiples interrupciones del mismo nivel de prioridad de preferencia. Esto es útil para aplicaciones que necesitan priorizar ciertas interrupciones.


3. Interrumpir el anidamiento

El anidamiento de interrupciones significa que durante la ejecución de una rutina de servicio de interrupción (ISR), se produce otra interrupción y desencadena la ejecución de la rutina de servicio de interrupción correspondiente. Cuando se procesa una interrupción, si ocurre una interrupción de mayor prioridad, el sistema suspenderá el procesamiento de la interrupción actual y cambiará al procesamiento de la interrupción de mayor prioridad, lo que se denomina anidamiento de interrupciones.

Insertar descripción de la imagen aquí

El anidamiento de interrupciones es muy común en los sistemas en tiempo real, lo que permite que el sistema responda a solicitudes de interrupción de mayor prioridad de manera oportuna mientras procesa una interrupción. A través del anidamiento de interrupciones, se pueden priorizar y procesar múltiples solicitudes de interrupción para garantizar que las interrupciones clave puedan interrumpir rápidamente la interrupción de menor prioridad en ejecución y ejecutar inmediatamente su propia rutina de servicio de interrupción.

En los microcontroladores STM32, el anidamiento de interrupciones se implementa mediante prioridades y subprioridades de preferencia. Cuando se ejecuta una interrupción, si se produce una solicitud de interrupción con una prioridad de preferencia más alta, el sistema interrumpirá inmediatamente la ejecución de la interrupción actual y comenzará a procesar la interrupción de mayor prioridad. Si varias interrupciones tienen la misma prioridad de preferencia, la subprioridad determina el orden en que se ejecutan.

El anidamiento de interrupciones puede introducir algunos problemas. Por ejemplo, una profundidad excesiva del anidamiento de interrupciones puede provocar una degradación del rendimiento del sistema. Al mismo tiempo, las prioridades de interrupción y los problemas de exclusión mutua y sincronización de las rutinas del servicio de interrupción deben manejarse razonablemente para garantizar la corrección y confiabilidad de el sistema. .


4. Estructura de interrupción

4.1 Tabla de vectores de interrupción : La tabla de vectores de interrupción es una estructura de datos que almacena direcciones de vectores de interrupción y se utiliza para almacenar la dirección de entrada de la función de servicio de interrupción. Cuando ocurre una interrupción, el microcontrolador leerá la dirección ISR correspondiente de la tabla de vectores de interrupción de acuerdo con el número de interrupción y saltará a esta dirección para ejecutar la rutina de servicio de interrupción. En STM32, la tabla de vectores de interrupción se almacena en la dirección inicial de la memoria flash interna.

El tamaño de la tabla de vectores de interrupciones depende de la cantidad de interrupciones admitidas por el microcontrolador. Para los microcontroladores de la serie STM32, generalmente se usa el método de procesamiento de interrupciones basado en la tabla de vectores, en el que el tamaño de la tabla de vectores de interrupciones es fijo y el tamaño de cada vector de interrupciones es de 4 bytes. Por lo tanto, el tamaño de la tabla de vectores de interrupciones es igual al número de interrupciones multiplicado por 4 bytes.

En programación, podemos especificar la dirección ISR de cada interrupción modificando el vector de interrupción en la tabla de vectores de interrupción. Por lo general, utilizamos la sintaxis específica proporcionada por el compilador para definir la tabla de vectores de interrupción y la rutina del servicio de interrupción y colocarlas en la ubicación de dirección correcta.

Cabe señalar que la tabla de vectores de interrupción es de solo lectura y almacena la dirección de la rutina del servicio de interrupción determinada por el sistema en el momento de la compilación. Por lo tanto, la tabla de vectores de interrupción no se puede modificar en tiempo de ejecución. Si necesita cambiar dinámicamente la dirección de ejecución de la rutina del servicio de interrupción, puede utilizar la tecnología de redirección de vector de interrupción, es decir, modificando el vector de interrupción en la tabla de vectores de interrupción, redirigir la interrupción a otra dirección. Pero esta técnica debe utilizarse con cuidado para evitar introducir errores impredecibles.

Insertar descripción de la imagen aquí


4.2 Controlador de interrupciones (Controlador de interrupciones vectorizado anidado, NVIC) : NVIC es el componente central del controlador de interrupciones STM32 y se utiliza para gestionar y controlar las interrupciones. Admite prioridad de interrupción de varios niveles, puede configurar la prioridad de interrupción, habilitar o deshabilitar interrupciones y proporcionar la dirección de la tabla de vectores de interrupción.

Insertar descripción de la imagen aquí

NVIC tiene las siguientes funciones principales:

  • Gestión de prioridad de interrupción: NVIC permite asignar a cada interrupción una prioridad de preferencia y una subprioridad. La prioridad de preferencia se usa para determinar la relación de preferencia de las interrupciones, mientras que la subprioridad se usa para determinar el orden de ejecución de múltiples interrupciones con la misma prioridad de preferencia. NVIC proporciona registros para configurar y gestionar las prioridades de interrupción.

  • Control de activación/desactivación de interrupciones: NVIC proporciona registros para activar o desactivar interrupciones específicas. Las interrupciones se pueden habilitar o deshabilitar selectivamente configurando los bits correspondientes. Esto es útil para controlar de manera flexible la activación y ejecución de interrupciones.

  • Gestión del estado de interrupción: NVIC proporciona registros para gestionar el estado de interrupción. Por ejemplo, puede determinar si una interrupción está pendiente leyendo y escribiendo el registro de interrupción pendiente y borrar el indicador de interrupción escribiendo en el registro de eliminación de interrupciones.

  • Desplazamiento de la tabla de vectores de interrupción: NVIC permite modificar la dirección inicial de la tabla de vectores de interrupción estableciendo el desplazamiento. Esto es útil para implementar la redirección del vector de interrupción, que redirige las interrupciones a otras direcciones.


4.3 Rutina de servicio de interrupción (ISR) : la función de servicio de interrupción es un bloque de código que se ejecuta cuando ocurre una interrupción. En STM32, las funciones del servicio de interrupción deben utilizar declaraciones de funciones específicas y reglas de nomenclatura, y registrarse a través de la tabla de vectores de interrupción.

Insertar descripción de la imagen aquí


5. Cómo utilizar interrupciones

  1. Configure la prioridad de interrupción: primero, debe usar NVIC_SetPriority()funciones para establecer la prioridad de preferencia y la subprioridad de la interrupción. Los parámetros de esta función incluyen el número del canal de interrupción y el valor de prioridad.

  2. Inicialice la tabla de vectores de interrupción: en el código de inicio, es necesario inicializar la dirección inicial de la tabla de vectores de interrupción. Puede utilizar NVIC_SetVectorTable()funciones para establecer la dirección de desplazamiento de la tabla de vectores de interrupción.

  3. Registrar la función del controlador de interrupciones: utilice NVIC_Init()la función para registrar la función del controlador de interrupciones. Los parámetros de esta función incluyen el número del canal de interrupción, la prioridad de interrupción y la dirección de la función de manejo de interrupciones.

  4. Habilitar interrupciones: utilice NVIC_EnableIRQ()la función para habilitar interrupciones. El parámetro de esta función es el número del canal de interrupción.

  5. Escriba una función de manejo de interrupciones: escriba una función de manejo de interrupciones para manejar la lógica cuando ocurre un evento de interrupción. El nombre y los parámetros de la función del controlador de interrupciones dependen del canal de interrupción y del lenguaje de programación utilizado.

El siguiente es un código de muestra que demuestra cómo implementar una interrupción utilizando funciones de biblioteca periférica estándar:

#include "stm32f10x.h"

// 中断处理函数
void EXTI0_IRQHandler(void)
{
    
    
    // 处理中断事件逻辑
    // ...

    // 清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line0);
}

int main(void)
{
    
    
    // 初始化中断向量表
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

    // 配置中断优先级
    NVIC_SetPriority(EXTI0_IRQn, 0);

    // 注册中断处理函数
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 使能中断
    NVIC_EnableIRQ(EXTI0_IRQn);

    while (1)
    {
    
    
        // 主循环逻辑
        // ...
    }
}

Resumir

Las interrupciones STM32 proporcionan funciones poderosas que pueden manejar fácilmente varias interrupciones externas e internas. Al configurar adecuadamente las prioridades de interrupción y las funciones del servicio de interrupción, se puede lograr una respuesta oportuna a eventos asincrónicos. En aplicaciones prácticas, es necesario utilizar racionalmente la función de interrupción de acuerdo con las necesidades específicas y el equipo de hardware para mejorar la confiabilidad y el rendimiento del sistema.

Supongo que te gusta

Origin blog.csdn.net/Goforyouqp/article/details/133578568
Recomendado
Clasificación