Introducción a la Tiva TM4C123G Launchpad Rodrigo Chang Universidad de San Carlos de Guatemala com4.e6.usac@gmail.com 14 de febrero de 2015 Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 1 / 18 Lo que veremos hoy... 1 Microcontrolador Tiva TM4C123G 2 Proceso de desarrollo en Code Composer Studio 3 Introducción a la librerı́a de periféricos Tivaware 4 Fuentes de reloj para el sistema 5 Introducción a las entradas y salidas de propósito general Caracterı́sticas y configuración 6 Conceptos necesarios antes de programar Configuración básica Configuración con la TivaWare Configurando salidas Nuestro primer programa Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 2 / 18 Microcontrolador Tiva™ TM4C123G Bajo consumo de energía Tan bajo como 370 µA/MHz Despierta en 500µs de los modos de bajo consumo. Corriente en modo RTC tan baja como 1.7µA Control de energía interno y externo. Core and FPU ... Núcleo M4 y unidad de punto flotante Núcleo de 32-bit ARM® Cortex™-M4 Juego de instrucciones Thumb2 de 16/32-bit : Frecuencia de reloj del sistema hasta 80 MHz 100 DMIPS @ 80MHz Flexibilidad en el reloj del sistema 26% menos memoria y 25% más rápido que Instrucciones puras 32-bit Oscilador de precisión interno. Oscilador principal externo con soporte de PLL. Oscilador interno de baja frecuencia. Real-time-clock (RTC) a través del módulo de Hibernación Aritmética saturada para procesamiento de señales Manipulación atómica de bits. Leer-Modificar-Escribir usando bit-banding. Multiplicación y división por hardware en un sólo ciclo. Acceso desalineado a los datos para un uso más eficiente de la memoria. Unidad de punto flotante de precisión simple de acuerdo al IEEE754 JTW y Serial Wire Debug como acceso de depuración. Memory ... Memoria del TM4C123GH6PM 256KB de memoria Flash Ciclo-simple a 40MHz Búfer de pre-búsqueda y rama especulativa mejora el desempeño arriba de 40 MHz 32KB SRAM de ciclo-simple con bit-banding ROM interna cargada con el software TivaWare Librería manejadora de periféricos Gestor de arranque Tablas de criptografía del Advanced Encryption Standard (AES) Funcionalidad de detección de errores utilizando Cyclic Redundancy Check (CRC) 2KB EEPROM (rápida, ahorra memoria) 500K ciclos de programación/borrado. 32 bloques de 16-palabras Borrado por masa o por bloques. Retención de datos de 10 años Tiempo de lectura de 4 ciclos de reloj. 0x00000000 Flash 0x01000000 ROM 0x20000000 SRAM 0x22000000 Bit-banded SRAM 0x40000000 Periféricos y EEPROM 0x42000000 Periféricos Bit-banded 0xE0000000 Instrumentación, ETM, etc. Peripherals ... Periféricos del TM4C123GH6PM Conectividad serial Conexión USB 2.0 (OTG/Host/Dispositivo) 8 - UART with IrDA, 9-bit y soporte ISO7816 6 – Módulos I2C 4 – Módulos SPI, con formatos: Microwire Interfaz serial síncrona de Texas Instruments Freescale SPI 2 – Módulos CAN More ... Periféricos TM4C123GH6PM Dos “simples ADC’s” de 1MSPS y 12-bit SAR 12 entradas compartidas. Medición diferencial y de terminación única Sensor de temperatura interno. 4 secuenciadores de muestras programables Control flexible de trigger: SW, Timers, comparadores analógicos, GPIO Referencias de voltaje VDDA/GNDA Promediado opcional por hardware 3 comparadores analógicos y 16 digitales Habilitación de µDMA 0 - 43 GPIO Cualquier GPIO puede activar una interrupción externa por nivel o por flanco. Pueden iniciar los secuenciadores de muestras o las transferencias µDMA directamente. Tasa de conmutación hasta la velocidad del reloj del CPU en el Advanced High-Performance Bus Configuración de entradas tolerantes a 5V (excepto por PB0/1 y los pines de datos USB cuando funcionan como GPIO) Fuerza de manejo programable (2, 4, 8 mA or 8 mA con control de slew rate) Resistencias débiles programables pull-up, pull-down, y drenador abierto. More ... TM4C123GH6PM Peripherals Unidad de protección de memoria - Memory Protection Unit (MPU) Genera una falla en el manejo de memoria en el acceso incorrecto a la región. Timers 2 Watchdog timers con relojes separados. Temporizador SysTick. 24-bit RTOS de alta velocidad. Seis timers de propósito general de 32-bit y seis de 64-bit Modos PWM y CCP Conexión en cadena de timers. User enabled stalling on CPU Halt flag from debugger for all timers 32 canales de µDMA Basic, Ping-pong and scatter-gather modes Dos niveles de prioridad Tamaños de datos de 8,16 y 32-bit Habilitación de interrupciones. More... Periféricos TM4C123GH6PM Nested-Vectored Interrupt Controller (NVIC) 7 excepciones y 71 interrupciones con 8 niveles de prioridad programables Encadenamiento de interrupciones y otras características de baja latencia. Determinística: siempre 12 ciclos o 6 con encadenamiento de cola. Sistema automático de guardado y restauración de registros. Dos módulos de control de movimiento. Cada uno con: 8 salidas PWM de alta resolución. Puentes H generadores de banda muertacontrol de polaridad por hardware. Falla de entrada para apagado de baja latencia. Quadrature Encoder Inputs (QEI) Sincronización en los módulos y entre los mismos. Board... Tiva™ EK-TM4C123GXL LaunchPad ARM® Cortex™-M4F 64-pin 80MHz TM4C123GH6PM Interfaz en la placa USB ICDI (In-Circuit Debug Interface) Puerto micro AB USB Switch de control de Dispositivo/ICDI Arreglo de pines BoosterPack XL con soporte para el convencional BoosterPack 2 botones para el usuario (SW2 conectado al pin WAKE) Botón de reset 3 LEDs para usuario (1 disp. tri-color) Puntos de medición de corriente. Cristal de 16MHz como osc. principal Cristal de 32.768kHz para RTC Regulador de 3.3V Soporte para distintos IDEs: Lab... Herramientas de desarrollo Proceso de desarrollo en CCS Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 3 / 18 Proceso de desarrollo en Code Composer Studio Compilador .asm Librerías Estándar .out .obj .asm Linker Ensamblador Archivo de configuración Simulador .ccxml .lib .c Edición SYS/BIOS Librerías Debug Emulador/ LaunchPad . . . SYS/BIOS Config (.cfg) User.cmd .map .gel Emulador Standalone Bios.cmd Integrated Development Environment (IDE) basado en Eclipse Contiene todas las herramientas de desarrollo – compiladores, ensamblador, linker, depurador, BIOS and includes one target – the Simulator Los archivos GEL inicializan el depurador para que entienda donde está la memoria, los periféricos, etc. Placa objetivo Configuración objetivo y emuladores… Proyectos y Workspaces (como se ve en CCS) Código fuente Proyecto Espacio de trabajo WORKSPACE Proyectos y espacios de trabajo… Proyectos y espacios de trabajo Proyecto • Proyecto 1 • Código fuente • Proyecto 2 Link • Cabeceras • Librerías • Configuraciones/ • Preferencias de construcción El WORKSPACE contiene: • Configuraciones y preferencias del IDE • Los proyectos pueden residir en el workspace or ser vinculados de cualquier ubicación. • Cuando importamos proyectos al workspace se recomienda vincularlos • Borrar un proyecto en el Explorador de Proyectos sólo borra el vínculo. • Código y datos Link Cabeceras • Declaraciones • Proyecto 3 preferencias Link Código fuente Workspace Link Librerías • Código y datos La carpeta del proyecto contiene: • Configuraciones de construcción. • Los archivos pueden ser vinculados o copiados al directorio del proyecto. • Borrar un archivo vinculado solamente elimina el vínculo. Creating a New Project … ¿Cómo programar más fácil? Librerı́a de periféricos Tivaware Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 4 / 18 Características de la TivaWare™ Librería de manejo de periféricos API de alto nivel como interfaz para el conjunto de periféricos. Licencia & royalty free uso para las partes TI Cortex-M Disponible como objeto de librería y como código fuente Pre-programada en la ROM interna del chip Extras USB y ejemplos Dispositivo USB y host embebido Dispositivo, Host, OTG y ejemplos en Windows Programa gratuito VID/PID Protocolos inalámbricos Ejemplos de matemática IQ Gestores de arranque Aplicaciones del lado de Windows. Ethernet Pilas lwip y uip con 1588 modificaciones PTP Ejemplos extensivos Librería de gráficos Librería de sensores Primitivas de gráficos y componentes. 153 fuentes Herramientas de utilidad gráfica Un manejador de interrupciones I2C para manejar las transferencias I2C Un conjunto de drivers para los sensores I2C conectados. Conjunto de rutinas para operaciones comunes. Tres capas: Transporte, Sensado y Procesamiento. Opciones ISP... Reloj del sistema Fuentes de reloj del sistema Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 5 / 18 Fuentes fundamentales de reloj Oscilador interno de precisión (PIOSC) 16 MHz ± 3% Oscilador principal (MOSC) usando… Fuente externa de reloj de terminación única. Un cristal externo. Oscilador interno de 30 kHz 30 kHz ± 50% Para el uso durante los modos Deep-Sleep ahorradores de energía. Fuente de reloj del módulo de hibernación Cristal de 32,768Hz Para proveer un sistema con una fuente de reloj de tiempo real. Fuentes de reloj SysClk... Fuentes de reloj del sistema (CPU) El CPU puede ser manejada desde cualquiera de las fuentes fundamentales: Interna de 16 MHz Principal Interna de 30 kHz Externa de tiempo-real - Además El PLL interno(400 MHz) El oscilador interno de 16MHz dividido por cuatro (4MHz ± 3%) Fuente de reloj Interna16MHz Interna 16Mhz/4 Oscilador principal Interna de 30 kHz Modulo de hibernación PLL Maneja el PLL? Sí No Sí No No - Usada como SysClk? Sí Sí Sí Sí Sí Sí Árbol de reloj... Árbol de reloj de la Tiva C Series La función del API SysCtlClockSet() selecciona: Configuración de SYSDIV OSC or PLL Oscilador principal o interno Frecuencia del cristal GPIO... GPIO Caracterı́sticas y configuración Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 6 / 18 Entradas y salidas de propósito general (GPIO) Cualquier GPIO puede ser una fuente de interrupción: Activadas por flanco, en el de subida, bajada o ambos. Sensibles al nivel en valores altos o bajos. Pueden iniciar los secuenciadores de muestras o las transferencias µDMA Tasa de conmutación hasta la velocidad de reloj del CPU en el Advanced High-Performance Bus. ½ velocidad de reloj del CPU Standard Bus. Configuración de entradas tolerantes a 5V. Fuerza de manejo programable (2, 4, 8mA u 8mA con control de pendiente) Resistencias programables pull-up, pull-down, y drenador abierto. El estado del pin se mantiene durante el modo de hibernación. Utilidad Pin Mux... Utilidad Pin Mux Permite al usuario configurar gráficamente los pines del dispositivo. Genera el código y las cabeceras para usar con cualquiera de los IDEs http://www.ti.com/tool/tm4c_pinmux Enmascarando bits... Enmascaramiento de direcciones GPIO Cada puerto GPIO tiene una dirección base. Si queremos modificar bits específicos, podemos utilizar una máscara para indicar los bits se quieren modificar. Esto está hecho en hardware, mapeando cada puerto GPIO a 256 direcciones. Los bits 9:2 del bus de direcciones se usan como la máscara. El registro que queremos cambiar es el GPIO Puerto D (0x4005.7000) El actual contenido es: Escribiremos el valor 0xEB: En lugar de escribir directamente al puerto, escribimos en la dirección 0x4005.7098. Los bits 9:2 (mostrados) se vuelven una máscara para los bits a escribir. Sólo los bits marcados como “1” en la máscara son cambiados. GPIO Port D (0x4005.7000) 00011101 Escribir valor (0xEB) 11101011 …0 0 0 0 0 1 0 0 1 1 0 0 0 00111011 Nuevo valor en el GPIO Puerto D (sólo los bits en rojo se escribieron) GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_5|GPIO_PIN_2|GPIO_PIN_1, 0xEB); Note: especificamos la dirección base, la máscara y el valor a escribir. La función GIPOPinWrite() determina la dirección correcta para la máscara. Desbloqueo de GPIO... Protección de funciones críticas GPIO Seis pines en el dispositivo están protegidos contra programación accidental: • • Cualquier escritura a los siguientes registros para estos pines no será guardado a menos que el registro GPIOLOCK se desbloquee: • • • PC3,2,1 & 0: JTAG/SWD PD7 & PF0: NMI GPIO Alternate Function Select register GPIO Pull Up or Pull Down select GPIO Digital Enable register La siguiente secuencia desbloquea el registro GPIOLOCK para PF0 usando programación directa de registros: HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01; HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; Leer el registro GPIOLOCK lo vuelve a su estado de bloqueo. Lab... Conceptos necesarios Iniciando con la programación Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 7 / 18 Cabeceras para programar La librerı́a TivaWare está escrita utilizando ANSI C (C99). Debemos incluir algunas cabeceras para escribir nuestros programas. 1 4 # include # include # include # include # include # include < stdint .h > < stdbool .h > " inc / hw_memmap . h " " inc / hw_types . h " " driverlib / sysctl . h " " driverlib / gpio . h " Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 8 / 18 Acceso a los registros del microcontrolador TM4C123GH6PM Para tener acceso a los registros del microcontrolador incluimos el archivo de definiciones para el mismo. # include " inc / tm4c123gh6pm . h " Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 9 / 18 Acceso a los registros del microcontrolador TM4C123GH6PM Para tener acceso a los registros del microcontrolador incluimos el archivo de definiciones para el mismo. # include " inc / tm4c123gh6pm . h " Este archivo define los registros de la siguiente forma: # define GPIO_PORTA_DATA_R (*(( volatile uint32_t *) 0 x400043FC )) Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 9 / 18 Acceso a los registros del microcontrolador TM4C123GH6PM Para tener acceso a los registros del microcontrolador incluimos el archivo de definiciones para el mismo. # include " inc / tm4c123gh6pm . h " Este archivo define los registros de la siguiente forma: # define GPIO_PORTA_DATA_R (*(( volatile uint32_t *) 0 x400043FC )) Esto facilita el acceso a los registros, evitando que utilicemos algo como esto cada vez que modifiquemos el contenido de una dirección de memoria. (*(( volatile uint32_t *) 0 x400043FC ) ) = 0 x2f ; Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 9 / 18 Pregunta ¿Registros o librerı́a de periféricos? Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 10 / 18 Configuración básica utilizando los registros 2 5 8 11 void PLL_Init ( void ) { SYSCTL_RCC2_R |= 0 x80000000 ; // USERCC2 SYSCTL_RCC2_R |= 0 x00000800 ; // BYPASS2 , PLL bypass SYSCTL_RCC_R = ( SYSCTL_RCC_R &~0 x000007C0 ) // clear XTAL field , bits 10 -6 + 0 x00000540 ; // 10101 , configure for 16 MHz crystal SYSCTL_RCC2_R &= ~0 x00000070 ; // configure for main oscillator source SYSCTL_RCC2_R &= ~0 x00002000 ; SYSCTL_RCC2_R |= 0 x40000000 ; // use 400 MHz PLL SYSCTL_RCC2_R = ( SYSCTL_RCC2_R &~ 0 x1FC00000 ) // clear system clock divider + (4 < <22) ; // configure for 80 MHz clock while (( SYSCTL_RIS_R &0 x00000040 ) ==0) {}; // wait for PLLRIS bit SYSCTL_RCC2_R &= ~0 x00000800 ; } Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 11 / 18 Configuración básica con la TivaWare 2 // Configura el reloj del sistema a 40 MHz utilizando un cristal de 16 MHz SysCtlClockSet ( SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ | SYSCTL_USE_PLL | SYSCTL_SYSDIV_5 ) ; Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 12 / 18 Configuración básica con la TivaWare 1 // Configura el reloj del sistema a 40 MHz utilizando un cristal de 16 MHz SysCtlClockSet ( SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ | SYSCTL_USE_PLL | SYSCTL_SYSDIV_5 ) ; Conclusión La librerı́a de periféricos es la forma más fácil. Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 12 / 18 Configuración básica con la TivaWare 1 // Configura el reloj del sistema a 40 MHz utilizando un cristal de 16 MHz SysCtlClockSet ( SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ | SYSCTL_USE_PLL | SYSCTL_SYSDIV_5 ) ; Conclusión La librerı́a de periféricos es la forma más fácil. Pero cuidado... No siempre es la mejor forma, a veces debemos configurar antes con los registros para entender el funcionamiento de la librerı́a de periféricos. Y otras veces no la utilizamos porque necesitamos un acceso más inmediato. Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 12 / 18 Configuración de periféricos Para configurar periféricos en el microcontrolador, la fórmula es casi siempre la misma cuando utilicemos la librerı́a. Activar el reloj para el periférico. Configurar los pines para el periférico (si es que utiliza). Configurar el periférico (Temporizadores, USCI’s, ADC, etc). Configurar las interrupciones y la prioridad del periférico. Habilitar el periférico para que empiece a funcionar. Finalmente, interactuar con el periférico. Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 13 / 18 Configuración de GPIO 1 // Habilita el reloj al periferico ( GPIOF ) S y s C tl Per i p h e r a l E n a b le ( SYSCTL_PERIPH_GPIOF ) ; 4 // Configura los pines 1 , 2 y 3 del puerto F como salidas G P I OPin Typ e G P I O O u t p u t ( GPIO_PORTF_BASE , GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 ) ; 7 // Escribe el valor ui8PinData utilizando la direccion donde se mapeen los pines 1 , 2 y 3 del puerto F GPIOPinWrite ( GPIO_PORTF_BASE , GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 , ui8PinData ) ; Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 14 / 18 Retardando la ejecución Podemos crear un retardo o un delay en el programa utilizando la instrucción: 1 SysCtlDelay (2000000) ; El parámetro que recibe es el número de ciclos de 3 ciclos de reloj a esperar. Por lo tanto, si queremos esperar T segundos y fosc es la frecuencia del bus del sistema (e.g. 40MHz) entonces el parámetro x a colocar serı́a: x= Rodrigo Chang (USAC) T fosc 3 Laboratorio de Comunicaciones 4 14 de febrero de 2015 15 / 18 Retardando la ejecución Podemos crear un retardo o un delay en el programa utilizando la instrucción: SysCtlDelay (2000000) ; El parámetro que recibe es el número de ciclos de 3 ciclos de reloj a esperar. Por lo tanto, si queremos esperar T segundos y fosc es la frecuencia del bus del sistema (e.g. 40MHz) entonces el parámetro x a colocar serı́a: x= T fosc 3 Cuidado Esta instruccion bloquea la ejecución del programa, el CPU se dedica solo a perder tiempo, a menos que hayan interrupciones configuradas. Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 15 / 18 Fin del contenido Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 16 / 18 Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 17 / 18 Nuestro primer programa Empecemos a programar... Rodrigo Chang (USAC) Laboratorio de Comunicaciones 4 14 de febrero de 2015 18 / 18