CURSO DE PIC32MX _n L_ngu[j_ C32 TABLA DE CONTENIDO 1 INTRODUCCIÓN ............................................................................................................................1 ARQUITECTURA DEL PIC32......................................................................................................................1 Lectura y escritura de un PBCLK Peripheral.....................................................................................2 Bus Masters y Acceso Concurrente ....................................................................................................2 Módulo de Prefetch Cache..................................................................................................................4 Funcionamiento del módulo de Prefetch Cache .................................................................................6 DMA (Direct Memory Access) ............................................................................................................6 NÚCLEO MIPS M4K ................................................................................................................................9 Pipelines ...........................................................................................................................................10 MINI-32.................................................................................................................................................12 2 EL PRIMER PROGRAMA ...........................................................................................................16 CREACIÓN DEL PROYECTO .....................................................................................................................16 CREACIÓN DEL ARCHIVO FUENTE ...........................................................................................................18 GRABACIÓN DEL PIC32 USANDO EL BOOTLOADER ................................................................................20 CREACIÓN DE LIBRERÍAS ........................................................................................................................22 BITS CONFIGURACIÓN ............................................................................................................................25 3 EL CIRCUITO DE RELOJ ...........................................................................................................26 RENDIMIENTO VS CONSUMO DE ENERGÍA ..............................................................................................27 GENERACIÓN DEL SYSTEM CLOCK (SYSCLK) ......................................................................................28 Oscilador Externo Primario (POSC)................................................................................................29 Oscilador Externo Secundario (SOSC).............................................................................................32 Oscilador Interno de Alta Velocidad (FRC) .....................................................................................32 Oscilador Interno de Baja Potencia (LPRC) ....................................................................................34 GENERACIÓN DEL PERIPHERAL BUS CLOCK (PBCLK)...........................................................................34 GENERACIÓN DEL USB CLOCK (USBCLK) ...........................................................................................34 4 PUERTOS DE ENTRADA-SALIDA ............................................................................................36 REGISTROS DE CONTROL ........................................................................................................................37 EL PROBLEMA DE LA ESCRITURA............................................................................................................39 EJEMPLO 1. USO DE PUERTOS DE ENTRADA/SALIDA ..............................................................................41 PRÁCTICA 1. USO DE PUERTOS DE ENTRADA/SALIDA ............................................................................43 INTERFACES DIGITALES DE DISTINTOS VOLTAJES ..................................................................................44 Conexión de 3.3V a 5V......................................................................................................................44 Conexión de 5V a 3.3V......................................................................................................................47 DISPLAY DE CRISTAL LÍQUIDO (LCD)....................................................................................................54 EJEMPLO 2: USO DE DISPLAY LCD 16X2 ...............................................................................................56 EJEMPLO 3: MOSTRAR VALORES NUMÉRICOS EN LCD 16X2 ..................................................................57 LIBRERÍAS DE C32..................................................................................................................................60 TIPOS DE DATOS DE C32.........................................................................................................................61 PRÁCTICA 2: FUNCIONES TRIGONOMÉTRICAS EN LCD 16X2 ..............................................................62 5 INTERRUPCIONES ......................................................................................................................63 BITS ASOCIADOS CON CADA FUENTE DE INTERRUPCIÓN .........................................................................63 LIBRERÍA DE MANEJO DE INTERRUPCIONES ...........................................................................................66 MANEJO DE INTERRUPCIONES DE UN VECTOR (SINGLE VECTOR) ..........................................................66 EJEMPLO 1: INTERRUPCIÓN CN EN SINGLE VECTOR ..............................................................................67 Configuración de Change Notification .............................................................................................68 MÚLTIPLES INTERRUPCIONES EN UN SOLO VECTOR (SINGLE VECTOR)...................................................70 EJEMPLO 2. INTERRUPCIONES INT0 Y CN EN EL MISMO VECTOR ...........................................................71 MANEJO DE INTERRUPCIONES CON MÚLTIPLES VECTORES .....................................................................73 EJEMPLO 3. INTERRUPCIONES INT0 Y CN EN MÚLTIPLES VECTORES......................................................75 USO DE UN TECLADO MATRICIAL ..........................................................................................................77 5.1.1 Conexión de un Teclado matricial con un PIC32...............................................................77 5.1.2 Algoritmo para lectura del teclado.....................................................................................78 EJEMPLO 4. USO DE TECLADO MATRICIAL .............................................................................................84 6 TIMERS...........................................................................................................................................85 7 CONVERTIDOR ANÁLOGO-DIGITAL ....................................................................................86 8 MODULACIÓN DE ANCHO DE PULSO (PWM) .....................................................................87 9 COMUNICACIÓN SERIAL .........................................................................................................88 10 ALMACENAMIENTO MASIVO .................................................................................................89 11 UNIVERSAL SERIAL BUS ..........................................................................................................90 12 ETHERNET ....................................................................................................................................91 13 SISTEMAS OPERATIVOS DE TIEMPO REAL (RTOS).........................................................92 APÉNDICE A ...........................................................................................................................................93 BITS DE CONFIGURACION...............................................................................................................93 APÉNDICE B: LIBRERÍAS ...................................................................................................................96 LIBRERÍA LCD .......................................................................................................................................96 LIBRERÍA TECLADO .............................................................................................................................. 106 BIBLIOGRAFÍA .................................................................................................................................... 111 1- Introducción 1 INTRODUCCIÓN El presente curso está enfocado a estudiantes o Ingenieros de Electrónica o área afín con buenos conocimientos de programación en Lenguaje C y conocimiento de Microcontroladores. Si usted nunca ha usado un Microcontrolador, le recomiendo empezar con uno de 8 bits y una vez dominado puede saltar a una familia de 16 bits o 32 bits. En este curso se supone que el lector sabe programar en lenguaje C, por lo tanto no se explicarán detalles básicos del lenguaje C y nos enfocaremos más en lo que se puede hacer con un Microcontrolador PIC32 usando el lenguaje C32. Arquitectura del PIC32 Los PIC32 son una familia de microcontroladores de 32 bits de propósito general del fabricante Microchip Technology®. La Figura 1-1 muestra un diagrama a bloques del PIC32. Los PIC32 contienen un núcleo de 32 bits MIPS M4K desarrollado por MIPS Technologies. Este núcleo está basado en arquitectura Harvard, ya que posee buses separados de datos y de instrucción conectados al Bus Matrix. El núcleo conecta a todos los módulos a través de este Bus Matrix, el cual es un switch de alta velocidad que proporciona conexiones punto a punto entre módulos como se muestra en la figura. El Bus Matrix corre a la misma velocidad que el CPU. Los módulos conectados directamente a este bus son llamados SYSCLK Peripherals y pueden correr a la misma velocidad que el CPU, por lo tanto todos los accesos a los SYSCLK Peripherals se pueden completar en 1 sólo ciclo de reloj. Figura 1-1. Diagrama a bloques del PIC32 [1] Ing. Juan Ramon Terven Salinas 1 1- Introducción Dentro del chip se encuentra otro bus llamado Peripheral Bus, el cual se usa para comunicar módulos de menor velocidad como el SPI, UART, I2C, ADC, RTCC, etc. Los módulos conectados al Peripheral Bus son denominados PBCLK Peripherals. Estos módulos corren a una velocidad determinada por el PBCLK, el cual se deriva del reloj principal (SYSCLK). Por medio de los bits de configuración y en tiempo de ejecución se puede configurar la velocidad del PBCLK en tasas de 1:1, 1:2, 1:4 y 1:8 del SYSCLK. Lectura y escritura de un PBCLK Peripheral Cuando PBCLK corre a la misma velocidad que SYSCLK (1:1), el CPU y los SYSCLK Peripherals pueden acceder a los PBCLK Peripherals en un ciclo de reloj. Sin embargo si PBCLK corre a una frecuencia menor, una lectura a un PBCLK Peripheral tomará tantos ciclos de reloj como lo especifique el divisor. Por ejemplo si el PBCLK corre a 1:8 del SYSCLK entonces se tomarán 8 ciclos de reloj en leer un PBCLK Peripheral. En la escritura es diferente, ya que cuando el CPU escribe en un SFR de un PBCLK Peripheral, el Bus Matrix toma la operación de escritura y permite al CPU continuar con la siguiente operación. Como resultado aún si el PBCLK corre a 1:8 del SYSCLK, el CPU completará la escritura en un ciclo. Sin embargo la escritura real en el SFR se completará hasta 8 SYSCLKs después. Bus Masters y Acceso Concurrente La arquitectura del PIC32 usa un concepto llamado Bus Masters. Los Bus Masters son un conjunto especial de módulos que pueden iniciar una lectura o escritura de otro módulo (o Target). Por ejemplo el CPU puede leer y escribir en la SRAM o en cualquier otro periférico. De manera similar, el DMA puede leer y escribir en cualquier otro periférico del bus. Los PIC32 siguen evolucionando pero hasta la fecha los Bus Masters son CPU, ICD, USB, DMA, Ethernet y CAN. El Bus Matrix permite funcionamiento concurrente de Bus Masters, por ejemplo si un Bus Master inicia una transacción con un módulo, otro Bus Master puede iniciar una Ing. Juan Ramon Terven Salinas 2 1- Introducción segunda transacción con otro módulo aun cuando no haya terminado el Bus Master anterior. La Figura 1-2 muestra un ejemplo de 3 transacciones concurrentes. Mientras el CPU esta tomando instrucciones del módulo Prefetch Cache, el USB esta leyendo o escribiendo en la SRAM, y al mismo tiempo el módulo DMA puede leer del módulo UART. En este ejemplo, las transacciones usan caminos separados y no se generan conflictos ni retrasos. Figura 1-2. Acceso concurrente [1] En otro ejemplo, si el CPU quiere acceder a la SRAM mientras el USB está accediendo a esta, ocurre un conflicto y el Bus Matrix arbitrará y permitirá a uno de ellos completar antes que el otro pueda continuar. La prioridad está determinada por la programación de los registros del Bus Matrix. Por medio de programación podemos darle mayor prioridad al CPU o a cualquier otro Bus Master. Como podemos ver, los Bus Masters pueden transferir datos dentro y fuera del microcontrolador sin ninguna asistencia del CPU. Los Bus Masters pueden leer y escribir en otros Bus Masters excepto en el CPU, por ejemplo el módulo DMA puede leer o escribir registros USB, sin embargo no puede acceder a los registros del CPU. Solamente el CPU puede acceder a sus registros. Ing. Juan Ramon Terven Salinas 3 1- Introducción Módulo de Prefetch Cache Como se puede observar en las figuras anteriores, el PIC32 usa una memoria Flash de 128 bits de longitud de palabra. Los diseñadores del PIC32 escogieron este ancho para incrementar el flujo de instrucciones y mejorar el rendimiento del CPU. Para mejorar aún más el rendimiento, el PIC32 usa un módulo llamado Prefetch Cache el cual se adelanta a las instrucciones y almacena 128 bits de instrucción en una memoria caché de alta velocidad. El módulo Prefetch Cache está diseñado para almacenar en caché solo el contenido de la memoria Flash. La memoria SRAM corre a la misma velocidad que el CPU y no requiere de ninguna memoria caché. La Figura 1-3 muestra tres escenarios diferentes: 1. El escenario “Ideal” asume que la memoria Flash corre a la misma velocidad que el CPU. Esto conlleva a que si la frecuencia del procesador aumenta, el rendimiento (performance) aumenta linealmente. Figura 1-3. Efecto de Prefetch Cache [2] Pero en casi todos los procesadores de alta velocidad, la memoria Flash esta limitada a una frecuencia menor que la del CPU. Por ejemplo la memoria del PIC32 corre a 30 MHz máximo. Esta restricción provoca que si la frecuencia del procesador es mayor que 30MHz, el CPU tiene que insertar un estado de espera por Ing. Juan Ramon Terven Salinas 4 1- Introducción cada leida de la memoria Flash. Si el procesador opera a 60 MHz, se requieren 2 estados de espera. Debido a estos estados de espera, el rendimiento del CPU se ve reducido. 2. La línea “Non-Cached” muestra lo que ocurre cuando no hay módulo Prefetch Cache disponible y la memoria Flash está limitada a 30 MHz. Observe como el rendimiento del procesador cae significativamente con respecto al “Ideal”. 3. La línea “Cached” muestra el rendimiento cuando el módulo Prefetch Cache está habilitado. Observe que el rendimiento es significativamente mejor que el escenario “Non-Cached”. El Módulo Prefetch Cache consiste de un Prefetch Buffer, memoria caché y la circuitería lógica asociada (vea la Figura 1-4). Por medio de software podemos habilitar o inhabilitar el prefetch buffer o la memoria caché. Figura 1-4. Prefetch Cache [2] El prefetch buffer tiene la función de obtener los siguientes 128 bits de de la memoria Flash en función de la instrucción actual que se esté ejecutando. La memoria caché tiene 16 líneas de 128 bits. Cada línea puede almacenar 4 instrucciones de 32 bits u 8 instrucciones de 16 bits. Por medio de software podemos reservar hasta 4 líneas para almacenar datos constantes. Esta característica es útil si la aplicación interactúa frecuentemente con datos constantes. Toda la memoria caché puede ser leída y escrita por el software y también puede ser bloqueada. Cuando una línea es bloqueada, ya no puede ser reemplazada por nuevos datos. Esta característica es útil para incrementar el rendimiento de fragmentos de código usados frecuentemente, como un pequeño ciclo o el prólogo de una interrupción. Ing. Juan Ramon Terven Salinas 5 1- Introducción Funcionamiento del módulo de Prefetch Cache A continuación se describe el funcionamiento del módulo de Prefetch Cache en un proceso de 6 pasos: 1. El CPU pide una dirección de Flash específica (puede ser una instrucción o un dato constante). 2. Si es la primera vez que el CPU accede a esta dirección, quiere decir que la memoria caché no contiene esa dirección en particular. Esta condición es llamada Cache Miss (falla de caché). 3. Como hubo un fallo en caché, el módulo de prefetch cache carga el prefetch buffer con los datos requeridos (mas unas cuantas instrucciones o datos mas hasta llenar los 128 bits). Esto puede tardar unos cuantos ciclos (SYSCLK) debido a la baja velocidad de la Flash. 4. Una vez que el buffer tiene los 128 bits de datos, los copia en una línea disponible de la memoria caché. El controlador de caché usa el algoritmo LRU (Leas Recently Used) o de “menos usado recientemente” para determinar que línea de caché usar. 5. Ahora que la dirección pedida está en memoria caché, el módulo caché le pasa el contenido al CPU. 6. Mientras el CPU ejecuta la instrucción, el modulo de Prefetch Cache automáticamente carga los siguientes 128 bits de datos de la memoria Flash y los tiene listos en caso que el CPU los necesite. DMA (Direct Memory Access) El DMA es un módulo Bus Master usado para transferir datos de periféricos a memoria sin la intervención del CPU. El módulo DMA puede acceder a cualquier dirección de memoria dentro del sistema, ya sea SRAM, Flash o SFRs de periféricos. Este módulo está diseñado para aumentar la tasa de transferencia de datos y mejorar el rendimiento del PIC32. Ing. Juan Ramon Terven Salinas 6 1- Introducción Para entender como ayuda el DMA veamos un ejemplo. Suponga que necesitamos desarrollar una aplicación que recibe datos por el módulo UART a una tasa de 115200 bps (bits por segundo). Una solución común (sin DMA) consiste en los siguientes pasos (vea la Figura 1-5): 1. El módulo UART recibe datos. 2. Se llena el buffer de recepción (comúnmente son 4 bytes en los PIC). 3. Se genera una interrupción. 4. El CPU deja pendiente lo que está haciendo para obtener los datos del buffer 5. y guardarlos en la RAM para futuras operaciones. Figura 1-5. Transacción UART sin DMA [3] Este procedimiento se repite cada vez que se llena el buffer, y si estamos recibiendo a 115200 bps, el CPU es interrumpido aproximadamente cada 0.3 milisegundos. Tome en cuenta que esta tasa de transferencia es muy baja, el módulo UART del PIC32 soporta una transferencia de 20Mpbs, lo cual equivaldría a una interrupción cada 2 microsegundos. Cuando el CPU es interrumpido constantemente de esta manera se reduce bastante el rendimiento. Ahora veamos como ayuda el módulo DMA. Ing. Juan Ramon Terven Salinas 7 1- Introducción Por medio de software podemos asignar un canal del DMA (se tienen hasta 8 canales) al módulo UART para que obtenga los datos del buffer UART y los deposite en RAM. El procedimiento se muestra en la Figura 1-6: 1. El módulo UART recibe datos. 2. Se llena el buffer de recepción. 3. El DMA obtiene los datos del buffer UART 4. y los deposita en RAM, además podemos hacer que el DMA tomé múltiples datos del UART. 5. Cuando el número de bytes especificados se transfieren a RAM entonces el DMA interrumpe al CPU para decirle que ya están listos los datos en RAM para que los utilice. Figura 1-6. Transacción UART con DMA [3] De esta manera, el CPU puede hacer otras tareas de mayor importancia y dejar el manejo del periférico al módulo DMA logrando un mayor rendimiento del CPU. Ing. Juan Ramon Terven Salinas 8 1- Introducción Núcleo MIPS M4K Además de todas las fantásticas características de la arquitectura del PIC32, su verdadero poder radica en su núcleo. Toda la familia PIC32 posee como corazón un procesador MIPS M4K de 32 bits capaz de funcionar a una frecuencia máxima de 80 MHZ y proporcionando un rendimiento cercano a 1 instrucción por cada ciclo de reloj! A diferencia de las familias anteriores de PICs como PIC24, PIC18, PIC16, etc. El rendimiento del PIC32 no se puede medir simplemente con la velocidad del oscilador, ya que debido a la compleja arquitectura interna de su núcleo y a los módulos que ayudan a mejorar el rendimiento (Prefetch cache, cache, DMA), la duración de cada instrucción varía por diversos factores como son, la aplicación, el compilador, la estructura del código, etc. Sin embargo con todos los módulos de rendimiento activados y con una optimización de código, el PIC32 puede llegar a funcionar a 80 MIPS1 (Millones de Instrucciones por Segundo) con un reloj de 80 MHz. A continuación de listan las características principales del procesador MIPS M4K que poseen los PIC32 [6] : • Hasta 1.5DMIPS/MHz de rendimiento. • Memoria caché programable para mejorar la ejecución desde memoria Flash. • Modo de instrucciones de 16-bit (MIPS16e) para generar código más compacto. • Controlador de interrupciones sectorizado con 63 niveles de prioridad. • Modos de operación de Usuario y Kernel (para optimizar el uso de sistema operativo). • Manipulaciones de bit atómicas (en un solo ciclo) en registros de periféricos. • Unidad de multiplicación y división capaz de multiplicar 32 x 16 bits en un ciclo de reloj. • Soporte para depuradores y programadores por JTAG e ICD. • Modos de alimentación programables para reducir el consumo de potencia. • Pipeline de 5 niveles. • Protección de código interna para proveer propiedad intelectual. 1 No confundir MIPS que se refiere al nombre del fabricante del núcleo (cuyo origen proviene de con el término MIPS que es el acrónimo de Millions of Instructions per second (Millones de instrucciones por segundo). Microprocessor without Interlocked Pipeline Stages) Ing. Juan Ramon Terven Salinas 9 1- Introducción Pipelines El nucleo del PIC32 consiste de 2 pipelines (Figura 1-7), un pipeline de instrucción de 5 niveles y un pipeline iterativo en la unidad de Multiplicación y División. Figura 1-7. Pipelines [4] Las 5 etapas del pipeline de la unidad de ejecución (Figura 1-8) son las siguientes: 1. Búsqueda de Instrucción (Instruction Fetch) 2. Ejecución (Execution) 3. Búsqueda de memoria (Mem Fetch) 4. Alineación de memoria (Align) 5. Escritura en memoria (Writeback) La Figura 1-8 muestra como las instrucciones (I0, I1, I2, I3, I4) se ejecutan en el pipeline. • Asuma que C1 es el primer ciclo de reloj del CPU. Durante este ciclo, la instrucción “I0” es tomada de la memoria de programa (Inst Fetch) y resto del pipeline está vacio. • En el siguiente ciclo C2, la instrucción “I0” pasa a la etapa de ejecución (E) y al mismo tiempo, la siguiente instrucción “I1” es tomada. • En el siguiente ciclo C3, “I0” pasa a la etapa M e “I1” pasa a la etapa E y al mismo tiempo la siguiente instrucción (“I2”) se busca en memoria (etapa I). Ing. Juan Ramon Terven Salinas 10 1- Introducción • En el ciclo C4 ya se tienen 4 etapas del pipeline llenas y en ciclo C5 ya se tiene el pipeline lleno. A partir de aquí, el CPU ejecuta una instrucción por cada ciclo de reloj recibido. Figura 1-8. Pipeline de la unidad de ejecución [4] Ing. Juan Ramon Terven Salinas 11 1- Introducción MINI-32 Los PIC32 los encontramos en versiones de 64 pines y 100 pines de montaje superficial. La Figura 1-9 muestra los empaquetados disponibles. Figura 1-9. Opciones de encapsulado [5] Para poder realizar prácticas en una tablilla de pruebas usaremos la tarjeta MINI-32 desarrollada por MikroElectronika (http://www.mikroe.com), mostrada en la Figura 1-10. Esta mini tarjeta posee un PIC32MX534F064H y los componentes mínimos para echar a volar nuestro microcontrolador (oscilador de cristal de 8 MHz, oscilador de cristal de baja velocidad de 32.768kHz, boton de reset, conector USB para grabación y posible alimentación, LED de alimentación y otros 2 LEDs de uso general). Figura 1-10. Mini-32 [14] Ing. Juan Ramon Terven Salinas 12 1- Introducción La Mini-32 tiene el mismo tamaño que un chip de 40 pines (DIP40) y la podemos usar en nuestra tablilla de pruebas como si fuera un chip de 40 pines. La Figura 1-11 muestra los pines disponibles y sus funciones. Es importante mencionar que esta tarjeta viene con un Bootloader grabado con comunicación USB, de tal forma que no necesitamos un programador de PICs para hacer nuestras prácticas. Solo requerimos un cable USB con conector mini-B que no viene incluido en la tarjeta. Figura 1-11. Pines de la Mini-32 [14] La Figura 1-12 muestra el diagrama detallado de la tarjeta Mini-32 desarrollada por Microelectrónica y la Figura 1-13 muestra todos los pines del PIC32MX534F0G4H. Ing. Juan Ramon Terven Salinas 13 1- Introducción Figura 1-12. Diagrama detallado de la Mini-32 [14] Ing. Juan Ramon Terven Salinas 14 1- Introducción Figura 1-13. Pines del PIC32MX534F064H [9] Ing. Juan Ramon Terven Salinas 15