Introducción a los Microcontroladores (ARM) José Manuel Rodríguez Ascariz
Introducción Microprocesadores (8, 16, 32, 64 bits). COMPUTADOR Solo CPU (ALU, ejec. Instrucciones, control, buses). Necesitan memoria y periferia externa. Generación de reloj y mucha glue logic. Arquitectura flexible, potente. Microcontroladores (8, 16, 32 bits). EN TODO Integran numerosos periféricos, reloj, etc. No glue logic Flash y RAM interna (1 MB), con posibilidad amp. Externa. Procesadores de aplicaciones (32 bits, 64?). MOBILE CPUs de altas prestaciones. Multitud de periféricos incluidos. Necesitan memoria externa (flash y RAM) (hasta 256 MB).
Microcontroladores (MCUs) 8 bits Con core 8051: multitud de fabricantes (Cygnal:100 MHz, múltiples opciones, TI, Siemens, Atmel, NXP) AVR, potente arquitectura RISC de Atmel. Amplia gama. PIC de Microchip, uno de los más comunes (RISC, amplia gama). H8 de Hitachi. 16 bits MSP430 de TI, bajo consumo, RISC, gran variedad. Basados en ARM (Thumb mode). HC16 de Freescale. 32 bits Con core ARM, múltiples fabricantes, gran variedad. Coldfire de Freescale. Potentes, variedad, comunes. Con core MIPS. Pocos fabricantes (tendencia routers) SH de Hitachi. AVR32, en auge.
Prestaciones: Elección de MCUs Capacidad de cálculo, periféricos, memoria interna, ampliación Herramientas desarrollo Compiladores (fiabilidad, precio, IDE, fácil manejo) Depuradores (JTAG, dep. Serie) Disponibilidad open : gnu, OpenOCD, Librerías BSPs y RTOS Fabricante (preferencia por marca, tiempo obsolescencia intel- ) Hardware hecho (tarjetas) Precios del conjunto hardware-software
Los MCUs integran Memorias Flash y RAM, posible externa Generación de reloj (oscilador, PLL) Pines de I/O genéricos (GPIO, multitud) Interrupciones por GPIO Timers, PWM, RTC Comunicaciones serie (UARTs) Bus serie SPI (hasta 25 MHz) Bus IIC (hasta 400 khz) Ethernet USB (device, OTG, host) ADCs y DACs, posible comparadores Bus CAN Watchdog y gestion de energía Algunos: Encriptación Algunos: Bus SSI La casuística es muy amplia. Muchos introducen periféricos muy particulares. Muchas veces se elige un MCU por esos periféricos raros.
MCUs core ARM ARM es una compañía que vende modelos de CPU Advanced RISC Machines: modelos de altas prestaciones Los fabricantes de silicio integra cores ARM en MCUs Cores según potencia: ARM7 (70 MHz), ARM9, ARM11 (750 MHz) Nueva arquitectura Harvard, Cortex. Multitud de fabricantes de silicio: TI, Freescale, NXP, ST, Atmel, Luminari, ADI, Cirrus, Sharp Multitud de herramientas de desarrollo GNU, ARM, Keil, IAR, Green Hills, Rowley, ICC Multiples RTOS con BSPs disponibles VxWorks, Linux, INTEGRITY, RTEMS, NUCLEUS Cerca del 70% del mercado embedded
MCUs ARM de NXP Amplia gama: cores ARM7 y ARM9 Múltiples configuraciones basados en ARM7 Casi cualquier tipo de periférico disponible Periféricos potentes y de arquitectura muy fácil de programar Gran versatilidad (multiplexación de pines) Compatibilidad y actualización a dispositivos de más prestaciones Muy común: disponible todo tipo de software, librerías, herramientas, etc.
Alimentación Primeros pasos ante un MCU Corrientemente: 3V3 I/O y 1V2.. 1V8 core. Generación clock (oscilador) y clocks internos PLL y módulo de generación clk core y clk perif. Circuito de RESET Boot (startup.s) Como cargar programa (JTAG, serie, interfaz propia) Esquemáticos. Siempre manuales de referencia
Entorno de desarrollo software Entorno Keil uvision 3.20 con RealView de ARM Ver: Tutorial de Keil proporcionado Startup.s Simular un bucle for con dos variables utilizando el debugger: breakpoints, trace (C y asm), watch
Clocks Cristal de cuarzo (XTAL) PLL (sintetizador frecuencias) CCLK (Clock ARM core) CCLK = XTAL*MSEL PCLK (Clock para periféricos) PCLK = CCLK / PDIV (posibles PDIV = 1,2,4) Típicamente XTAL = 12 MHz, CCLK =60 MHz, PCLK = 15 MHz (CCLK y PCLK Configurados en startup.s)
I/O Básica: GPIOs #include <LPC21xx.H> int main(void) { // Bits 16..23 del PORT1 como salida IODIR1 = 0xff << 16; IOCLR1 = 0xFF << 16; } while(1) { // "Encender" LED conectado a P1.16 IOSET1 = desp ;// BIT_NUMERO_16; Retardo(CONST_1_SEGUNDO); //BIT_NUMERO_16; // "Apagar" LED IOCLR1 = desp; conectado a P1.16 Retardo(CONST_1_SEGUNDO); }
Interrupciones externas: EINTx REGISTRO EXTINT: EINT3 - EINT2 - EINT1 - EINT0 => Son los flags de interrupción externa. Borrar bit correspondiente antes de salir de la ISR
Ejemplo de interrupción externa. Activa por nivel: simular ejecutando paso a paso y comprobar que es "persistente" mientas P0.14 (EINT1) está a nivel alto. Modificar el ejemplo para activar la interrupcion por flando de subida. Añadir una variable en la rutina para comprobar si hay rebotes (bounce switch).
Timers Funciones comunes en la mayoría MCUs Match Compare Input Capture Contador de impulsos Generación interrupciones La familia LPC21xx: Amazing timers 4 canales por timer Todos los registros 32 bits (Prescaler, Match, Capture) Match: Out (L,H,Toggle), Stop, Reset, IRQ Capture: Input (ambos flancos), IRQ PCLK = CCLK / PDIV (posibles PDIV = 1,2,4)
El timer cuenta a PCLK/(PR+1) Hz En el siguente ejemplo a 15 MHz/256= 58.59375 khz Modo Match salida toggle en MAT0.0, con Reset e IRQ
Utilización simple del Match: retardo 1 s
RTC (Reloj tiempo real: calendario)
Inicialización de registros del RTC
Interrupción del RTC La rutina de tratamiento de interrupción es: La inicialización del RTC en el programa principal es: