• No se han encontrado resultados

Herramientas libres para la implementación de sistemas de control en tiempo real con microcontroladores ARM71

N/A
N/A
Protected

Academic year: 2021

Share "Herramientas libres para la implementación de sistemas de control en tiempo real con microcontroladores ARM71"

Copied!
151
0
0

Texto completo

(1)

E S C U E L A T É C N I C A S U P E R I O R D E

I N G E N I E R Í A D E T E L E C O M U N I C A C I Ó N

U N I V E R S I D A D D E M Á L A G A

P R O Y E C T O F I N D E C A R R E R A

HERRAMIENTAS LIBRES PARA LA IMPLEMENTACIÓN

DE SISTEMAS DE CONTROL EN TIEMPO REAL CON

MICROCONTROLADORES ARM7

I N G E N I E R Í A T É C N I C A D E T E L E C O M U N I C A C I Ó N

S I S T E M A S E L E C T R Ó N I C O S

(2)
(3)

E S C U E L A T É C N I C A S U P E R I O R D E

I N G E N I E R Í A D E T E L E C O M U N I C A C I Ó N

U N I V E R S I D A D D E M Á L A G A

Titulación: Ingeniería Técnica de Telecomunicación Sistemas Electrónicos

Reunido el tribunal examinador en el día de la fecha, constituido por:

D./Dª. ________________________________________________________ D./Dª. ________________________________________________________ D./Dª. ________________________________________________________ para juzgar el Proyecto Fin de Carrera titulado:

HERRAMIENTAS LIBRES PARA LA IMPLEMENTACIÓN DE

SISTEMAS DE CONTROL EN TIEMPO REAL CON

MICROCONTROLADORES ARM7

del alumno/a D. Antonio Jiménez Bellido dirigido por D. José Manuel Cano García

ACORDÓ POR ______________________________________ OTORGAR LA CALIFICACIÓN DE _______________________________________________ Y, para que conste, se extiende firmada por los componentes del tribunal, la presente diligencia

Málaga, a ______ de __________________ de _________

El/La Presidente/a El/La Vocal El/La Secretario/a

(4)
(5)

E S C U E L A T É C N I C A S U P E R I O R D E

I N G E N I E R Í A D E T E L E C O M U N I C A C I Ó N

U N I V E R S I D A D D E M Á L A G A

HERRAMIENTAS LIBRES PARA LA IMPLEMENTACIÓN DE SISTEMAS DE CONTROL EN TIEMPO REAL CON MICROCONTROLADORES ARM7

REALIZADO POR: Antonio Jiménez Bellido

DIRIGIDO POR: José Manuel Cano García

DEPARTAMENTO DE: Tecnología Electrónica

TITULACIÓN: Ingeniería Técnica de Telecomunicación Sistemas Electrónicos

PALABRAS CLAVE: Microcontroladores, ARM, Sistemas de control, Hardware in the loop, Sistemas en tiempo real, FreeRTOS.

RESUMEN:

En este proyecto se estudia el conjunto de herramientas libres disponibles para el desarrollo de aplicaciones de control en tiempo real para la plataforma ARM7. Este estudio incluye un análisis de la

arquitectura ARM7 y el microcontrolador NXP LPC2148, así como una introducción al sistema operativo FreeRTOS. Adicionalmente se realizado la implementación de un autopiloto para un vehículo aéreo no tripulado y se ha validado mediante pruebas tipo hardware in the loop.

(6)
(7)

I

CONTENIDO

Contenido ... I Tabla de acrónimos ... VII

1 Introducción ... 1

1.1 Estado del arte y tendencias ... 2

1.1.1 ARM ... 2

1.2 Objetivos del proyecto ... 4

1.3 Organización de la memoria ... 4 2 Arquitectura ARM7 ... 7 2.1 Introducción ... 7 2.2 Introducción a ARM7 ... 7 2.3 Características más notables ... 8 2.4 El pipeline ... 8 2.5 Acceso a memoria ... 9 2.6 Registros ... 10

2.7 Modos de operación y excepciones ... 11

2.7.1 Interrupciones software ... 14

2.8 Conjuntos de instrucciones ... 14

2.8.1 Conjunto de instrucciones ARM ... 15

2.8.2 Instrucciones de salto ... 15

2.8.3 Instrucciones de procesado de datos ... 16

2.8.4 Instrucciones de transferencia de datos ... 17

2.8.5 Operaciones sobre los registros y los bancos de registros ... 18

2.8.6 Conjunto de instrucciones THUMB ... 18

(8)

II

3.1 Introducción ... 21

3.2 Memoria Flash integrada ... 22

3.3 Memoria SRAM integrada ... 22

3.4 Mapa de memoria... 22

3.5 Diagrama de bloques ... 24

3.6 Modulo de aceleración de memoria (MAM) ... 25

3.7 Sistema de interrupciones de la familia LPC2000 ... 26

3.8 Gestión de la energía ... 28

3.9 Periféricos de usuario ... 28

3.9.1 E/S de propósito general ... 29

3.9.2 TimerS ... 29

3.9.3 UART ... 31

3.9.4 Convertidor analógico a digital ... 32

3.9.5 Convertidor digital a analógico ... 33

3.9.6 Modulador PWM ... 33

3.9.7 Watchdog timer ... 35

3.10 Hardware de debug ... 36

3.11 Conclusiones... 36

4 Entorno y herramientas de desarrollo ... 37

4.1 Introducción ... 37 4.2 El entorno de desarrollo ... 38 4.2.1 Ubuntu Linux ... 38 4.3 Herramientas de desarrollo ... 38 4.3.1 CodeSourcery G++ Lite ... 38 4.3.2 Eclipse IDE ... 39 4.3.3 OpenOCD ... 39

(9)

III

4.3.4 Placa de desarrollo Olimex LPC-P2148 ... 41

4.3.5 Interfaz JTAG Olimex ARM-USB-OCD ... 42

4.3.6 High IntegRity Staviewer Pluggin ... 43

4.4 Conclusiones ... 47

5 Sistemas operativos en tiempo real ... 49

5.1 Introducción ... 49

5.2 Multitarea ... 49

5.3 Multarea y concurrencia ... 50

5.4 El planificador ... 50

5.4.1 Aplicaciones de tiempo real ... 51

6 Free RTOS ... 55

6.1 Introducción a FreeRTOS. ... 55

6.1.1 Multiprocesamiento en sistemas embebidos pequeños. ... 55

6.2 El planificador ... 57

6.2.1 Gestión de procesos ... 57

6.2.2 Creación y destrucción de tareas ... 61

6.3 Gestión del montículo ... 62

6.4 Uso de la pila ... 63

6.5 Mecanismos de comunicación entre procesos (IPC) ... 64

6.6 Rutinas de interrupción. ... 65

6.6.1 Abstracción de hardware mediante drivers. ... 67

6.7 Estructura y componentes de un proyecto con FreeRTOS. ... 68

6.7.1 Estructura del código fuente de FreeRTOS ... 68

6.7.2 Estructura de un proyecto con FreeRTOS ... 71

6.8 Configuración y optimización. ... 73

(10)

IV

6.9 Conclusiones ... 75

7 Ejemplo de sistema de control en tiempo real: autopiloto para UAV ... 77

7.1 Introducción ... 77

7.2 Diseño basado en modelos ... 77

7.2.1 Introducción ... 77

7.2.2 Esbozo sobre estabilidad y control de la aeronave ... 79

7.2.3 Estabilidad y control longitudinal ... 79

7.2.4 Estabilidad y control lateral-direccional ... 80

7.2.5 Esbozo del diseño del controlador del viewer ... 81

7.3 Modelado del sistema de control ... 82

7.3.1 Modelo de la aeronave ... 83

7.3.2 Bloque de generación de referencias (Hight Level) ... 87

7.3.3 Controlador de bajo nivel ... 96

7.4 Verificación del diseño mediante pruebas hardware in the loop (HIL) ... 103

7.4.1 Metodología empleada ... 104

7.5 Implementación del controlador en un microcontrolador NXP LPC2148 con FreeRTOS ... 107

7.5.1 Arquitectura software ... 107

7.5.2 Implementación de los controladores ... 109

7.5.3 Driver UART ... 116

7.5.4 Comunicaciones con Simulink ... 117

7.5.5 Configuración de FreeRTOS ... 118

7.5.6 Estructura del código fuente ... 119

7.6 Resultados obtenidos ... 121

8 CONCLUSIÓN ... 125

(11)

V

Bibliografía ... 129

Referencias WEB ... 131

ANEXO A: Familias soportadas por FreeRTOS ... 133

(12)
(13)

VII

TABLA DE ACRÓNIMOS

API: Application programming interface. ARM: Advanced Risc Machines.

ASIC: Application specific integrated circuit. ASSP: Application specific standard product. CAN: Controller area network.

CPU: Central processing unit.

CPSR: Current program status register. CVS: Concurrent versions system. DSP: Digital signal proccesor.

FPGA: Field programable gate array. GCC: GNU compiller collection.

GNU: GNU is Not Unix. Proyecto de software libre. GPIO: General purpose input/output.

HIL: Hardware in the loop. I2C: Inter integrated circuit. I2S: Integrated interchip sound. IRQ:Interrupt request.

IP: Iternet protocol.

IPC: Inter process comunication ISR: Interrupt service routine MCU: Microcontroller unit

MIPS: Million instructions per second.

NED: North, East, Down. Sistema de referencia. RTOS: Real time operating system.

(14)

VIII SOC: System in chip.

SPI: Serial port interface.

SPSR: Saved program status register. UAV: Unmanned aerial vehicle. USB: Universal serial bus.

(15)

1

1 INTRODUCCIÓN

Actualmente nos encontramos en un contexto tecnológico en el que la proliferación de los sistemas embebidos supone uno de los mercados de más rápida expansión. La exigencia de los consumidores en cuanto a funcionalidad y prestaciones de los dispositivos electrónicos que usan a diario ha propiciado un gran impulso para el mercado de los microcontroladores.

Existen en el mercado multitud de arquitecturas y familias que cubren todo el espectro de aplicaciones, desde pequeños microcontroladores, de coste muy reducido, hasta SOCs (system on chip) con funciones hasta hace poco reservadas a los ordenadores personales.

En este contexto, el objetivo del presente trabajo es introducir la arquitectura ARM, una de las más extendidas en los últimos años y de la que existen variantes para todo tipo de aplicaciones, desde pequeños sistemas de control y automatización,

procesadores de aplicación, núcleos sintetizables en lógica programable, hasta procesadores multinúcleo.

Dentro de esta arquitectura nos centraremos en la familia ARM7, que representa el segmento medio de la arquitectura. Está formado por microcontroladores RISC de 32 bits, con capacidades de cálculo de hasta 130 MIPS, y memorias Flash de hasta 1 Mbyte.

Una de las ventajas de esta familia subyace en el hecho de ser una tecnología licenciada a múltiples fabricantes, por lo que la oferta de dispositivos disponibles es muy amplia. Actualmente más de cuarenta compañías1

fabrican implementaciones de ARM7, disponiéndose de dispositivos con todos los periféricos usados en la industria, incluyendo controladores Ethernet, CAN, Flexray, SPI, I2C, I2S, USB, y un largo etcétera. Uno de los objetivos de este proyecto es analizar las capacidades de esta familia para la implementación de sistemas en tiempo real con unos requisitos computacionales medios, como suele ser el caso en muchos sistemas de control. Desarrollaremos como ejemplo la implementación de un sistema de control a partir de un diseño previo basado en modelos con la herramienta Simulink.

Así mismo, como objetivo adicional, analizaremos las características de la familia como plataforma para la docencia, estudiando los entornos de desarrollo y herramientas disponibles, en concreto, configuraremos un entorno de desarrollo basado en aplicaciones libres y gratuitas en entorno Linux.

1

(16)

2

1.1ESTADO DEL ARTE Y TENDENCIAS 1.1.1 ARM

ARM se encuentra entre las empresas líderes de la industria en cuanto a

microprocesadores embebidos de 32 bits, representando el 6% del mercado global de microcontroladores, y con una amplia implantación en algunos segmentos, como el 85% en smartphones, el 90% en cámaras digitales, el 75% en reproductores

multimedia, 65% en controladores para discos duros y el 30% en TV digitales2

. Hasta la fecha se han fabricado más de 15000 millones de procesadores ARM, de hecho según ARM Ltd. en la actualidad se fabrican unos diez millones al día.

La siguiente figura recoge las familias de procesadores ARM disponibles actualmente:

Figura 1 Familia de procesadores ARM

En la figura se diferencia tres tipos de procesadores en función de tipo de aplicaciones a las que van destinadas.

2

ARM anual report 2009:

(17)

3 Los procesadores ARM Cortex-A están principalmente orientados a su integración en SOC de alto rendimiento, destinados a dispositivos de comunicaciones y multimedia, como Netbooks, Smartphones, televisiones, routers, telefonía IP etc.

Dentro de esta familia encontramos:

• Cortex-A9: con implementaciones multinúcleo3

entre 800MHz y 2GHz. • Cortex-A8: procesadores de un solo núcleo hasta 1GHz.

• Cortex-A5: procesadores hasta 800MHz para aplicaciones de bajo coste. Las series Cortex-M y Cortex-R están destinadas a aplicaciones de tiempo real en las que se necesitan tiempos de ejecución determinísticos y alto rendimiento.

Especialmente la serie Cortex-R cuenta con instrucciones SIMD en punto flotante y versiones con hardware redundante para aplicaciones críticas, como por ejemplo los Texas Instruments TMS570LS con CPU dual sincronizada.

Dentro de la familia Cortex-M encontramos los dispositivos:

• Cortex-M4: orientados sistemas de control y procesado digital de señal para sistemas de bajo consumo energético.

• Cortex-M3: orientado a aplicaciones en tiempo real, especialmente sistemas de control y networking.

• Cortex-M1: es un procesador sintetizable destinado a su implementación en FPGAs.

• Cortex-M0: es un procesador bajo costo y alta eficiencia energética, destinado a aplicaciones de muy bajo coste.

Los procesadores englobados como Classic ARM Processors incluyen las familias ARM11, ARM9 y ARM7, y representan las tecnologías más maduras. Son procesadores de propósito general y alta eficiencia, especialmente indicados para aplicaciones de bajo coste.

Encontramos los siguientes dispositivos:

• ARM11: procesadores con frecuencias de reloj hasta 1 GHz, de propósito general. Principalmente empleados a aplicaciones en telefonía móvil, PDAs, videojuegos.

• ARM9: procesadores de propósito general con extensiones SIMD y DSP. Es la familia más popular.

3

(18)

4 • ARM7: microcontroladores de propósito general y bajo coste. Esta familia está

siendo actualmente reemplazada por los nuevos dispositivos Cortex-M3 y Cortex-M0. Sin embargo presenta un elevado nivel de madurez, y las

implementaciones disponibles son muy robustas, lo que hace que aun sea la familia de microcontroladores ARM más extendida, representando el 55% de todos los microcontroladores ARM vendidos en 20094

.

1.2OBJETIVOS DEL PROYECTO

Los objetivos del presente proyecto son:

Estudiar las características de la familia ARM7 y su aplicabilidad en sistemas de control. Analizar las características y funcionalidad de FreeRTOS como sistema operativo en tiempo real e implementar como caso práctico el controlador de un autopiloto para un UAV.

Analizar la viabilidad de la utilización de herramientas libres y gratuitas para la configuración de un entorno de desarrollo versátil y robusto para microcontroladores ARM.

1.3ORGANIZACIÓN DE LA MEMORIA

El presente trabajo presenta de manera progresiva los distintos conceptos que

finalmente permitirán la implementación de un sistema de control en tiempo real con FreeRTOS en un microcontrolador basado en una CPU ARM7. El contenido de los capítulos que lo componen es el siguiente:

• En el capítulo dos se introducen las características y arquitectura de la CPU ARM7.

• En el capítulo tres se estudia el microcontrolador NXP LPC2148, basado en dicha CPU.

• En el capítulo cuatro se exponen las distintas herramientas y configuración de un entorno de desarrollo basado en herramientas libres bajo entorno Linux. • En el capítulo cinco se introducen algunos aspectos básicos de los sistemas en

tiempo real.

4

ARM annual report 2009:

(19)

5 • En el capítulo seis se estudia FreeRTOS como sistema operativo en tiempo real

y se introducen los aspectos fundamentales de su API.

• En el capítulo siete se realiza la implementación con FreeRTOS en una placa de desarrollo basada en un microcontrolador LPC2148 de un sistema de control existente. Posteriormente a la implementación, se comparan los resultados obtenidos mediante simulación en Simulink con los resultados obtenidos en una simulación tipo hardware in the loop, en la que el algoritmo de control se ejecuta en el hardware real.

(20)
(21)

7

2 ARQUITECTURA ARM7

2.1INTRODUCCIÓN

Como se ha comentado anteriormente, poder contar con una plataforma ampliamente extendida presenta evidentes ventajas en muchos aspectos. Por esa razón se ha

elegido la familia ARM7 como objeto de estudio.

Representa una tecnología madura, con herramientas de desarrollo libres y muy depuradas, proporcionando a la vez una elevada flexibilidad y rendimiento con unos costes, tanto de las herramientas como de los dispositivos, muy bajos.

En el desarrollo de este proyecto utilizaremos un microcontrolador NXP LPC2148. Para poder afrontar un desarrollo con el mismo, estudiaremos los aspectos generales de la familia ARM7, y posteriormente nos centraremos en las características concretas del LPC2148.

2.2INTRODUCCIÓN A ARM7

La familia ARM7 está compuesta por un conjunto de núcleos RISC de 32 bits basados en las arquitecturas ARMv4T y ARMv5TEJ, optimizados para mantener unos

requerimientos de consumo bajos y coste reducido. La idea clave en la que se basa la familia es la simplicidad del diseño. El núcleo RISC tiene un conjunto de instrucciones muy reducido y consecuentemente también un número de puertas bajo, esto permite un rendimiento alto consumiendo poca área de silicio. Esto lo hace muy adecuado para sistemas embebidos en los cuales el coste y el consumo energético sean aspectos fundamentales en el diseño.

La familia está compuesta por varios núcleos, ofreciendo una potencia de cálculo de hasta 130 MIPS5 :

ARM7TDMI (ARMv4T): es el núcleo más básico. Dispone de una ALU entera y pipeline de tres etapas.

ARM7TDMI-S (ARMv4T): es una versión sintetizable del ARM7TDMI.

ARM7EJ-S (ARMv5TEJ): es una versión sintetizable mejorada con una unidad de procesamiento DSP y una unidad de aceleración de ejecución de aplicaciones Java (ARM Jazelle DBX technology).

5,2

(22)

8 ARM720T (ARMv4T): es una versión que incorpora un controlador de memoria (MMU) y una cache de 8 KB, lo que le permite conectarle una memoria RAM externa y ejecutar sistemas operativos con requerimientos elevados de memoria como Windows CE, Linux, Symbian OS, Palm OS.

Actualmente más de cuarenta compañías2 ofrecen microprocesadores,

microcontroladores, SOCs, ASICs, y ASSPs basados en ARM7, y sus aplicaciones cubren desde cámaras de fotografía digital a sistemas de videojuegos.

En adelante nos centraremos en el estudio del núcleo ARM7TDMI, por ser esta implementación la más extendida.

2.3CARACTERÍSTICAS MÁS NOTABLES

Una de las características más notable de la familia ARM es la implementación de dos conjuntos de instrucciones, uno de 32 bits denominado ARM y otro de 16 bits

denominado THUMB. Este conjunto de instrucciones de 16 bit permite doblar la densidad de código, y al ser posible cambiar de modo dinámicamente en tiempo de ejecución, puntualmente podemos operar con el conjunto de instrucciones ARM en caso de ser necesario.

También es destacable que todas las instrucciones son de ejecución condicionada, esto es así para tratar de obtener un mejor aprovechamiento del pipeline. Profundizaremos en esta característica más adelante.

2.4EL PIPELINE

El ARM7TDMI-S utiliza un pipeline de tres etapas. Este es el tipo de pipeline más simple posible y no tiene los riesgos de pipelines de más largos, como de lectura antes de escritura.

Cada una de las etapas del pipeline es ejecutada por un hardware independiente, lo que permite ejecutar una instrucción mientras se decodifica una segunda y se carga una tercera, de esta forma la mayor parte de las instrucciones se ejecutan en un único ciclo de reloj.

(23)

9 Modo ARM Modo THUMB 1 2 3 4 5 6 CARGA PC PC - DECODIFICACIÓN PC-4 PC-2 - - EJECUCIÓN PC-8 PC-4 - - -

Figura 2 Diagrama de carga del pipeline

• Etapa de carga: la instrucción es cargada de la memoria. • Etapa de decodificación: la instrucción es decodificada.

• Etapa de ejecución: los registros son leídos del banco de registros. Se ejecutan las operaciones de la ALU y del registro de desplazamiento y los registros son escritos con los resultados.

Es importante tener presente que en modo ARM el PC va adelantado ocho bytes con respecto a la instrucción en ejecución, y en modo THUMB va adelantado cuatro bytes.

Como es usual, el pipeline es más efectivo con código lineal, ya que en caso de que se produzca un salto, todo el pipeline es vaciado y es necesario que se vuelva a cargar completamente antes de recuperar la máxima eficiencia en velocidad de ejecución. Como veremos más adelante, el conjunto de instrucciones ARM posee algunas características que nos permitirán optimizar el uso del pipeline para saltos pequeños.

2.5ACCESO A MEMORIA

El núcleo ARM7TDMI tiene una arquitectura tipo Von Neumann, con un bus de datos de 32 bits, en la que las direcciones de memoria son lineales y numeradas

ascendentemente desde cero.

El núcleo puede configurarse para trabajar en formatos Big-endian o Little-endian indistintamente.

Los datos pueden ser: 8 bit (byte)

16 bits (half word) 32 bits (word)

(24)

10 La alineación de datos debe ser de 4 bytes para los words, de 2 bytes para half Word, y de un byte para byte.

2.6REGISTROS

El ARM7 posee una arquitectura de tipo carga y almacena (load-and-store), por tanto, cualquier instrucción que procese datos necesita que estos se copien primero en un conjunto de registros. Tras ejecutarse la operación, los resultados se guardan en memoria.

El banco de registros de datos lo componen dieciséis registros (R0-R15) de 32 bits, de los cuales:

• R0-R12 son de propósito general. • R13 es usado como puntero de pila.

• R14, registro de enlace (Link Register). Cuando se llama a una función, la dirección de retorno se almacena en este registro. Esto permite la entrada y salida rápida en funciones que no llamen a ninguna otra función (“a leaf function”). En otro caso el registro de enlace debe ser almacenado en la pila.

• R15, es contador de programa.

Curiosamente, algunas instrucciones pueden utilizar los registros R13-R15 como registros de propósito general.

El registro de estado CPSR (Current Program Status Register) es otro registro de 32bits que contiene flags que indican es estado de la CPU.

31 30 29 28 27 8 7 6 5 4 3 2 1 0

N Z C V I F T M4 M3 M2 M1 M0

Tabla 1 Registro de estado

Los cuatro bits de más peso son manejados directamente por la CPU e indican las condiciones de estado de los resultados de las operaciones de procesamiento de datos.

Los ocho bits de menos peso pueden ser controlados desde la aplicación.

Los flags `F´ e `I´ sirven para habilitar las dos fuentes de interrupción externas a la CPU. Como veremos en el capítulo siguiente, todos los periféricos del LPC2148 están

conectados a estas dos líneas mediante un controlador de interrupciones vectorizadas. El flag `T´ sirve para controlar que conjunto de instrucciones se esté ejecutando. Como se ha comentado anteriormente, el ARM7 es capaz de ejecutar dos conjuntos de instrucciones, denominados ARM y THUMB y de 32 y 16 bits respectivamente. Más

(25)

11 adelante se verá que para cambiar de modo de ejecución, el procedimiento adecuado no es manipular directamente este bit, si no ejecutar una instrucción de salto con cambio (BX, BLX) al código THUMB.

Los cuatro bits de menos peso indican el modo de operación de la CPU. En el siguiente punto veremos los distintos modos en los que puede operar la CPU ARM7.

2.7MODOS DE OPERACIÓN Y EXCEPCIONES

En este punto veremos los distintos modos de operación de la CPU ARM7 y sus principales aplicaciones. También introduciremos el manejo de excepciones y su relación con los modos de operación de la CPU.

Los modos de operación se dividen en dos categorías: privilegiados y no privilegiados. Los modos privilegiados se utilizan para prestar servicio a interrupciones, excepciones y para acceder a recursos protegidos. Según el modo de operación tendremos acceso a un conjunto de registros específico.

En la siguiente tabla se muestran los registros asociados a cada modo de operación:

System & User

FIQ Supervisor Abort IRQ Undefined

R0 R0 R0 R0 R0 R0 R1 R1 R1 R1 R1 R1 R2 R2 R2 R2 R2 R2 R3 R3 R3 R3 R3 R3 R4 R4 R4 R4 R4 R4 R5 R5 R5 R5 R5 R5 R6 R6 R6 R6 R6 R6 R7 R7_fiq R7 R7 R7 R7 R8 R8_fiq R8 R8 R8 R8 R9 R9_fiq R9 R9 R9 R9 R10 R10_fiq R10 R10 R10 R10 R11 R11_fiq R11 R11 R11 R11 R12 R12_fiq R12 R12 R12 R12

R13 R13_fiq R13_svc R13_abt R13_irq R13_und

R14 R14_fiq R14_svc R14_abt R14_irq R14_und

R15(PC) R15(PC) R15(PC) R15(PC) R15(PC) R15(PC)

CPSR CPSR CPSR CPSR CPSR CPSR

SPSR_fic SPSR_svc SPSR_abt SPSR_irq SPSR_und

(26)

12 Usualmente, al producirse una excepción es necesario guardar el contexto de

ejecución de la aplicación, formado por el conjunto de registros, para poder

restaurarlo una vez concluido el tratamiento de la excepción. Para facilitar y acelerar este proceso, en los modos Supervisor, Abort, IRQ y Undefined, los registros R13 y R14 son reemplazados por un nuevo par de registros propios para modo, de esta forma podemos tener unos punteros de pila y de enlace específicos para este modo. También tenemos acceso a un registro adicional llamado SPSR (saved program status register), en el que en el momento de la ocurrencia de la interrupción se copia el contenido del CPSR, una vez atendida la excepción, al volver al modo usuario el CPSR es restaurado con los contenidos del SPSR.

El modo FIQ adicionalmente proporciona un conjunto registros propios que sustituyen a R7-R12, de forma que no es necesario copiar el banco de registros en la pila, lo que permite reducir el tiempo de repuesta ante una interrupción.

Las funciones de los modos de excepción son las siguientes:

• User (modo usuario): es el único modo no privilegiado. Este modo el estado de ejecución usual, en el que se ejecutan normalmente las aplicaciones. En este modo tenemos acceso a los registros R0-R15 y al registro de estado CPSR. • Supervisor: es un estado protegido, normalmente usado por los sistemas

operativos. La CPU se inicia siempre en este modo después de un reset. También se puede cambiar a este modo mediante una SWI (interrupción software).

• System: es un estado protegido, normalmente usado por los sistemas

operativos. A este estado solo se puede acceder desde otro modo privilegiado. • Interrupt (IRQ): este modo protegido se utiliza para el manejo de

interrupciones. La CPU cambia a este modo ante la ocurrencia de una interrupción.

• Fast interrupt (FIQ): este modo protegido puede usarse para efectuar una respuesta rápida ante una interrupción. Veremos su funcionamiento más adelante. . La CPU cambia a este modo ante la ocurrencia de una interrupción. Más adelante veremos cómo podemos mapear las fuentes de interrupción a los vectores FIQ o IRQ.

• Abort mode: la CPU pasa a este modo cuando ocurren un error de datos o de precarga de instrucción.

• Undefined mode: la CPU pasa a este modo cuando se intenta ejecutar una instrucción no definida.

Como hemos comentado anteriormente, cuando se produce una excepción, la CPU cambiará de modo de operación.

(27)

13 Las siguientes tablas muestran los vectores asociados a cada modo de operación y el orden de prioridad de las excepciones.

Excepción Modo Dirección del vector

Reset Supervisor 0x00000000

Instrucción no definida Undefined 0x00000004

Interrupción software (SWI) Supervisor 0x00000008

Aborto de precarga Abort 0x0000000C

Aborto de datos Abort 0x00000010

IRQ(interrupción) IRQ 0x00000018

FIQ(interrupción rápida) FIQ 0x0000001C

Tabla 3 Vectores de interrupción

Prioridad Excepción

1 (La más alta) Reset

2 Data abort

3 FIQ

4 IRQ

5 Prefetch abort

6 (La menor) Undefined instrucción / SWI

Tabla 4 Prioridades de las interrupciones

Ante una excepción ocurre lo siguiente:

-La dirección de la siguiente instrucción a ejecutar (PC +4 en modo ARM) se guarda en el registro de enlace

-El CPSR se copia al SPSR correspondiente a la excepción producida.

-El PC se carga con la dirección del vector de interrupción correspondiente. Simultáneamente se cambia de modo, reemplazándose los registros R13 y R14 por los correspondientes.

Al entrar en un modo de excepción el flag ‘I’ del CPSR es activado, deshabilitando así las interrupciones. Si necesitamos poder atender interrupciones anidadas, debemos desactivar el flag ‘I’ manualmente para habilitar las interrupciones y meter el

contenido del LR en la pila.

Lo primero que deberá hacer nuestra rutina de tratamiento de interrupción será guardar el contenido de los registros R0-R12 (R0-R7 en el caso del modo FIQ) para poder restablecerlos inmediatamente antes de salir de la RTI. La CPU ARM7 facilita esta tarea mediante las instrucciones STM y LDM, que permiten copiar el banco de registros completo, o un subconjunto de él a memoria y viceversa mediante una única instrucción.

(28)

14 Una particularidad de la familia ARM es que no existe una instrucción específica para salir de una interrupción; para salir de la excepción es suficiente con copiar el

contenido del LR al PC mediante una variante específica de la instrucción MOV:

MOVS R15, R14; Mueve el contenido del LR al PC y cambia de modo

En caso de pasar a modo FIQ o IRQ, la instrucción que se esté ejecutando en ese momento es abortada y descartada, así que en estos casos hay que tener en cuenta que la dirección almacenada en el LR es la de la instrucción descartada mas cuatro (en modo ARM), así que al salir de la RTI tendremos que asegurarnos de cargar en el PC la dirección adecuada (LR-4 en modo ARM). Esto podemos hacerlo con una solo

instrucción variación de la instrucción SUB específica para este propósito:

SUBS R15, R14, #4

En el caso de pasar a modo “data abort”, la excepción ocurrirá una instrucción después de la ejecución de la instrucción que causo la excepción. En este caso, supuestamente, nuestra RTI solucionará el problema que causo la interrupción, y al salir lo que

pretendemos es volver a ejecutarla. En este caso tendremos que mover hacia atrás el PC dos instrucciones.

Adicionalmente al ejecutar MOVS o SUBS la CPU cambiará a modo usuario y restaurará el contenido del CSPR.

2.7.1 INTERRUPCIONES SOFTWARE

Hay disponible una instrucción capaz de generar una excepción, forzando un cambio a modo supervisor y provocando un salto al vector de interrupción correspondiente. Al igual que todas las instrucciones ARM, la ejecución de esta instrucción es condicional. Los 23 bits de menor peso pueden usarse para almacenar un valor que puede pasarse como parámetro.

31 28 27 24 23

Condición 1111 Valor

Tabla 5 Parámetro de interrupción software

2.8CONJUNTOS DE INSTRUCCIONES

Como se ha comentado anteriormente, el ARM7 posee dos conjuntos de instrucciones, el conjunto ARM, de instrucciones de 32 bits, y el conjunto THUMB, de instrucciones de 16 bits. Para evitar confusiones, en adelante nos referiremos a la CPU como ARM7, y al conjunto de instrucciones como ARM.

(29)

15

2.8.1 CONJUNTO DE INSTRUCCIONES ARM

Una de las características más interesantes del conjunto de instrucciones ARM es que todas las instrucciones son ejecutadas condicionalmente dependiendo del resultado de la anterior. Los cuatro bits de más peso del código de operación son comparados con los bits de estado del CPSR. Para que la instrucción se ejecute deben coincidir, en otro caso la instrucción es ejecutada como NOP.

Podemos controlar la ejecución condicional de cualquier instrucción añadiendo los siguientes prefijos:

Prefijo Flags comparados Significado

EQ Z = 1 Igual

NE Z = 0 Distinto

PL N = 0 Positivo o cero

MI N = 1 Negativo

HI C = 1 y Z = 0 Mayor (sin signo)

CS C = 1 Mayor o Igual (sin signo)

CC C = 0 Menor (sin signo)

LS C = 0 y Z = 1 Menor o Igual (sin signo)

GE N = V Mayor o igual LT N != V Menor GT Z = 0 y N = V Mayor LE Z = 1 y N!=V Menor o igual VS V = 1 Overflow VC V = 0 No overflow

AL Todos ignorados Ejecutar siempre

Tabla 6 Prefijos de ejecución condicional

Esta característica permite una implementación muy eficiente de de código con pequeños saltos.

2.8.2 INSTRUCCIONES DE SALTO

Instrucciones de Salto

B Salto

BL Salto con enlace

BX Salto con cambio

BLX Salto con enlace y cambio

Tabla 7 Instrucciones de salto

La instrucción básica de salto B permite saltos de hasta 32MB. La versión modificada BL, adicionalmente almacena la dirección de la siguiente instrucción a ejecutar (PC+4) en el registro de enlace.

(30)

16 Las instrucciones BX y BLX además cambian modo de ejecución de AMR a THUMB y viceversa. Este es el único método que debemos usar para cambiar el modo de ejecución, nunca tratemos de modificar directamente el flag T del CPSR.

Agregando los prefijos de ejecución condicional podemos codificar saltos condicionales y llamadas condicionales a funciones en una sola instrucción.

2.8.3 INSTRUCCIONES DE PROCESADO DE DATOS

Instrucciones de procesado de datos

AND AND lógico

EOR XOR lógico

SUB Resta

RSB Resta inversa

ADD Suma

ADC Suma con acarreo

SBC Resta con acarreo

RSC Resta inversa con acarreo

TST Test

TEQ Comprueba igualdad

CMP Comparación

CMN Comparación inversa

ORR OR lógico

MOV Mover

BIC Limpiar bit

MVN Mover inversa

Tabla 8 Instrucciones de procesado de datos

Las instrucciones de procesado de datos permiten, al igual que todas las demás, su ejecución condicional, además permiten realizar un desplazamiento lógico de hasta 32 bits al segundo operando, todo en un único ciclo.

El formato es el siguiente: Prefijo de ejecución condicional Código de operación Flag para habilitar los códigos de condición Operandos Desplazamiento COND OP S R1,R2,R3 xx

(31)

17 Estas características bien aprovechadas (más bien con un buen compilador) permiten ejecutar muy eficientemente ciertas operaciones, por ejemplo:

if(Z==1)

{

R1 = R2+(R3*8);

}

Adicionalmente la CPU dispone de una unidad MAC (multipy accumulate unit), que permite la multiplicación de enteros de 16 y 32 bits con acumulación.

Instrucciones de la unidad MAC

MUL Multiplicación, operandos de 16 bit

MULA Multiplicación y acumulación, operandos de 16 bit UMULL Multiplicación sin signo, operandos de 32 bit

UMLAL Multiplicación y acumulación sin signo, operandos de 32 bit

SMULL Multiplicación con signo, operandos de 32 bit

SMLAL Multiplicación y acumulación con signo, operandos de 32 bit

Tabla 10 Instrucciones de la unidad MAC

2.8.4 INSTRUCCIONES DE TRANSFERENCIA DE DATOS

La CPU ARM7 posee un conjunto de instrucciones para copiar distintos tipos de datos desde memoria hacia los registros e inversamente desde los registros hacia la

memoria.

Instrucciones de transferencia de datos

LDR Load Word

LDRH Load half Word

LDRSH Load signed half Word

LDRB Load byte

LDRSB Load signed byte

STR Store Word

STRH Store half Word

SRHSH Store signed half Word

STRB Store byte

STRSB Store signed half byte

(32)

18

2.8.5 OPERACIONES SOBRE LOS REGISTROS Y LOS BANCOS DE REGISTROS

El núcleo ARM posee dos instrucciones capaces de cargar o guardar el banco de registros completo con una sola instrucción.

Carga y almacenamiento del banco de registros

STM Guarda el banco de registro en la memoria a

partir de la dirección base indicada

LDM Carga el contenido de la memoria desde la

dirección base indicada en el banco de registros.

Tabla 12 Operaciones sobre los bancos de registros

Adicionalmente, la CPU posee una instrucción atómica que permite intercambiar el valor de dos registros. Esto permite la implementación eficiente de semáforos.

Mediante la operación SWP es posible intercambiar el valor de dos registros de forma atómica, por lo que está operación está protegida frete a interrupciones.

2.8.5.1MODIFICACIÓN DEL REGISTRO DE ESTADO (CPSR)

Como se ha indicado en la sección Registros, los registros CPSR y SPSR no forman parte del banco de registros. Mediante las funciones MSR y MRS podemos copiar el

contenido de estos registros a cualquier registro del banco de registros y viceversa. Hay que notar que estas funciones no están disponibles en el modo usuario, por lo que sólo son accesibles desde los modos privilegiados, esto implica que el modo USER no puede abandonarse salvo a través de la ocurrencia de una excepción.

2.8.6 CONJUNTO DE INSTRUCCIONES THUMB

Tal y como se ha comentado anteriormente, la CPU ARM7 posee un modo de

ejecución alternativo que permite la ejecución de un conjunto de instrucciones de 16 bits. El propósito de este modo de ejecución y este conjunto de instrucciones, es poder obtener una mayor densidad de código. La utilización del modo THUMB debe ser analizada por el desarrollador, ya que aunque permite un ahorro de espacio del 30%, el código en modo ARM es un 40% más rápido, especialmente en algoritmos de cálculo matemático. Por esta pérdida de rendimiento, en general, la utilización de este modo no es apropiada para su uso en sistemas de control, por lo que sólo haremos una breve introducción de sus características más relevantes.

El conjunto de instrucciones THUMB únicamente puede establecerse desde el modo usuario, modificándose el modo de ejecución a ARM al cambiar la CPU a cualquiera de los modos privilegiados. El cambio a modo THUMB se efectúa mediante las

(33)

19 instrucciones BX o BXL, que efectúan un salto de memoria y un cambio de modo de ejecución.

Este conjunto de instrucciones THUMB carece de algunas características del conjunto ARM, como es la ejecución condicional de todas las instrucciones. También se ve reducido el número de operandos de las instrucciones, que se ve reducido a dos. Aunque desde este modo tenemos acceso al banco de registros del modo usuario, sólo podemos operar con los registros R0 a R7, y con algunas instrucciones al resto de registros. Así mismo, carece de instrucciones para modificar directamente los registros CPSR y SPSR, por lo que si se necesita modificar explícitamente uno de estos registros, será necesario cambiar a modo ARM.

(34)
(35)

21

3 MICROCONTROLADOR NXP LPC2148

3.1INTRODUCCIÓN

Como se comento en la introducción, nos centraremos en el estudio de este microcontrolador a lo largo del presente trabajo.

En esta sección se mostrarán los datos y características más relevantes del LPC2148, para más detalles podemos consultar el datasheet del dispositivo.

Las características técnicas de este dispositivo son las siguientes: • Microcontrolador ARM7TDMI-S.

• Encapsulado LQFP64.

• Entradas y salidas tolerantes a 5V. • Frecuencia de reloj máxima de 60 MHz

• Oscilador integrado con capacidad de operar desde 1 a 30 MHz

• Diversos modos de bajo consumo, incluyendo habilitación de los relojes de cada periférico.

• 40 KB de memoria SRAM, 512 KB de memoria flash integrada.

• Macrocélula EmbeddedICE RT y Embedded Trace para depuración en tiempo real integrada.

• Controlador USB 2.0 Full Speed con 2kB de memoria SRAM dedicada y 8 KB adicionales accesible mediante DMA.

• Dos conversares A/D de 10 bits, multiplexados desde 14 entradas analógicas. • Un conversor D/A.

• Dos timers con cuatro módulos de captura y otros cuatro de comparación cada uno.

• Reloj de tiempo real con oscilador dedicado. • Dos UARTS tipo 16C550

• Dos controladores I2C de 400 kbits/s • Controlador SPI

• Controlador SSP

• Controlador de interrupciones vectorizadas. • Nueve entradas de interrupción externas. Las aplicaciones típicas de este microcontrolador son:

• Control industrial

• Gateway de comunicaciones • Sistemas de control de accesos • Sistemas médicos.

(36)

22

3.2MEMORIA FLASH INTEGRADA

El LPC2148 integra 512 KB de memoria Flash. Esta memoria puede ser usada indistintamente para almacenamiento de código y datos.

La memoria puede escribirse mediante el la interfaz JTAG integrada o a través de la UART0 mediante la funcionalidad In System Programing, o desde una aplicación en ejecución, por ejemplo, un boot loader.

Esta memoria proporciona un mínimo de cien mil ciclos de borrado/escritura, y un retención de datos de veinte años.

3.3MEMORIA SRAM INTEGRADA

El LPC2148 proporciona 32 KB de SRAM, que puede ser accedida como datos de 8, 16 y 32 bits.

La memoria está diseñada para ser accedida como memoria direccionada en bytes. Los accesos a datos de media palabra y una palabra se hacen a las direcciones alineadas, en concreto, para las medias palabras se ignora el bit 0 de la dirección, y para palabras completas se ignoran los bits 0 y 1.

3.4MAPA DE MEMORIA

Independiente del número de buses presentes en el LPC2148, este microcontrolador posee un mapa de memoria completamente lineal, tal y como se puede apreciar en la siguiente figura:

(37)

23

Figura 3 Mapa de memoria del LPC 2148

Como se puede observar, la memoria Flash integrada se encuentra ubicada a partir de la dirección 0x00000000, y la memoria SRAM se encuentra ubicada a partir de la dirección 0x40000000.

El microcontrolador cuenta con un software de depuración (ARM real monitor) y otro carga (Flash boot loader), preprogramados de fábrica en el rango 0x7FFFFFFF a 0x80000000.

Los periféricos conectados al bus VPB están mapeados en el intervalo de direcciones 0xE0000000 a 0xE0200000. Dentro de este rango, para cada periférico se reserva un espacio de 16K.

La unidad de control de interrupciones vectorizadas se encuentra a partir de la dirección 0xFFFFF000.

Adicionalmente, la región comprendida entre 0x8000000 y 0xE000000 está reservada en todos los dispositivos de la familia LPC2xxx para memoria externa. Aunque el

(38)

24 LPC2148 no cuenta con un bus de memoria externa, otros dispositivos de la familia, como los LPC22xx, si cuentan con dicho bus.

3.5DIAGRAMA DE BLOQUES

Aunque para el programador, todos los periféricos están en un rango continuo de 32 bits, internamente el dispositivo está compuesto por un conjunto de buses, tal como puede apreciarse en el siguiente diagrama de bloques del dispositivo.

(39)

25 El núcleo ARM7 está conectado al bus AHB6. A este bus está conectado el controlador

de interrupciones y un puente al bus VPB7

.

El resto de periféricos está conectado directamente al bus VPB. Este bus VPB posee un divisor de reloj de forma que puede funciona a una velocidad inferior a la del núcleo, esto permite por un lado establecer mecanismos de ahorro de energía, y por otro, poder conectar periféricos lentos sin que suponga un cuello de botella para el bus AHB.

Para conectar la CPU a la memoria Flash y SRAM existe un tercer bus dedicado.

3.6MODULO DE ACELERACIÓN DE MEMORIA (MAM)

Este módulo es fundamental para conseguir una elevada velocidad de ejecución, ya que la memoria Flash es más lenta que la CPU, con un tiempo de acceso de 50ns, lo que limitaría la velocidad de ejecución a 20MHz.

Para acelerar la ejecución, la memoria Flash está dividida en dos bancos con una anchura palabra de 128 bits cada uno, accesibles de forma independiente, esto permite cargar cuatro instrucciones ARM u ocho instrucciones THUMB en una sola operación.

Estos bancos están entrelazados de forma que mientras se ejecuta el código cargado desde un banco, se efectúa la carga del siguiente. Este método funciona muy bien con las instrucciones ARM, que permiten suavizar pequeños saltos mediante los códigos de condición vistos en el capítulo anterior. Adicionalmente, el módulo MAM cuenta con buffers para los saltos y bucles, de forma que no tengan que efectuarse operaciones de carga para instrucciones ejecutadas recientemente.

El módulo MAM se programa mediante dos registros: el registro de temporización (timing register), y el registro de control (control register).

Mediante el registro de temporización podemos establecer la relación entre el reloj de la CPU y el tiempo de acceso a flash, en el podemos fijar el números de ciclos de reloj necesarios para acceder a la Flash. Como nuestra CPU trabaja a 60 MHz, y la frecuencia máxima de acceso a la Flash es de 20Mhz, el numero de ciclos de reloj requeridos será de tres, de forma que por cada tres ciclos de reloj podemos cargar cuatro

instrucciones, con lo que el MAM siempre tendrá instrucciones disponibles para la ejecución.

6

Advanced High performance Bus, definido por ARM.

7

(40)

26 El registro de configuración del MAM sirve para establecer el modo de operación del módulo. Hay tres modos posibles:

Figura 5 Modos de operación del MAM

Después de un reset, el MAM está deshabilitado, y todos los accesos serán directos a Flash.

También es posible habilitar solo parcialmente el MAM, pero haciendo que los saltos y los accesos a datos en Flash se hagan directamente.

Finalmente, podemos habilitar completamente el MAM, de forma que todos los accesos a Flash se hagan a través del MAM.

La razón de estos es poder permitir un modo de ejecución perfectamente

determinista, ya que el uso del MAM implica tiempos de ejecución no determinísticos. En cualquier caso, es posible mediante herramientas de depuración, determinar el tiempo de ejecución del código. El MAM cuenta con una serie de registros que recogen estadísticas sobre los accesos a Flash y a los búferes del MAM. Estas medidas nos proporcionan información sobre la eficacia del MAM en nuestra aplicación. En este punto, es importante observar que sí es posible obtener una ejecución determinística a la máxima velocidad de CPU si cargamos el código de programa en memoria SRAM, con el inconveniente de que la cantidad de esta es más limitada que de Flash.

3.7SISTEMA DE INTERRUPCIONES DE LA FAMILIA LPC2000

En este punto trataremos el hardware implicado en el manejo de interrupciones externas a la CPU ARM7, englobando tanto los periféricos integrados en el LPC2148 como las fuentes de interrupción externas.

La CPU ARM7 posee dos líneas para interrupciones externas, una para interrupciones rápidas (FIQ), y otra para interrupciones generales (IRQ). Para poder conectar

múltiples periféricos a estas dos únicas líneas, el LPC2148 (y toda la familia LPC2000) integra un modulo controlador de interrupciones vectorial (VIC).

(41)

27

Figura 6 Controlador de interrupciones

El VIC permite conectar todas las fuentes de interrupción a la CPU de tres formas: como interrupción FIQ, como interrupción IRQ vectorizada, y como interrupción IRQ no vectorizada.

Como se ha comentado, cualquier fuente de interrupción puede asignarse como FIQ, aunque hay que tener en cuenta que es conveniente no tener más de una interrupción de este tipo, ya que en ese caso tendríamos que inspeccionar cual es la fuente de la interrupción, lo que aumentaría el tiempo de atención a la misma. Ante la ocurrencia de una interrupción FIQ, el procesador cambiará a modo FIQ y saltará al vector FIQ. A diferencia que las interrupciones FIQ, las interrupciones IRQ pueden vectorizarse. El VIC tiene una tabla con 16 slots para los vectores, cada slot se compone de un registro de dirección y un registro de control, mediante el cual podemos asignar el vector a una fuente de interrupción.

Cuando se genere una interrupción, el VIC cargara la dirección correspondiente a esa fuente de interrupción en el registro de vector de dirección (Vector Address Register), simultáneamente la CPU pasará a modo IRQ y saltará al vector de interrupción IRQ, en el cual se deberá cargar el valor del VIC en el PC para entrar en el código de

tratamiento de interrupción correspondiente.

Como hemos comentado anteriormente, el VIC es capaz de gestionar hasta 16 fuentes de interrupción como interrupciones vectorizadas y al menos una como interrupción FIQ. Si tuviésemos más de 17 fuentes de interrupción, podríamos tratar el resto como interrupciones no vectorizadas. En este caso se saltará a un vector de interrupción por defecto en el que se deberá comprobar cuál es la fuente de interrupción y ejecutar el código adecuado.

(42)

28

3.8GESTIÓN DE LA ENERGÍA

El LPC2148 provee varios mecanismos de ahorro energético. Mediante un uso adecuado del divisor del VPB podemos reducir el consumo de energía global del microcontrolador. Adicionalmente, el LPC2148 posee algunas características de ahorro energético adicionales.

La CPU ARM7 tiene dos modos de apagado que pueden controlarse desde el registro PCON. Así, podemos detener la CPU completamente pero dejar los periféricos

funcionando normalmente, de forma que cuando se produzca una interrupción la CPU se active.

El otro modo de apagado detiene tanto la CPU como los periféricos. En este modo la ejecución solo podrá ser reanudada mediante una fuente de interrupción externa. Adicionalmente es posible controlar cada periférico integrado individualmente, de forma que solo estén en funcionamiento los necesarios para la aplicación.

Hay que tener en cuenta que no es posible depurar el dispositivo cuando entra en algún modo de ahorro de energía.

3.9PERIFÉRICOS DE USUARIO

En las próximas secciones comentaremos los periféricos de usuario de uso más común presentes en el LPC2148.

Como se ha comentado anteriormente, el objeto de este documento no es sustituir al manual de usuario del LPC2148, por lo que solo se introducirán los aspectos

fundamentales de algunos de los periféricos del microcontrolador.

Antes de abordar los distintos periféricos, hay que tener muy en cuenta que en el LPC2148 todos los pines de E/S pueden estar conectados internamente mediante un bloque multiplexor a varios periféricos. Este bloque multiplexor, llamado pin select block permite configurar un pin del dispositivo como GPIO o rutearlo a uno de otros tres periféricos, por lo que puede darse la situación de que no puedan usarse dos periféricos simultáneamente. Esta configuración se hace mediante los registros PINSELn.

(43)

29

Figura 7 Pin select block

3.9.1 E/S DE PROPÓSITO GENERAL

Después de un reset, el pin connect block configura todos los pines del LPC2148 como entradas de propósito general (GPIO).

Podemos acceder a los puerto de E/S de propósito general del LPC2148 a través de un conjunto de registros conectados directamente al bus local de la CPU, por lo que es posible manipularlos a la velocidad de la CPU. Es posible controlar la dirección de cada bit de los puertos.

La lectura de los puertos, independientemente del estado, se hace a través de los registros IOPIN.

La escritura se hace a través de los registros IOSET y IOCLR, y la configuración como entrada o salida se hace en los registros IODIR.

3.9.2 TIMERS

El LPC2148 incluye dos timers de 32 bit. Estos timers son idénticos, y pueden funcionar como timers o como con contadores. Cada timer cuenta ciclos del reloj PCLK del bus VLSI (funcionando como timer) o de un reloj externo (funcionando como contador) tras dividirlo mediante un divisor programable de 32 bits (PC, prescale counter).

(44)

30

Figura 8 Diagrama de bloques de los timers.

El valor del PC se incrementará con cada ciclo de PCLK hasta alcanzar el valor

almacenado en el registro de pre escalado PR, en ese momento el valor del contador se incrementará y el PC se reseteará a cero.

Cada timer cuenta con cuatro registros de captura (CR), en los cuales podemos almacenar al valor del timer ante la ocurrencia de una transición en una señal de entrada externa. Esto puede ser útil por ejemplo para demodular señales PWM, medir frecuencias, etc.

Cada uno de estos registros de captura tiene un pin de entrada asociado que puede habilitarse mediante el pin connect block, y puede configurarse mediante el registro TnCCR para ser sensible a flancos de subida y/o de bajada y opcionalmente generar una interrupción.

(45)

31 Cada timer también cuenta con cuatro registros de comparación (MR), mediante los cuales podemos disparar acciones, como generar una interrupción (configurable en el registro TnMCR) o modificar un pin de salida (configurable en el registro TnEMR).

3.9.3 UART

El LPC2148 integra dos UARTs conformes con el estándar 550, tanto en

funcionamiento como en el orden de los registros. Estas dos UARTs son idénticas, salvo que la UART1 posee líneas adicionales para control de MODEMs.

La siguiente figura muestra el diagrama de bloques de la UART1 y su conexión al bus VPB. La UART0 es exactamente igual, salvo por que no incluye el bloque etiquetado como MODEM:

Figura 9 Diagrama de bloques de la UART 1

La UART incluye un buffer de recepción y de transmisión de 16 bytes, siendo el de recepción configurable para producir interrupciones tras la recepción de 1, 4, 8 y 14

(46)

32 bytes. Como en el resto de periféricos, para la utilización de las UARTs será necesario configurar correctamente el pin connect block.

Los parámetros de transmisión de las UARTs se configuran en registro LCR (line control register).

El baud rate generator de las UARTs consiste en un divisor de 16 bits conectado al reloj de periféricos (PCLK). Tendremos que configurar este divisor para obtener una

frecuencia 16 veces superior a la que queramos tener en la línea de transmisión. El valor de este divisor se almacena en dos registros de 8 bits, DLM (divisor latch MSB) y DLL (divisor latch LSB).

La operación de las FIFOs es transparente para el programador. Una vez configurado su tamaño, la escritura en el THR (transmit holding register) o la lectura en el RBR (receive buffer register), insertaran o extraerán un byte en la FIFO.

Aunque las UARTs poseen un canal dedicado en el VIC, éstas a su vez pueden generar tres tipos de interrupción diferentes, por lo que en la RTI habrá que determinar la causa de la interrupción. Estas causas pueden ser, un error en la transmisión, que puede ser de diversos tipos, la transmisión de todos los bytes de la FIFO de transmisión, o la recepción de un número de bytes configurable.

3.9.4 CONVERTIDOR ANALÓGICO A DIGITAL

El LPC2148 integra un convertidor A/D de 10 bits de aproximaciones sucesivas con ocho entradas analógicas multiplexadas. Como en el resto de periféricos, el reloj del convertidor deriva de PCLK, teniendo en cuenta las restricciones temporales del convertidor, tendremos que configurar el registro CLKDIV de forma que la frecuencia del reloj del convertidor no sea mayor que 4.5MHz.

Podemos seleccionar la resolución de la conversión entre 3 y 10 bits, modificándose por tanto el tiempo de conversión.

El convertidor puede operar en dos modos: un modo individual, en el que se realiza una conversión sobre el canal seleccionado, y un modo ráfaga, en la que se realizan conversiones sobre todos los canales configurados. En ambos casos, al terminar el proceso puede generarse una interrupción. También puede configurarse para que las conversiones se realicen de forma continua, sin necesidad de iniciar el proceso tras cada interrupción, pudiendo conseguirse de este modo alcanzar la máxima tasa de conversión.

(47)

33

3.9.5 CONVERTIDOR DIGITAL A ANALÓGICO

El convertidor digital analógico es el periférico más sencillo del LPC2148, ya que consta de un único registro (DACR) en el que podemos escribir directamente el valor a

convertir.

Este conversor es de 10 bits y como los otros periféricos es necesario configurar el registro PINSELn correspondiente para conectarlo a su pin de salida asociado.

Como única particularidad, este conversor puede operar en dos modos: un de bajo fan out (350 µA) y alta velocidad de conversión (1µs), y otro de alto fan out (700 µA) pero más lento (2.5 µs). Este modo se configura con el bit 15 del registro DACR.

3.9.6 MODULADOR PWM

El modulador PWM del LPC2148 es similar a los timers de propósito general, con hardware adicional que le permite generar seis señales PWM con modulación de un flanco o tres de dos flancos, de hecho el modulo PWM puede utilizarse como un timer adicional si no se habilita el modo PWM.

La principal diferencia en cuanto al comportamiento, con respecto a los timers de propósito general funcionando como contadores, es que en los timers, cuando se escribe un valor nuevo en el registro de comparación, este valor se hace efectivo inmediatamente y además eso ocurre para cada registro de comparación, lo que puede provocar glitches y una desincronización de las señales PWM entre los distintos canales. Para evitar esto, el modulador PWM implementa un mecanismo de registros sombra que permite que todos los valores se actualicen simultáneamente y al

comienzo de un nuevo ciclo, con lo que puede generarse la señal PWM de forma correcta.

Este periférico cuenta con siete registros de comparación, cada uno de los cuales está conectado a una salida. Puede programarse para poner la salida a uno, cero o no hacer nada cuando se alcance el valor del registro de comparación.

Como puede apreciarse en la figura, las salidas de estos registros de comparación están conectadas a registros S/R, en los cuales la entrada S es seleccionable entre la salida match del registro de comparación 0 y la salida del registro de comparación en cuestión. De este modo se puede implementar la modulación de dos flancos o de un solo flanco.

(48)

34

Figura 10 Diagrama de bloques del módulo PWM

En el caso de modular solo un flanco, con el registro de comparación 0 podemos controlar el periodo total del ciclo, y con el resto de registros de comparación, controlamos el ciclo de trabajo. En este modo la señal Match0 está conectada a la entrada S de todos los biestables, con lo que al final de cada ciclo se pondrán a 1. Para la modulación de dos flancos, el registro de comparación 0 solo se utiliza para controlar el periodo de la señal. En este caso las señales conectadas a los biestables son las correspondientes a los registros de comparación 1 a 6, de forma que podemos controlar la conmutación de los flancos de bajado y de subida.

(49)

35

3.9.7 WATCHDOG TIMER

Es común en los microcontroladores contar con un mecanismo de seguridad que permita al sistema autoresetearse ante un fallo. Este mecanismo es habitualmente, y en el LPC2148, usar un timer que provocará un reset global en caso de

desbordamiento, por lo que en nuestro software insertaremos una rutina de resetéo que se ejecutara periódicamente.

El watchdog timer (WDT) se controla a través de cuatro registros. El timeout se programa en el registro WDTC. La siguiente figura muestra su diagrama de bloques:

Figura 11 Diagrama de bloques del WDT

El watchdog puede configurarse mediante el registro WDMOD para generar una interrupción o bien un reset. En caso de generar un reset, activará un flag indicando que se ha producido un timeout, de forma que después del reset, el programa puede determinar si se está iniciando después de un reset debido a un fallo.

(50)

36 Tanto para iniciar el watchdog como para resetearlo periódicamente, tenemos que realizar una secuencia de inicio, consistente en escribir consecutivamente 0xAA y 0x55 en el registro WDFEED.

En cualquier momento podemos leer el valor de la cuenta del watchdog timer en el registro WDTV.

3.10 HARDWARE DE DEBUG

El LPC2148 incluye varios mecanismos hardware para permitir la depuración en circuito. El chip incluye un puerto JTAG, mediante el cual podemos efectuar una depuración básica, controlando la ejecución, insertando breakpoints e inspeccionado la memoria, y un macrocélula ARM embedded trace module, que permite una

depuración más avanzada, que permite trazar código en tiempo real, hacer análisis de cobertura de código y de rendimiento, pero que requieren hardware adicional a la interfaz JTAG, y que por tanto no cubriremos en el presente trabajo.

3.11 CONCLUSIONES

Como hemos visto a lo largo del presente capítulo, el LPC2148 tiene unas

características adecuadas para su uso como microcontrolador de propósito general, así como suficiente capacidad de cálculo y de E/S como para poder utilizarse en sistemas de control.

También es muy interesante la integración del puerto JTAG para depuración, ya que otras familias, la depuración en circuito solo puede llevarse a cabo con costosos emuladores adicionales.

(51)

37

4 ENTORNO Y HERRAMIENTAS DE DESARROLLO

4.1INTRODUCCIÓN

A la hora de elegir una plataforma hardware para realizar un desarrollo,

independientemente de la capacidad computacional y de E/S de la misma, es muy importante tener en cuenta otras consideraciones que pueden afectar sensiblemente al proceso de desarrollo con dicha plataforma. Uno de los elementos más importante a considerar son el entorno y las herramientas de desarrollo disponibles.

A la hora de elegir una herramienta de desarrollo, podemos tener en cuenta los siguientes requisitos:

• Adecuación al proceso de desarrollo que vamos a aplicar:

o Debemos elegir una herramienta coherente con el proceso de desarrollo que queramos seguir. Existen multitud de herramientas, basadas en lenguajes de programación convencionales, programación gráfica, diseño basado en modelos, etc.

• Capacidad de depuración y traza de código:

o Si bien en cualquier entorno la capacidad de depuración y traza de código es una funcionalidad obligada, en los sistemas en tiempo real cobra un valor especial, ya que posiblemente necesitemos calcular tiempos de ejecución y monitorizar el uso de la CPU de forma precisa. • Disponibilidad de hardware para depuración:

o Relacionado con el punto anterior, es interesante poder contar con una variada oferta de herramientas hardware para depuración compatibles con el entorno de desarrollo, de manera que no dependamos de un solo fabricante.

• Existencia de una amplia base de usuarios:

o Es quizás unos de los puntos más importantes, ya que las plataformas con muchos usuarios suelen estar muy documentadas no solo por los fabricantes, si no por las comunidades de usuarios, existiendo foros en los que se intercambia conocimiento técnico y se puede obtener ayuda de forma gratuita. También es interesante ya que las plataformas ampliamente extendidas suelen estar más depuradas y optimizadas simplemente por el hecho de que son utilizadas por un gran número de usuarios, lo que implica que es utilizada en multitud escenarios

distintos.

• Coste de las herramientas:

o Más que un requisito es una limitación. Con toda seguridad, a la hora de elegir el entorno de desarrollo tendremos una limitación

(52)

38 presupuestaria. Como veremos más adelante, y como suele ocurrir en otros ámbitos, no siempre la mejor herramienta es la más cara.

Existen números compiladores y entornos de desarrollo tanto libres como propietarios para microcontroladores y microprocesadores ARM. En el presente trabajo, se ha optado por usar únicamente herramientas libres disponibles de forma gratuita y con licencia GNU GPL u otras similares.

Para facilitar la redistribución del entorno de desarrollo, se empleara un sistema operativo virtualizado, de forma que no sea necesario hacer ningún tipo de

configuración al instalar el entorno de trabajo en una máquina nueva, a la vez que se hace completamente portable.

Como sistema operativo virtualizado se ha utilizado la distribución de Linux Ubuntu 10.4 LTS (Long Term Support), que una versión con soporte a largo plazo (tres años). Como se ha comentado anteriormente, el entorno completo de desarrollo se facilita como una imagen de máquina virtual para VMWare, de forma que no haya que realizar el largo proceso de instalación y configuración en las máquinas de desarrollo. En cualquier caso, en los siguientes punto explicaremos es proceso de instalación de todas las herramientas necesarias.

4.2EL ENTORNO DE DESARROLLO 4.2.1 UBUNTU LINUX

Como sistema operativo se ha optado por la distribución Ubuntu de Linux, debido a su probada solidez y amplia implantación entre los usuarios.

Se ha elegido una versión LTS para asegurar la operatividad del entorno a medio plazo. La instalación de Ubuntu es un proceso sencillo, en el que nos limitaremos a seguir el asistente de instalación.

4.3HERRAMIENTAS DE DESARROLLO 4.3.1 CODESOURCERY G++ LITE

Codesourcery G++ Lite es una distribución libre del toolchain GNU. Es ofrecido por la compañía Codesourcery, que además comercializa versiones de pago que integran un IDE basado en Eclipse, muy similar al que instalaremos nosotros posteriormente, y opciones de soporte.

(53)

39 Está disponible para varias familias de procesadores, obviamente nosotros

instalaremos la versión para ARM.

La versión Lite solo incluye las GCC:8 los compiladores de C y C++, ensamblador, linker,

las librerías estándar y debugger.

La elección de usar las GCC se debe básicamente al hecho de que las herramientas son gratuitas y de que disponen de un amplio soporte.

El rendimiento de estas herramientas es muy bueno, comparable a cualquier herramienta propietaria, obteniéndose resultados en cuanto tamaño del código generado y velocidad de ejecución muy parecidos. Existen múltiples comparativas de rendimiento en la red, siendo una de las más completas la realizada por Raisonance9

. Por otra parte, el depurador GDB se integra bien en nuestro entorno de desarrollo, permitiéndonos depurar código en el microcontrolador usándolo de forma conjunta con OpenOCD y una interfaz JTAG, tal y como veremos más adelante.

4.3.2 ECLIPSE IDE

Eclipse es un popular entorno de desarrollo (IDE) gratuito y de fuentes abiertas. Aunque inicialmente el fue un proyecto iniciado por IBM, en la actualidad es

desarrollado y soportado por la Eclipse Foundation, que es una fundación sin ánimo de lucro financiada por sus miembros estratégicos, entre los que se encuentra compañías como IBM, NOKIA, SAP, ORACLE, CISCO, Motorola o BlackBerry.

Este IDE es neutral, extensible a múltiples lenguajes de programación y herramientas (compiladores, debuggers, etc.).

En este proyecto usaremos la versión Eclipse CDT10

. Esta versión proporciona un entorno de desarrollo para C y C++, que integraremos con nuestro compilador.

4.3.3 OPENOCD

OpenOCD es una utilidad software que permite interfasear el depurador GPB con la interfaz JTAG para poder programar y depurar el microcontrolador. GDB establece una

8

GNU Compiler Collection

9

http://www.raisonance.com/arm_benchmark.html

10

(54)

40 conexión TCP/IP con OpenOCD, y éste, en base a una serie de archivos de

configuración, se comunicara con la interfaz JTAG que controlará el estado de ejecución del microcontrolador a través del TAP (Test Access Port) del mismo.

Esta herramienta es muy flexible, ya que incluye un intérprete de lenguaje Tcl, lo que le permite ejecutar scripts muy complejos. En el caso del LPC2148 como en otras muchas plataformas, no tendremos que escribir los scripts de configuración, ya que con la distribución de la herramienta se incluyen diversos scripts para multitud de plataformas, que además nos pueden servir como punto de partida para crear scripts más personalizados, como haremos más adelante. Estos scripts se encuentran en el directorio scripts (normalmente en /usr/share/openocd/scripts).

Hay tres tipos de scripts, contenidos en sus correspondientes subcarpetas: • Interface: para cada tipo de adaptador JTAG soportado

• Board: para distintas placas de desarrollo • Target: específicos para cada CPU

Normalmente solo tendremos que hacer referencia a dos scripts, el de configuración de interfaz y el de la placa que estemos utilizando.

En el contexto de este proyecto configuraremos la ejecución OpenOCD desde eclipse como herramienta externa, para lo cual definiremos dos configuraciones de ejecución en el menú “External tools configuration”.

La primera configuración será para la utilización de OpenOCD para depuración. La siguiente captura de pantalla refleja la configuración necesaria:

(55)

41 Se puede observar que ejecutamos los scripts de configuración de la interfaz JTAG y del microcontrolador.

Para iniciar una sesión de depuración tendremos siempre que ejecutar esta configuración desde Eclipse.

Adicionalmente, necesitaremos configurar la depuración en eclipse. Para ello añadiremos una configuración de depuración de tipo “Zylin embedded debug”. Tendremos que establecer como debugger arm-none-eabi-gdb, y configurar los

comandos de inicialización de tal y como están definido en cualquiera de los proyectos de ejemplo incluidos en el DVD adjunto.

La segunda configuración es específica para flashear el microcontrolador:

Figura 13 Flasheo del micro con OpenOCD

En esta configuración además ejecutamos un script específico para flashear el micro. Cuando generemos una nueva versión de un programa, debemos cargarla en la flash del microcontrolador usando este script. Este script se adjunta en el DVD que

acompaña al presente documento.

4.3.4 PLACA DE DESARROLLO OLIMEX LPC-P2148

Para el desarrollo del sistema de control emplearemos esta placa de desarrollo, basada en un microcontrolador LPC2148.

Referencias

Documento similar

Por lo tanto, en base a su perfil de eficacia y seguridad, ofatumumab debe considerarse una alternativa de tratamiento para pacientes con EMRR o EMSP con enfermedad activa

o Si dispone en su establecimiento de alguna silla de ruedas Jazz S50 o 708D cuyo nº de serie figura en el anexo 1 de esta nota informativa, consulte la nota de aviso de la

 Tejidos de origen humano o sus derivados que sean inviables o hayan sido transformados en inviables con una función accesoria..  Células de origen humano o sus derivados que

d) que haya «identidad de órgano» (con identidad de Sala y Sección); e) que haya alteridad, es decir, que las sentencias aportadas sean de persona distinta a la recurrente, e) que

RTAI considera a Linux como un sistema de apoyo para correr tareas cuando no hay actividades de tiempo real.. Módulos

Proporcione esta nota de seguridad y las copias de la versión para pacientes junto con el documento Preguntas frecuentes sobre contraindicaciones y

[r]

Contraindicaciones: El uso de la mascarilla está contraindicado para los pacientes y los miembros de sus familias, profesionales sanitarios y compañeros de