- Tipos de interrupciones e ISR
- Sintaxis para interrupción en STM32
- Componentes requeridos
- Diagrama de circuito y conexiones
- Programación STM32F103C8 para interrupciones
Las interrupciones son un mecanismo por el cual una E / S o una instrucción puede suspender la ejecución normal del procesador y se repara como si tuviera la máxima prioridad. Como por ejemplo, un procesador que realiza una ejecución normal también puede monitorear continuamente por algún tipo de evento o interrupción. Es entonces cuando ocurre una interrupción externa (como de algún sensor) entonces el procesador pausa su ejecución normal y primero sirve la interrupción y luego continúa su ejecución normal.
Aquí en este proyecto, para comprender las interrupciones en STM32F103C8, usaremos el botón pulsador como interrupción externa. Aquí incrementaremos un número desde 0 y lo mostraremos en una pantalla LCD de 16x2, y cada vez que se presiona el botón pulsador, el LED se enciende y la pantalla LCD muestra INTERRUPCIÓN. El LED se apaga tan pronto como se suelta el botón.
Tipos de interrupciones e ISR
Las interrupciones se pueden clasificar en dos tipos:
Interrupciones de hardware: Si la señal al procesador proviene de algún dispositivo externo, como un botón o sensor, o de algún otro dispositivo de hardware que genera una señal y le dice al procesador que realice una tarea particular presente en ISR, se conoce como interrupciones de hardware.
Interrupciones de software: las interrupciones que son generadas por las instrucciones del software.
Interrumpir la rutina del servicio
La rutina de servicio de interrupción o un controlador de interrupción es un evento que tiene un pequeño conjunto de instrucciones y cuando se produce una interrupción, el procesador primero ejecuta este código que está presente en ISR y luego continúa con la tarea que estaba haciendo antes de la interrupción.
Sintaxis para interrupción en STM32
ISR tiene la siguiente sintaxis attachInterrupt (digitalPinToInterrupt (pin), ISR, modo) en Arduino y lo mismo también se puede usar en STM32 ya que usamos arduino IDE para cargar código.
- digitalPinToInterrupt (pin): Como en la placa Arduino Uno tenemos los pines 2,3 y en mega tenemos 2,3,18,19,20,21 para las interrupciones. En STM32F103C8 también tenemos pines de interrupción, cualquier pines GPIO se pueden usar para interrupciones. Solo debemos especificar el pin de entrada que estamos usando para interrumpir. Pero mientras usamos más de una interrupción al mismo tiempo, es posible que debamos seguir algunas restricciones.
- ISR: Es una función de manejo de interrupciones que se llama cuando se produce una interrupción externa. No tiene argumentos y tipo de retorno nulo.
- Modo: tipo de transición para activar la interrupción
- RISING: Para activar una interrupción cuando el pin pasa de BAJO a ALTO.
- FALLING: Para activar una interrupción cuando el pin pasa de HIGH a LOW.
- CAMBIO: Para activar una interrupción cuando el pin pasa de BAJO a ALTO o de ALTO a BAJO (es decir, cuando cambia el pin).
Algunas condiciones durante el uso de interrupción
- La función de rutina de servicio de interrupción (ISR) debe ser lo más corta posible.
- La función Delay () no funciona dentro de ISR y debe evitarse.
Componentes requeridos
- STM32F103C8
- Presionar el botón
- LED
- Resistencia (10 K)
- LCD (16x2)
Diagrama de circuito y conexiones
Un lado del pin del botón pulsador está conectado a 3.3V de STM32 y el otro lado está conectado al pin de entrada (PA0) de STM32 a través de una resistencia desplegable.
La resistencia Pull Down se usa para que el microcontrolador solo obtenga ALTO o BAJO en su entrada cuando se presiona o suelta el botón. De lo contrario, sin resistencia desplegable, MCU puede confundirse y alimentar algunos valores flotantes aleatorios a la entrada.
Conexión entre STM32F103C8 y LCD
La siguiente tabla muestra la conexión de pines entre LCD (16X2) y el microcontrolador STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Al PIN central del potenciómetro |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
mi |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
UN |
GND |
K |
Programación STM32F103C8 para interrupciones
El programa para este tutorial es simple y se encuentra al final de este tutorial. No necesitamos un programador FTDI para programar STM32, simplemente conecte su PC al puerto USB de STM32 y comience a programar con Arduino IDE. Obtenga más información sobre la programación de STM32 a través del puerto USB.
Como dijimos, aquí en este tutorial vamos a incrementar un número desde 0 y mostrarlo en una pantalla LCD de 16x2 y cada vez que se presiona un botón, el LED se enciende y la pantalla LCD muestra 'INTERRUPCIÓN'.
Primero defina las conexiones de los pines LCD con STM32. Puede modificarlo según sus requisitos.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
A continuación, incluimos el archivo de encabezado para la pantalla LCD. Esto llama a la biblioteca que contiene el código de cómo el STM32 debe comunicarse con la pantalla LCD. También asegúrese de que se llame a la función LiquidCrystal con los nombres de los pines que acabamos de definir anteriormente.
incluir
Las variables globales se utilizan para pasar datos entre ISR y el programa principal. Declaramos la variable ledOn como volátil y también como booleana para especificar Verdadero o Falso.
volátil booleano ledOn = falso;
Dentro de la función void setup () , mostraremos un mensaje de introducción y lo borraremos después de 2 segundos.
lcd.begin (16,2); lcd.print ("RESUMEN DEL CIRCUITO"); retraso (2000); lcd.clear ();
Nuevamente, en la misma función void setup () , necesitamos especificar los pines de entrada y salida. Configuramos el pin PA1 para salida a LED y PA0 para entrada desde el botón pulsador.
pinMode (PA1, SALIDA) pinMode (PA0, INPUT)
También vamos a incrementar un número, así que declara una variable con valor cero.
int i = 0;
Ahora la parte importante del código es la función attachInterrupt () , también se incluye dentro de la configuración void ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Especificamos el pin PA0 para interrupción externa, y buttonPressed es la función a la que se llamará cuando haya CAMBIO (LOW a HIGH o HIGH a LOW) en el pin PA0. También puede utilizar cualquier otro nombre de función, pin y modo según los requisitos.
Dentro del bucle vacío () incrementamos un número (i) desde cero e imprimimos el número en LCD (16x2).
lcd.clear (); lcd.print ("NÚMERO:"); lcd.print (i); ++ i; retraso (1000);
La parte más importante es crear una función de manejo de interrupciones de acuerdo con el nombre que usamos en la función attachInterrupt () . Usamos buttonPressed así que aquí hemos creado una función void buttonPressed ()
anular buttonPressed () { if (ledOn) { ledOn = falso; escritura digital (PA1, BAJA); } else { ledOn = true; escritura digital (PA1, ALTA); lcd.setCursor (0,1); lcd.print ("Interrupción"); } }
Funcionamiento de este botón Presionado () ISR:
Según el valor de la variable ledOn , el LED se enciende y apaga.
ESTADO DEL BOTÓN |
ledOn (valor) |
LED (rojo) |
LCD (16x2) |
SIN PRENSA |
Falso |
APAGADO |
- |
PRESIONADO |
Cierto |
EN |
Muestra '' INTERRUPCIÓN ' |
Si el valor de ledOn es falso, entonces el LED permanece apagado y si el valor de ledOn es verdadero, entonces el LED se enciende y la pantalla LCD muestra 'Interrupt'.
NOTA: A veces puede haber un efecto antirrebote del interruptor y puede contar varios disparos cuando se presiona el botón pulsador, esto se debe a varios picos de voltaje debido a razones mecánicas del interruptor pulsador. Esto se puede reducir introduciendo un filtro RC.
El funcionamiento completo de las interrupciones en STM32F103C8 se muestra en el siguiente video.