Vous êtes sur la page 1sur 46

INTERRUPCIONES

EN EL CORTEX M
Una Rapsodia
M.I M.I Eduardo Ramrez Snchez
Detalles de un proyecto: Ejemplo un Termostato
Los principales pasos para el desarrollo de un proyecto

1.- Seleccione la aplicacin

2.- Defina las funciones deseadas


Para nuestro ejemplo:
Lectura en el LCD de la temperatura interior/exterior
Introduccin en el LCD la temperatura deseada
Introduccin en el display hora y dia
Seleccionar calor o frio
Operar calefactor o compresor.

3.- Determine el hardware requerido basado en las funciones


TIVA Launchpad
Sensores de temperatura
Teclado
Display
Relevadores/Drivers
Alarma audible
Fuente de Alimentacin
4.- Desarrolle programas simples para probar el hardware. Desarrollo del
programa principal para las funciones deseadas.
El programa o los programas para esto proyecto son:

Un programa para probar la alarma audible

Un programa para probar el display

Un programa para probar el display y el teclado

Un programa para probar la organizacin bsica del software


El lazo de paso o lazo infinito
Aqu se presenta una estructura de propsito general de
software que puede ser usada como un marco para muchas
aplicaciones con microcontroladores.
La mayoria de las tareas del sistema son escritas como
subrutinas o funciones. Estas subrutinas estn organizadas
dentro de un lazo, as que cada una de estas es llamada una
vez por cada pasada a travs del lazo

Subrutina 1

Subrutina 2

Subrutina 3

Subrutina 4
En la parte superior del lazo hay una pequea rutina que es la que lleva
el paso a travs del lazo, as que este se ejecuta a intervalos regulares.
Un reloj es mantenido como la primer tarea del lazo.
Este reloj puede ser usado como entrada a otras tareas o subrutinas para
decidir que har la subrutina en cada pasada a travs del lazo

Reloj ---TIC

Subrutina 2

Subrutina 3

Subrutina 4
Main

CCIF activa

Programe CCIF
Para que ocurra
en 50ms

TIC=TIC+1

TIC=20?

Limpiar TIC

Sub 2
Sub 3
Sub 4
Sub 5

Sub n
Sub 2
MODO THREAD MODO HANDLER

TIEMPO
Kernel en tiempo real Tarea = Hilo
Espera por evento
(2)
Tarea de Evento que esta
baja prioridad (1) esperando una
Tarea de mayor
Tiempo

prioridad

(4) ISR (3)

Lazo
infinito Tarea de
Lazo
(5) alta infinito
prioridad

(6)

Tarea de
baja prioridad
(7)
KERNEL

REGISTROS
Modos de Operacin del CORTEX M
Modo Thread (aplicacin) esto es: Cuando el Cortex es encendido
automticamente entra en modo thread. El modo thread es el
modo en que la mayora de los programas de la aplicacin son
ejecutados. El CPU pasa la mayor parte de su tiempo en modo
thread y entra en interrupcin solo para ejecutar excepcion de
fallas o interrupciones de los perifericos.
Modo Handler (excepcin) . El Cortex cambia a modo handler solo
cuando existe una excepcin de falla o una interrupcin de un
perifrico para atraer la atencin del CPU y este ejecute una
interrupcin (rutina de interrupcin) . Cuando retorna de una
interrupcin el CPU regresa automticamente a .modo thread.

Existen dos registros apuntadores de stacks en el ARM CORTE M.


Estos son lllamados
PSP (processor stack pointer ) y el MSP (main stack pointer). Hilos
corriendo en modo hilo debern debern usar el stack de proceso
y las rutinas de excepcin y el kernel debern usar el main stack.
Niveles privilegiado y no privilegiado en ARM Cortex-M

Modos del Software Nivel de Privilegio


Procesador

Thread Aplicaciones Privilegiado y no


privilegiado

Handler ISR para Excepciones y Siempre privilegiado


IRQS
SOFTWARE NIVEL PRIVILEGIADO

1.- El software de nivel privilegiado tiene acceso a todos los


registros incluyendo los registros de funciones especiales.
2.- El software de nivel privilegiado tiene acceso a cada regin
de la memoria
3.- El software de nivel privilegiado tiene acceo al sitema del
timer, al NVIC y a los recursos del sistema.
4.- El software de nivel privilegiado puede ejecutar todas las
instrucciones del ARM Cortex-M incluyendo las instrucciones
MRS, MSR y CPS.
5.- Los manejadores (handlers) de falla y IRQS pueden ser
ejecutados solo en modo privilegiado.
6.- Solo el software privilegiado puede acceder al registro de
CONTROL para ver cuando la ejecucin esta en modo
privilegiado o no privilegiado. En modo no privilegiado se
puede conmutar de nivel no privilegiado a nivel privilegiado
usando la instruccin SVC..
Software nivel no privilegiado;

1.- El software nivel no privilegiado no tiene accso a algunos registros tales


como los registros de funciones especiales para interrupciones.

2.- El software de nivel no privilegiado tiene acceso limitado a algunas


regiones de memoria.

3.- El software de nivel no privilegiado es bloqueado para que no acceda al


sistema del timer, NVIC y al bloque del sistema de control y recursos

4.- El software de nivel no privilegiado no puede ejecutar algunas de las


instrucciones ARM tales como CPS tiene acceso limitado a las instrucciones
MRS y MSR.

5,- Mientras el modo Handler es siempre ejecutado en nivel privilegiado, el


software en modo thread puede ser ejecutado en nivel privilegiado o no
privilegiado. El bit 0 del registro de funciones especiales llamado CONTROL
da la opcin de correr el software en modo privilegiado o no privilegiado.

6.- En modo no privilegiado se puede usar la instrucion SVC un llamado


supervisor para conmutar del nivel no privilegiado al nivel privilegiado.
Mientras los
registros de
propsito general
pueden accederse
con las
instrucciones
MOV, LDR y STR
Los registros
especiales pueden
accederse solo
con las
instrucciones MSR
y MRS
La opcin de usar uno u otro apuntador de stack la podemos
programar en el registro llamado de CONTROL.

31 3 2 1 0
Reservado FPCA ASP nPRIV

Registro de CONTROL

nPRIV = 0 privilegiado
= 1 no privilegiado

ASP = 0 MSP es el apuntador de Stack


=1 PSP es el apuntador de Stack

FPCA = 0 no punto flotante activo


= 1 punto flotante activo
Registro de Estado de Propsito Especial (XPSR) guarda el estado de las banderas del
programa de aplicacin, interrupcin y ejecucin del procesador.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
N Z C V Q reservado GE[3:0] reservado APSR
Banderas de mayor o igual
(nicamente en Cortex M-7/4)
Los procesadores Cortex tienen cinco banderas de estado: (N) negativo,
cero (Z), sobreflujo (O), acarreo (C) y saturacin (Q)
reservado IT[7:6] T reservado IT[5:0] reservado EPSR

reservado 876543210
numero de excepcin IPSR
15 14 13 12 11 10
N Z C V Q IT[7:6] T reservado IT[5:0] numero de excepcin PSR
PSR = APSR + EPSR + IPSRI

Registros de Estado APSR, EPSR Y IPSR


Estos registros especiales pueden accederse nicamente con dos instrucciones especiales
MRS y MSR
MRS R0, apsr MRS R0,epsr MSR apsr_nzcvq, R0 MSR apsr_nzcvqg, R0
ERS
MRS R0, xpsr MRS R0,xpsr MSR apsr_g, R0
0X00000000
VECTORES (1k)

1024K Flash
ROM
0X000FFFFF
0X20000000
256K
RAM 0X2003FFFF

0X40000000
Puertos de
E/S 0X400FFFFF

0XE0000000
E/S
Interna
PPB 0XE0041FFF
0XE0042000

0XFFFFFFFF
En el inicio de un Reset todas las interrupciones estn deshabilitadas. Para habilitar
cualquier interrupcin se requiere de tres pasos:

1.- Habilitar las interrupciones para un modulo de perifricos en especifico .

2.- Habilitar las interrupciones para el modulo NVIC

3.- Habilitar la interrupcin global


Sirve para dar permiso local de interrupcin

DMAIM
Los registros ENn habilitan las interrupciones
Los registros DISn deshabilitan las interrupciones
Sirve para detectar niveles o bordes

Para programar borde o nivel


junto con ISn
Sirve para detectar ambos bordes
reservado
Se activa un bit cuando ha ocurrido una interrupcin
31

reservado
Si un bit se activa indica que se ha enviado una interrupcin al NVIC

reservado
Limpia Interrupcin
/*
* Este programa genera el cdigo 1010,1001,0101, 0110 en el puerto A
* y cada vez que hay una interrupcin en el pin PJ0 cambia de estado elled de PN0
*/
#define PORTADAT (*((volatile unsigned int*)0x400583FC))
#define PORTADIR (*((volatile unsigned int*)0x40058400))
#define PORTADEN (*((volatile unsigned int*)0x4005851C)) //*
#define RCGCGPIO (*((volatile unsigned int*)0x400FE608))
#define PORTJDAT (*((volatile unsigned int*)0x400683FC))
#define PORTJDIR (*((volatile unsigned int*)0x40060400))
#define PORTJDEN (*((volatile unsigned int*)0x4006051C)) //*
#define PORTJPUR (*((volatile unsigned int*)0x40060510))
#define PORTNDAT (*((volatile unsigned int*)0x400643FC))
#define PORTNDIR (*((volatile unsigned int*)0x40064400))
#define PORTNDEN (*((volatile unsigned int*)0x4006451C))
#define NVIC_EN1_R (*((volatile unsigned int*)0xE000E104))
#define NVIC_PRI0_R (*((volatile unsigned int*)0xE000E400))
#define PORTJIS (*((volatile unsigned int*)0x40060404))
#define PORTJIBE (*((volatile unsigned int*)0x40060408))
#define PORTJIEV (*((volatile unsigned int*)0x4006040C))
#define PORTJIM (*((volatile unsigned int*)0x40060410))
#define PORTJICR (*((volatile unsigned int*)0x4006041C))

void delayMs(int n);


void GPOI_init(void);
int main(void)
{
GPOI_init();
for(;;)
{
PORTADAT = 10;
delayMs(200);
PORTADAT = 9;
delayMs(200);
PORTADAT = 5;
delayMs(200);
PORTADAT = 6;
delayMs(200);
}
}
void GPOI_init(void)
{
NVIC_EN1_R = 0X80000;
RCGCGPIO = 0x1101;
PORTADIR = PORTADIR + 0Xff;
PORTADEN = PORTADEN + 0xFF;
PORTNDIR = PORTNDIR + 0X01;
PORTNDEN = PORTNDEN + 0X01;
PORTJDIR = PORTJDIR + 0X00;
PORTJDEN = PORTJDEN + 0X01;
PORTJPUR = PORTJPUR + 0X01;
PORTJIM = PORTJIM + 0X01;
PORTJIS = PORTJIS + 0X00;
PORTJIEV = PORTJIEV + 0X00;
PORTJIBE = PORTJIBE + 0X00;

}
/* retarda n milisegundos (16 MHz CPU clock) */
void delayMs(int n)
{
int i, j;
for(i = 0 ; i < n; i++)
for(j = 0; j < 3180; j++)
{} /* no hacer nada por 1 ms */
}
void intj_r(void)
{

PORTJICR = 0X01; //BORRO BANDERA


PORTNDAT ^=0X01;

Vous aimerez peut-être aussi