Bienvenido: Ingresar
location: Diferencias para "WebHome/Hardware/CortexNVIC"
Diferencias entre las revisiones 2 y 4 (abarca 2 versiones)
Versión 2 con fecha 2015-10-16 14:13:51
Tamaño: 2958
Comentario:
Versión 4 con fecha 2015-10-16 15:13:42
Tamaño: 4126
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 10: Línea 10:
El primer paso es configurar al periférico que queramos atender por interrupción, en general estos periféricos generan mas de un proceso y es en la etapa de configuración donde debemos decidir cuales y cuantos de estos procesos generarán interrupción.
Por ejemplo la UART es un periférico que generalmente se atiende por interrupción, esto es debido a que es un evento asíncrono y relativamente lento (configurado a 9600 baudios significa que se recibe o se transmite 1 byte cada aprox. 1 ms o 2x10^5 instrucciones en un micro de 200MHz).
Además de configurar el periférico para su funcionamiento de acuerdo a los requerimientos de la aplicación, se deberá definir cuales y cuantos eventos del mismo generarán interrupción, debido a que en general estos periféricos generan mas de un evento. Podemos citar por ejemplo la UART, este periférico generalmente se atiende por interrupción, por ser un evento asíncrono y relativamente lento (configurado a 9600 baudios significa que se recibe o se transmite 1 byte cada aprox. 1 ms o 2x10^5 instrucciones en un micro de 200MHz).
Línea 16: Línea 15:
Una vez definido el periférico, debe configurarse elk controlador de interrupciones para que efectivamente atienda a la interrupción, en este paso se define además la prioridad, la NVIC perimite 255 niveles de prioridad siendo el 0 la mas alta, bajando la prioridad cuando subimos el valor. Una vez definido el periférico, debe configurarse el controlador de interrupciones para que efectivamente atienda a la interrupción, en este paso se define además la prioridad, la NVIC perimite 255 niveles de prioridad siendo el 0 la mas alta, bajando la prioridad cuando subimos el valor.
Línea 18: Línea 17:
== Vector de Interrupción ==  == Vector de Interrupción ==
Línea 21: Línea 20:
== Ejemplo ==  == Ejemplo ==
Línea 23: Línea 22:
El funcionamiento del mismo será el siguiente: Se utiliza el periférico timer para que cuente hasta un valor determinado que implicará un retardo de 1 ms, esto generará una interrupción, dentro de la misma se incrementa una variable global, luego se realizará una función retardo que simplemente colocará a 0 la variable global y un bucle esperará que esa variable se incremente al valor deseado, generando "N" x 1ms = "N" ms de retardo El funcionamiento del mismo será el siguiente:
Línea 25: Línea 24:
=== Configuración del periférico y NVIC === Se utiliza el periférico Repetitive Interrupt Timer (RIT), es un contador muy sencillo que permite realizar cuentas o interrupciones a intervalos definidos sin la necesidad de utilizar los contadores generales que dispone el micro. Se configura este timer para que cuente hasta un valor determinado que implicará un retardo de 1 ms generando una interrupción, dentro de la misma se incrementa una variable global, luego se realizará una función retardo que simplemente colocará a 0 la variable global y un bucle esperará que esa variable se incremente al valor deseado, generando "N" x 1ms = "N" ms de retardo
Línea 27: Línea 26:

=== Configuración del periférico y NVIC ===
Habilitar el periférico
Línea 28: Línea 30:
Chip_RIT_Init(LPC_RITIMER);
Chip_RIT_SetTimerInterval(LPC_RITIMER,time);
Chip_RIT_Init(LPC_RITIMER);
}}}
Función de la LPCOpen que configura el periférico para que cuente 1 ms, esta función realiza el cálculo de acuerdo a la frecuencia en que funciona el micro para que la cuenta dé aproximadamente los milisegundos enviados en el 2do parámetro
{{{
Chip_RIT_SetTimerInterval(LPC_RITIMER,1);
}}}
Por último deberíamos configurar el periférico para que el mismo genere interrupción por un evento dado, en el caso particular de RIT, la única interrupción que puede generar es por llegar a la cuenta, por ello no posee configuración de interrupción, la sola habilitación del periférico dentro de la NVIC, ya lo habilita a generar interrupciones.

Antes de concluir la inicialización, se borra la bandera de interrupción
{{{
Chip_RIT_ClearInt(LPC_RITIMER);
}}}

Finalmente se habilita el periférico en la NVIC,
Cada periferico tiene asignado un nro dentro de la tabla de vectores de interrupción, en el caso del RIT le corresponde la posición nro 11.
{{{
Línea 31: Línea 47:
Chip_RIT_ClearInt(LPC_RITIMER);

Manejo de Interrupciones (NVIC)

Nested Vectored Interrupt Controller (NVIC) o Controlador de interrupciones vectorizadas anidadas, es el controlador encargado del manejo de interrupciones del Cortex-M4 Este controlador tiene la particularidad de permitir asociar cada interrupciones del microcontrolador con una dirección de memoria (vector) donde se encuentra la subrutina que atenderá dicha interrupción, permitiendo una respuesta rápida (baja latencia) ante un evento.

La configuración de la interrupción requiere de los siguientes pasos

Configuración del periférico

Además de configurar el periférico para su funcionamiento de acuerdo a los requerimientos de la aplicación, se deberá definir cuales y cuantos eventos del mismo generarán interrupción, debido a que en general estos periféricos generan mas de un evento. Podemos citar por ejemplo la UART, este periférico generalmente se atiende por interrupción, por ser un evento asíncrono y relativamente lento (configurado a 9600 baudios significa que se recibe o se transmite 1 byte cada aprox. 1 ms o 2x10^5 instrucciones en un micro de 200MHz). Este periférico puede generar interrupciones cuando: llego un byte, llego el byte nro n (para un n predefinido), se terminó de enviar un byte, la cola de envíos esta vacía, se detectó un error de trama, etc. Cada uno de estos eventos permite o no generar interrupciones y deben ser configurados.

Configuración de la NVIC

Una vez definido el periférico, debe configurarse el controlador de interrupciones para que efectivamente atienda a la interrupción, en este paso se define además la prioridad, la NVIC perimite 255 niveles de prioridad siendo el 0 la mas alta, bajando la prioridad cuando subimos el valor.

Vector de Interrupción

Una vez configurado el periférico y luego la NVIC, solo resta programar la función que atenderá la interrupción, esta función se escribe de manera análoga a una función estándar con la diferencia que debe cargarse la dirección de la misma en el vector de interrupciones.

Ejemplo

A continuación se realiza un ejemplo de interrupción, el mismo implementa un retardo de "N" ms para ser utilizado como una retardo mas preciso que un simple bucle. El funcionamiento del mismo será el siguiente:

Se utiliza el periférico Repetitive Interrupt Timer (RIT), es un contador muy sencillo que permite realizar cuentas o interrupciones a intervalos definidos sin la necesidad de utilizar los contadores generales que dispone el micro. Se configura este timer para que cuente hasta un valor determinado que implicará un retardo de 1 ms generando una interrupción, dentro de la misma se incrementa una variable global, luego se realizará una función retardo que simplemente colocará a 0 la variable global y un bucle esperará que esa variable se incremente al valor deseado, generando "N" x 1ms = "N" ms de retardo

Configuración del periférico y NVIC

Habilitar el periférico

Chip_RIT_Init(LPC_RITIMER);               

Función de la LPCOpen que configura el periférico para que cuente 1 ms, esta función realiza el cálculo de acuerdo a la frecuencia en que funciona el micro para que la cuenta dé aproximadamente los milisegundos enviados en el 2do parámetro

Chip_RIT_SetTimerInterval(LPC_RITIMER,1);

Por último deberíamos configurar el periférico para que el mismo genere interrupción por un evento dado, en el caso particular de RIT, la única interrupción que puede generar es por llegar a la cuenta, por ello no posee configuración de interrupción, la sola habilitación del periférico dentro de la NVIC, ya lo habilita a generar interrupciones.

Antes de concluir la inicialización, se borra la bandera de interrupción

Chip_RIT_ClearInt(LPC_RITIMER);

Finalmente se habilita el periférico en la NVIC, Cada periferico tiene asignado un nro dentro de la tabla de vectores de interrupción, en el caso del RIT le corresponde la posición nro 11.

NVIC_EnableIRQ(11);

UntitledWiki: WebHome/Hardware/CortexNVIC (última edición 2017-09-26 22:07:57 efectuada por GuillermoSteiner)