Categories: NoticiasTecnología

Comparación de interrupciones GPIO para tres microcontroladores populares de TI, Microchip y STMicro

Compare las interrupciones GPIO de tres microcontroladores populares: el Texas Instruments CC2544, el Microchip ATmega328P y el STMicroelectronics STM32L151C6.

Este artículo es la cuarta y última entrega de mi serie sobre concurrencia e interrupciones con interrupciones GPIO como ejemplo. Primero discutimos los conceptos básicos de concurrencia e interrupciones, interrupciones GPIO e interrupciones para periféricos de microcontroladores.

Aquí, compararemos las interrupciones de tres MCU:

Elegí los microcontroladores anteriores porque podía mostrar los productos familiares en los que se usan y darles relevancia en el mundo real.

Tenga en cuenta que todas las declaraciones que hago sobre cómo funcionan los microcontroladores en general o cómo funciona un microcontrolador en particular no son hechos inmutables. Mientras que en el caso de las declaraciones generales, hablaré sobre lo que se ha convertido en una práctica común, muchas de estas son decisiones de diseño que personas específicas han tomado para su producto en particular en función de varios factores. No tienen que existir de esa manera y podrían cambiar más adelante si un grupo diferente de personas con influencia similar toma decisiones de diseño diferentes. Entonces, cuando digo que un microcontrolador específico tiene 10 pines GPIO, lo que realmente quiero decir es que el equipo que diseñó el microcontrolador decidió proporcionar 10 pines GPIO para la versión actual a la que me refiero. Una versión futura puede tener más o menos pines GPIO.

Para ayudar a solidificar algunas de las ideas que he presentado a lo largo de esta serie, mostraré cómo cada uno de los tres microcontroladores de ejemplo implementa interrupciones GPIO y cómo activaría una interrupción en un pin particular para cada uno.

Texas Instruments CC2544

El primer microcontrolador que veremos es el CC2544 SoC de Texas Instruments.

Imagen de Texas Instruments

Pines GPIO con capacidades de interrupción

El CC2544 tiene 8 pines GPIO divididos en dos puertos (PORT0 y PORT1) con cuatro pines cada uno. Todos los pines tienen capacidades de interrupción y cada pin tiene una bandera de interrupción separada.

Configuración de interrupción

Los 8 pines se pueden configurar de forma independiente. Cada pin puede configurarse para detectar solo un borde ascendente (cambio de 0 a 1) o solo un borde descendente (cambio de 1 a 0). La interrupción de cada pin se puede habilitar o deshabilitar de forma independiente. El indicador de interrupción para un pin siempre se establece cuando se produce el evento para el que está configurado, independientemente de si la interrupción está habilitada o no.

Vector de interrupción, rutina de servicio y prioridades

Cada puerto tiene un vector de interrupción por puerto (PORT0 es P0INT y PORT1 es P1INT). Cada vector de interrupción se puede habilitar o deshabilitar individualmente. Cada vector también tiene un indicador de interrupción en el controlador de interrupción que se establece cuando la condición de interrupción está habilitada. No está claro en la documentación si los indicadores P0INT y P1INT se configuran solo si la interrupción del pin en el GPIO está habilitada. Supongo que este es el caso. Sin embargo, los indicadores P0INT y P1INT en el controlador de interrupción se configuran independientemente de si están habilitados dentro del controlador de interrupción; la CPU solo responderá a la interrupción si están habilitados.

Como los vectores de interrupción existen para el puerto, debe verificar los marcadores de pin en su ISR para averiguar qué pin de ese puerto generó la interrupción. También debe borrar las marcas de pin y la bandera de vector de interrupción en su ISR. Las banderas de pin deben borrarse primero antes de las banderas de vector de interrupción.

Para el CC2544 (en general), cada vector de interrupción no necesariamente tiene una prioridad separada que se puede establecer directamente. Cada vector de interrupción es parte de un grupo con, como máximo, otros dos vectores de interrupción. La prioridad se asigna al grupo y puede establecer la prioridad del grupo. Sin embargo, existe un orden predeterminado de interrupciones de manejo si tienen la misma prioridad. P0INT y P1INT pertenecen a diferentes grupos de prioridad de interrupción, por lo que al centrarse solo en esos dos, puede controlar el orden en que se manejan.

Los ISR en el CC2544 pueden ser reemplazados por interrupciones de mayor prioridad.

Microchip ATmega328P

El segundo en nuestra lista es el microcontrolador AVR ATmega328P de 8 bits.

Imagen de Microchip

Pines GPIO con capacidades de interrupción

El ATmega328P tiene 23 pines GPIO divididos en tres puertos: PORTB (ocho pines), PORTC (siete pines) y PORTD (ocho pines). Todos los pines tienen capacidades de interrupción a través de una interrupción de cambio de pin. Sin embargo, no hay indicadores de pin de interrupción individuales. En cambio, cada puerto tiene un indicador de interrupción, excepto dos pines en PORTD, que pueden configurarse como interrupciones externas. Tienen banderas de interrupción separadas.

Configuración de interrupción

Las 23 interrupciones de cambio de pines están preestablecidas para detectar un cambio lógico en el valor de los pines (0 a 1 o 1 a 0). Sin embargo, las dos interrupciones externas se pueden configurar para detectar un valor lógico, solo un flanco ascendente (cambio de 0 a 1), solo un flanco descendente (cambio de 1 a 0) o un valor estable de 0. La interrupción de cambio de pin de cada pin se puede habilitar o deshabilitar de forma independiente. Además, la interrupción de cada puerto se puede habilitar o deshabilitar.

El indicador de interrupción para el puerto o cualquiera de los pines externos siempre se establece cuando se produce el evento para el que está configurado, independientemente de si la interrupción está habilitada o deshabilitada. Además, la bandera se establecerá independientemente de si el pin está configurado como salida o entrada.

Vector de interrupción, rutina de servicio y prioridades

Cada puerto tiene un vector de interrupción por puerto (PORTB es PCINT0, PORTC es PCINT1, PORTD es PCINT2). Además, cada pin de interrupción externo tiene su propio vector separado (el pin 2 en PORTD es INT0 y el pin 3 en PORTD es INT1). Cada vector de interrupción se puede habilitar o deshabilitar individualmente, pero esto se hace en el periférico GPIO y no en el controlador de interrupción (es decir, el controlador de interrupción no tiene capacidades de habilitación de vector de interrupción separadas, y todas las habilitaciones de vector de interrupción se realizan en los periféricos).

Dado que los vectores de interrupción existen para el puerto, para las interrupciones de cambio de pin, debe averiguar qué pin y qué evento desencadenó la interrupción en su ISR. Esto requeriría leer la máscara de interrupción para el puerto (para averiguar qué pines de interrupciones están habilitados) y el valor actual del pin para averiguar qué cambio lógico ocurrió. Sin embargo, para las dos interrupciones externas, ya sabrá qué pin causó la interrupción porque cada pin tiene un vector separado. El hardware borra automáticamente el indicador de interrupción para las interrupciones externas, aunque también puede borrarlas a través de su código, para estar seguro.

Para el ATmega328P, las prioridades de interrupción son fijas y no se pueden cambiar. Después de la interrupción de reinicio, las interrupciones del pin tienen la máxima prioridad entre todas las interrupciones en orden INT0, INT1, PCINT0, PCINT1, PCINT2.

Los ISR en el ATmega328P pueden ser reemplazados por interrupciones de mayor prioridad, pero esto no sucede automáticamente. Cuando se inicia un ISR, la CPU desactiva todas las interrupciones. Debe habilitar manualmente las interrupciones en su código ISR para permitir la preferencia. Además, hay un registro llamado registro de estado AVR que forma parte de la CPU, cuyo valor la CPU no almacena automáticamente antes de ingresar una interrupción o restaurar después de salir de la interrupción. Tiene que almacenar y restaurar el valor en su ISR. La razón por la que debe hacer esto es porque la CPU debe reanudarse en el estado en que estaba antes de que ocurriera la interrupción. Es posible que las acciones que realice en su ISR puedan modificar este registro, por lo que si no mantiene el valor que tenía antes de que sus acciones comiencen y lo restauren, la CPU volverá a un estado diferente después de su interrupción y podría crear para encontrar errores en su sistema.

STMicroelectronics STM32L151C6

La MCU final que consideraremos es la MCU STM32L151C6 de 32 bits.

Imagen de STMicroelectronics a través de Digi-Key

Pines GPIO con capacidades de interrupción

El STM32L151C6 tiene 37 pines GPIO, pero solo 16 de ellos se pueden configurar para generar interrupciones (llamadas interrupciones externas) en cualquier momento. También hay algunas restricciones sobre qué pines se pueden configurar para ser interrupciones al mismo tiempo.

Los 37 pines se dividen en cuatro puertos:

  • PA (16 pines)
  • PB (16 pines)
  • PC (3 pines)
  • PH (2 pines)

Para PA y PB, los pines están etiquetados de 0 a 15. La PC tiene pines 13–15, y PH tiene pines 0 y 1. Todos los pines con la misma etiqueta numérica (por ejemplo, PA0, PB0 y PH0) comparten una línea de interrupción externa ( interrupción externa 0), por lo que solo uno de ellos se puede configurar para que sea la interrupción en cualquier momento.

A diferencia de ATmege328P y CC2544, hay un dispositivo externo independiente para el manejo de interrupciones, independiente del periférico GPIO que maneja las interrupciones de clavijas. Este dispositivo también es diferente del controlador de interrupción general para el microcontrolador. Cada interrupción externa tiene su propia bandera.

Configuración de interrupción

Cada línea de interrupción externa debe configurarse para el pin GPIO que genera la interrupción en esa línea. Cada interrupción externa se puede configurar para detectar un cambio lógico (0 a 1 o 1 a 0), solo un borde ascendente (cambio de 0 a 1) o solo un borde descendente (cambio de 1 a 0). Esto se debe a que el periférico es de diseño, por lo que puede activar o desactivar la detección de borde ascendente y descendente de forma independiente. Cada interrupción se puede habilitar y deshabilitar de forma independiente. A diferencia del CC2544 y el ATmege328P, el indicador de interrupción para una interrupción externa solo se establece si la interrupción está habilitada.

Vector de interrupción, rutina de servicio y prioridades

Las interrupciones externas de 0 a 4 tienen cada una su propio vector de interrupción separado. Las interrupciones externas 5 a 9 comparten un vector de interrupción, y las interrupciones 10 a 15 también comparten un vector de interrupción. Esto significa que hay siete vectores de interrupción totales relacionados con las interrupciones GPIO. Cada uno de estos vectores se puede habilitar o deshabilitar de forma independiente. Cada vector también tiene su propia bandera en el controlador de interrupción.

El ISR debe borrar el indicador de interrupción en el módulo de interrupciones externas (GPIO), así como en el controlador de interrupción. La documentación no aclara el orden en que se debe hacer esto, pero tiene más sentido seguir el enfoque CC2544 de borrar los indicadores GPIO primero antes de los indicadores de vector de interrupción.

Las prioridades en el STML151C6 son un poco más complicadas en la forma en que se configuran y cómo permiten la preferencia. Hay dos formas de configurar las prioridades. La forma más simple es usar niveles de prioridad. Hay 16 niveles de prioridad diferentes. Solo se usa el nivel de prioridad para determinar la preferencia, por lo que una interrupción con un nivel de prioridad más alto puede evitar una interrupción que la CPU está manejando actualmente. Cada vector de interrupción tiene un número de interrupción único. Si dos interrupciones con los mismos niveles de prioridad esperan a la CPU, la CPU seleccionará la que tenga el número de interrupción más bajo una vez que pueda. Sin embargo, una interrupción con un número de interrupción más bajo no puede adelantarse a otra interrupción con un número de prioridad más alto, incluso cuando tienen el mismo nivel de prioridad.

El segundo enfoque para interrumpir la configuración es utilizar las prioridades y subprioridades del grupo. El número de diferentes grupos y subprioridades también es configurable. Independientemente de la configuración particular, la prioridad del grupo funciona como el nivel de prioridad. Las interrupciones con mayor prioridad de grupo pueden evitar las interrupciones con menor prioridad de grupo. La subprioridad y el número de interrupción se utilizan para determinar qué interrupción se ejecuta si dos o más interrupciones con la misma prioridad de grupo están esperando en la CPU. La subprioridad se usa primero. El que tiene la subprioridad más alta se maneja antes que el que tiene la subprioridad más baja. Si ambos comparten la misma subprioridad, entonces el que tiene un número de interrupción más bajo se maneja primero.


Esto concluye nuestra serie sobre concurrencia e interrupciones GPIO. Si tiene alguna pregunta sobre la información presentada aquí, háganos saber en los comentarios a continuación.

ga('create', 'UA-1454132-1', 'auto'); ga('require', 'GTM-MMWSMVL'); ga('require', 'displayfeatures'); ga('set',{'dimension1':'embedded,computers-peripherals,digital-ics,connectors,embedded,embedded-software,engineering-consulting'}); ga('set',{'contentGroup1':'embedded,computers-peripherals,digital-ics,connectors,embedded,embedded-software,engineering-consulting'});

ga('set',{'dimension3':"October 05, 2019"});

ga('set',{'dimension4':"Philip Asare"});

ga('send', 'pageview');

!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1808435332737507'); // Insert your pixel ID here. fbq('track', 'PageView'); fbq('track', 'ViewContent', { content_ids: ['embedded','computers-peripherals','digital-ics','connectors','embedded','embedded-software','engineering-consulting'], content_type: 'category'});

_linkedin_data_partner_id = "353081"; (function(){var s = document.getElementsByTagName("script")[0]; var b = document.createElement("script"); b.type = "text/javascript";b.async = true; b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; s.parentNode.insertBefore(b, s);})(); } if(jstz.determine().name().indexOf("Europe") === -1) { showSocialCode(); // NOT EU } else { showSocialCode(); window.addEventListener("load", function () { window.cookieconsent.initialise({ "palette": { "popup": { "background": "#252e39" }, "button": { "background": "#14a7d0" } }, "type": "opt-out", "content": { "message": "This website uses tracking cookies to ensure you get the best experience on our website.", "href": "https://www.allaboutcircuits.com/privacy-policy/", "dismiss": "OK, GOT IT" }, onInitialise: function (status) { var type = this.options.type; var didConsent = this.hasConsented(); if (type == 'opt-out' && didConsent) { console.log("eu"); //showSocialCode(); } },

onStatusChange: function (status, chosenBefore) { var type = this.options.type; var didConsent = this.hasConsented(); if (type == 'opt-out' && didConsent) { console.log("eu"); //showSocialCode(); } },

onRevokeChoice: function () { var type = this.options.type; if (type == 'opt-out') { console.log("eu"); //showSocialCode(); } },

}) }); }

Maria Montero

Me apasiona la fotografía y la tecnología que nos permite hacer todo lo que siempre soñamos. Soñadora y luchadora. Actualmente residiendo en Madrid.

Recent Posts

Máquina de mano Lean, Green, Raspberry Pi

Los días felices de la PDA y Blackberry han quedado definitivamente atrás, pero el factor…

2 years ago

Cómo pronosticar series de tiempo usando autorregresión

Tutorial sobre cómo pronosticar usando un modelo autorregresivo en PythonFoto de Aron Visuals en UnsplashForecasting…

2 years ago

Aquí están todas las formas en que puede cargar su AirPods Pro

Si tienes un iPhone, los AirPods Pro son la opción obvia para escuchar música, ¡aunque…

2 years ago

Las principales noticias tecnológicas del lunes: la prohibición de clientes de terceros de Twitter parece no ser un accidente

Ilustración de Alex Castro / The Verge Plus nuevos rumores sobre el quinto Galaxy Fold.…

2 years ago

AirPods Max 2: aquí están las características más solicitadas

Se rumorea que los auriculares premium de próxima generación de Apple, los AirPods Max 2,…

2 years ago

El remake de Dead Space continúa luciendo terriblemente genial en el nuevo tráiler de la historia

El desarrollador Motive Studio y el editor EA han lanzado un nuevo tráiler de la…

2 years ago