Las modernas exigencias de proyectos con microcontroladores, está llevando a los fabricantes a crear y desarrollar microcontroladores con más de un procesador. este es el caso de la tarjeta Raspberry pi pico, la cual posee 2 núcleos de procesador ARM cortex-m0+. de ahí, la importancia de comenzar a familiarizarnos, con más de un procesador en un microcontrolador. en este capítulo conoceremos las principales características y capacidades de la tarjeta Raspberry pi pico.
La siguiente imagen muestra la tarjeta Raspberry Pi Pico:
Esta tarjeta es construida con base en el microcontrolador RP2040. La siguiente es una lista de las principales características del microcontrolador RP2040:
• Dos núcleos del procesador ARM Cortex M0+.
• Frecuencia de procesador de hasta 133 MHz.
• 30 Entradas/Salidas de propósito general (GPIO).
• 2 puertos seriales UART.
• 2 interfaces seriales I2C.
• 2 interfaces seriales SPI.
• 16 canales PWM.
• 4 de los GPIO, pueden ser usados como entradas analógicas.
• Un controlador USB.
• 264KB de memoria RAM.
• Soporte para hasta 16MB de memoria Flash.
• Controlador de acceso directo a memoria (DMA).
• 2 on-chip PLL, para generar los relojes de los procesadores y USB.
La siguiente imagen muestra el diagrama en bloques del microcontrolador RP2040.
Podemos notar, de una manera muy global, sus principales bloques, entre los que se encuentra:
• Entradas/Salidas IOs.
• Periféricos.
• PIO.
• Memorias.
• DMA.
• USB
• Generador de reloj
• Procesadores.
• Bus.
EL SYSTEMA DE LA RASPBERRY PI PICO.
El sistema de la tarjeta Raspberry Pi Pico, esta construido alrededor de un bus avanzado de alto desempeño AHB (Advanced High-performance Bus). Este bus interconecta todos los circuitos que necesitan de acceso rápido para lectura o escritura (procesadores, memorias, DMA). Debajo del bus AHB, hay un bus de periféricos avanzado APB (Advanced Peripheral Bus), el cual accede a los puertos con anchos de banda más bajos para escritura o lectura. (Timers, I2C, SPI, UART, etc). En el siguiente diagrama en bloques podemos observar la arquitectura del sistema Raspberry Pi Pico, de una manera más detallada:
En el siguiente apartado, mostraremos los buses de forma separada, para comprender mejor, el sistema de conexión del microcontrolador RP2040. El bus AHB, el cual se encarga de llevar las direcciones y datos a los procesadores Cortex M0+, memorias ROM, RAM, Flash, el controlador DMA, periféricos programables PIO y USB, se muestra en la siguiente figura:
Los periféricos con ancho de banda más bajo, son direccionados a través del puente APB, como se observa en la siguiente figura:
EL PROCESADOR ARM CORTEX M0+.
El microcontrolador RP2040 posee 2 procesadores ARM Cortex-M0+. Por ese motivo es bueno conocer algo de su arquitectura y capacidades. La siguiente figura muestra los bloques más importantes del ARM Cortex-M0+:
Entre las principales características del anterior diagraman, notamos:
• Procesador RISC de 32 bits.
• CPU Armv6-M.
• Bus avanzado de alto desempeño (AHB)
• Controlador para interrupciones.
• Puerto para depuración “Serial Wire”.
• Puerto de acceso rápido a entradas y salidas.
• Protección de memoria.
• Modos de bajo consumo de energía.
La siguiente imagen muestra un diagrama más detallado de la arquitectura ARM Cortex-M0+:
Podemos notar como las interrupciones son dirigidas al controlador de interrupciones (NVIC). Este controlador está conectado al procesador. Hay una unidad para depuración (Debug), AHB y puerto I/O de único siclo. La siguiente figura muestra las instrucciones que este procesador puede ejecutar:
Estas instrucciones pertenecen al conjunto reducido de instrucciones (RISC), el cual se ejecutan en procesadores ARM Cortex.
Debido a que el procesador RP2040, posee 2 procesadores Cortex M0+, es necesario adicionar algunos componentes digitales que permitan la comunicación entre estos 2 procesadores. Esto es necesario principalmente para arbitrar el acceso paralelo a las mismas posiciones de memoria y permitir el procesamiento multi-paralelo. El siguiente diagrama muestra estos componentes:
Podemos notar una identificación para cada procesador, FIFOs para comunicar los procesadores, circuitos para hacer procesamiento sobre áreas críticas en el código (Hardware Spinlook), circuitos interpoladores para acelerar tareas repetitivas donde el tiempo de ejecución es crítico, como por ejemplo: operaciones de audio.
La siguiente imagen muestra el microcontrolador RP2040, en la tarjeta Raspberry Pi Pico:
El siguiente es el diagrama electrónico del microcontrolador RP2040 en la tarjeta Raspberry Pi Pico:
MEMORIAS
El microcontrolador RP2040 posee una memoria de solo lectura: ROM de 16kB la cual comienza en la dirección 0x00000000. El contenido de la memoria es grabado en el momento que el chip es fabricado. En ella son grabadas rutinas para:
• Rutinas de arranque inicial.
• Rutinas de inicio de la memoria Flash.
• Rutinas para programar la memoria Flash.
• Rutinas para almacenamiento USB con soporte UF2.
• Librerías de utilidad.
El microcontrolador RP2040 posee una memoria SRAM de 264kB, físicamente, divida en 6 bancos. 4 bancos son de 16k x 32-bit (64kBytes) y 2 bancos de 1k x 32-bit (4kBytes). No hay restricciones para lo que se pueda almacenar en cada banco, pudiendo ser: código de procesador o buffer de datos o una mezcla de las dos. Los programas pueden ver la memoria SRAM como un bloque único de 256kByte. Gracias a esta división o partición es posible hacer múltiples accesos en paralelo, con un solo ciclo de reloj. Esta memoria comienza en la dirección: 0x20000000.
El microcontrolador RP2040 tiene una interface QSPI, en la cual se puede conectar una memoria Flash externa. Esta interface posee un hardware de ejecución en el lugar XIP (execute-in-place), lo que permite ejecutar código desde la memoria Flash, sin tener que copiarla en la memoria interna. El bus QSPI, puede direccionar hasta 16MB y esta mapeada en la dirección 0x10000000. La siguiente imagen muestra la memoria Flash en la tarjeta Raspberry Pi Pico.
El siguiente es el diagrama electrónico de la memoria Flash, en la tarjeta Raspberry Pi Pico:
Dependiendo del modelo de la tarjeta, es posible que tenga 2MB o más de memoria Flash. Pero, el microcontrolador RP2040, soporta hasta 16 MB.
TENSIONES EN LA RASPBERRY PI PICO.
El VBUS es la tensión presente en el conector USB, el cual normalmente es de 5 Volts. Esta tensión está conectada al pino 40 de la tarjeta Raspberry Pi Pico. VSYS es la entrada de tensión para el regulador RT6150, el cual genera una tensión fija de 3.3 Volts para el microcontrolador RP2040 y sus entradas/salidas (IO). Entre VBUS y VSYS hay un diodo schottky el cual permite a otra fuente de tensión alimentar el regulador RT6150. El regulador reductor/elevador (modo “buck”, modo “boost”), permite un rango ancho de tensiones, los cuales pueden ir desde 1.8 hasta 5.5 Voltios, en su entrada (VSYS). La tensión VSYS está presente en el pin 39 de la Raspberry Pi Pico. La salida del regulador de tensión fijo de 3.3 Volts, está presente en el pin 36 de la tarjeta Raspberry Pi Pico. La siguiente figura muestra las tensiones VBUS y VSYS.
GPIO24 monitorea la presencia de VBUS, a través de las resistencias R10 y R1. Caso haya tensión en VBUS, el pin GPIO24 censara un nivel alto en su entrada. Caso no haya tensión VBUS, el pin GPIO24 censara un nivel bajo en su entrada. La siguiente imagen muestra el regulador de tensión en la tarjeta Raspberry Pi Pico:
El siguiente es el diagrama electrónico del circuito regulador de voltaje en la Raspberry Pi Pico:
ENTRADAS Y SALIDAS DE PROPOCITO GENERAL (GPIO).
El microcontrolador RP2040 tiene 36 entradas/salidas multifuncionales divididas en 2 bancos. Hay un banco de usuario, el cual contiene los GPIO0 hasta el GPIO29. El otro banco es el QSPI, el cual es normalmente usado para ejecutar código desde una memoria Flash externa. Los pines del banco QSPI son: QSPI_SS, QSPI_SCLK, QSPI_D0, QSPI_D1, QSPI_D2 y QSPI_D3. En la siguiente figura podemos observar estos pines:
Para leer el estado de un determinado pin GPIO, podemos usar la siguiente función:
La función recibe como parámetro el número del GPIO que se desea leer y retorna el estado del GPIO, siendo: 0 para nivel bajo (low) y un valor diferente de cero, para nivel alto (high).
Para escribir un nivel alto (high) en los pines, podemos usar la función: “gpio_set_mask(uint32_t mask)”, como se muestra a continuación:
Para escribir un nivel bajo (low) en los pines, podemos usar la función: gpio_clr_mask(uint32_t mask), como se muestra a continuación:
A partir de las anteriores funciones, podemos usar la siguiente función, la cual, recibe como parámetros el número del pin GPIO y el valor que se desea escribir en ese pin:
La siguiente imagen muestra los pines y sus funciones adicionales, de la tarjeta Raspberry Pi Pico:
Las siguientes imágenes muestran los pines GPIO de la tarjeta Raspberry Pi Pico:
La tarjeta Raspberry Pi Pico, tiene un conector USB micro B, el cual puede funcionar como: dispositivo (device) u hospedero (host). Este puerto puede ser programado, para que las aplicaciones puedan leer datos o códigos y ser ejecutados por el microcontrolador RP2040. La siguiente imagen muestra la USB de la tarjeta Raspberry Pi Pico:
El siguiente es el diagrama electrónico del conector USB de la tarjeta Raspberry Pi Pico:
Hay un botón para seleccionar de donde hacer el inicio de lectura de código del microcontrolador RP2040. El inicio (boot) se puede hacer desde la Flash o desde la USB. Este botón es normalmente usado para instalar MicroPython en el microcontrolador. La siguiente figura muestra este botón:
La siguiente imagen muestra el diagrama electrónico del botón BOOTSEL:
CONCLUCIÓN
La tarjeta Raspberry Pi Pico ofrece características como 2 procesadores (dual-core), ejecución de lenguaje MicroPython, reducido tamaño, alta velocidad de procesamiento, varios modos de bajo consumo de energía, varias fuentes de interrupción, entradas/salidas programables (PIO), para construir avanzadas interfaces como, por ejemplo: I2S. Así, con las capacidades de esta tarjeta es posible construir un gran número de aplicaciones. En los próximos temas veremos aplicaciones tanto en lenguaje C/C++, como en lenguaje MicroPython.