STM32MP1 - kernels + Linux = microcontrolador perfecto

Por la naturaleza de mi actividad, me dedico al desarrollo de varios dispositivos: medición, control, control, etc. La gran mayoría del dispositivo se divide en 2 partes:

  1. Microcontrolador de altos recursos y que no requiere una interfaz gráfica de usuario (GUI) en tiempo real.
  2. Consumiendo pocos recursos y trabajando en hardware duro en tiempo real del dispositivo.

Y como regla general, la transición a una nueva serie de microcontroladores fue determinada por la mejora de la GUI: más colores, mayor resolución, elementos de diseño más complejos. En un momento, la idea era utilizar algún tipo de placa Raspberry como interfaz gráfica.

Pero con el advenimiento de la nueva línea de microcontroladores STM32MP1 de STM, mi tormento terminó y eso es lo que sucedió hasta ahora.

Controlador perfecto


Un controlador ideal para mí debe tener las siguientes características:

  • tienen capacidades gráficas decentes, como soporte simple para varios formatos gráficos, soporte para fuentes vectoriales
  • gran cantidad de memoria para gráficos
  • Teclado USB y soporte para mouse
  • Soporte de Ethernet
  • una gran cantidad de temporizadores de hardware
  • Generación PWM
  • una gran cantidad de GPIO
  • ADC de 16 bits

Son estos requisitos los que se necesitan para construir varios dispositivos con una interfaz gráfica de usuario decente.

Y así que estaba muy feliz de ver una nueva serie de STM: STM32MP1.

Primera cita


Para familiarizarse con el nuevo chip, se compró la placa STM32MP157C-DK2. Aquí hay una (foto de Internet): la



placa de demostración está construida en un chip STM32MP157CAC, que incluye:

  • 2 núcleos A7, 650 MHz cada uno
  • 1 núcleo M4, 208 MHz

Memoria


La primera diferencia que llama la atención es la falta de memoria flash en el chip. Para el núcleo A7, que es esencialmente un microprocesador, esta es una situación normal y el código siempre se ejecuta desde DRAM. Los microcontroladores basados ​​en M4 generalmente incluyen memoria flash en la que se almacena el código ejecutable.

En este cristal, el núcleo M4 solo tiene RAM y el código se ejecuta desde él (desde la hoja de datos):

708 Kbytes de SRAM interna: 256 Kbytes de
AXI SYSRAM + 384 Kbytes de AHB SRAM +
64 Kbytes de AHB SRAM en el dominio de respaldo
y 4 Kbytes de SRAM en el dominio de respaldo

El núcleo A7 tiene un controlador DDR incorporado (de una hoja de datos):
Los dispositivos STM32MP157C / F incorporan un controlador para SDRAM externo que admite los
siguientes dispositivos:

  • LPDDR2 o LPDDR3, datos de 16 o 32 bits, hasta 1 Gbyte, hasta 533 MHz de reloj.
  • DDR3 o DDR3L, datos de 16 o 32 bits, hasta 1 Gbyte, hasta 533 MHz de reloj.

Por un lado, la memoria del núcleo M4 parece ser menor que la de la versión en la memoria flash, pero por otro lado, la memoria RAM se ejecuta a la frecuencia central. La memoria flash no puede hacer esto, y allí debe usar un divisor de frecuencia.

Organización del lugar de trabajo


Como se necesita Linux para trabajar con la placa, tuve que instalar un disco duro adicional en mi computadora e implementar Ubuntu 16.04 en él. STM recomienda este sistema operativo.

Modo de ingeniería y producción


El tablero puede comenzar en uno de los dos modos (determinado por el interruptor DIP). En modo Ingeniería, el núcleo M4 funciona por separado. En el modo de producción, el núcleo M4 se ejecuta bajo el control del núcleo A7. No utilicé el modo Ingeniería, trabajé solo en el modo Producción. En este modo, no tiene que preocuparse por ajustar el reloj central. El tiempo se configura durante el proceso de arranque a valores máximos. Revisé varios registros en el depurador, deduje algunas de las frecuencias en el MCO y miré el osciloscopio. A7 opera a una frecuencia de 650 MHz, M4 a una frecuencia de 208 MHz.

Kernel M4. Descargar y ejecutar programas


Dado que el núcleo M4 ejecuta A7, significa ejecutar OpenSTLinux. El marco de control remoto de Linux (RPROC) se usa para controlar el núcleo M4. Este marco le permite habilitar y deshabilitar el kernel, descargar y depurar software (archivos ELF).

Para cargar el programa en el núcleo M4, use el siguiente comando:

echo -n <nombre_programa.elf >> / sys / class / remoteproc / remoteproc0 / firmware

Para iniciar el programa:

echo start> / sys / class / remoteproc / remoteproc0 / state

Para detener:

echo detener> / sys / class / remoteproc / remoteprocX / state

Kernel M4. SW4STM32


Se han probado los comandos mencionados anteriormente, todo funciona :) Pero para funcionar, necesita algún tipo de IDE normal. STM recomienda usar el software AC6 SW4STM32 para esto. Al mismo tiempo, el sitio web de OpenSTM32 tiene un título genial:
Con System Workbench para Linux, Embedded Linux en la familia de MPU STM32MP1 de ST nunca fue tan fácil de construir y mantener, incluso para los recién llegados al mundo Linux.
Y, si instala System Workbench para Linux en System Workbench para STM32, puede desarrollar y depurar sin problemas aplicaciones asimétricas que se ejecutan en parte en Linux, en parte en el Cortex-M4.
Es decir, puede escribir código tanto para el núcleo m4 como para A7. Pero esta es una versión paga. Y el gratuito, que está disponible para descargar, le permite escribir y depurar código solo para el núcleo M4.

IDE SW4STM32 ha sido descargado, instalado y probado. Todo funciona, el proceso de escritura y compilación no es diferente de la versión en Windows.
La única diferencia es la carga y depuración de código, porque Ethenet y la conexión SSH se utilizan para escribir software. Para depurar y detenerse por puntos, se utiliza la placa ST LINK incorporada.

Kernel A7. Compilador cruzado


Para compilar programas en una PC, STM ofrece un compilador cruzado. El proceso de cargar y ejecutar el script de compilación cruzada se describe en detalle en el wiki STM32MP1, enlace a continuación. Todo se hizo de acuerdo con las instrucciones, todo funciona como debería. :)

Ejecutando el compilador cruzado para el ecosistema v1.1.0:

source SDK / environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi
, entonces el
comando make
y el código fuente, según makefile, se compilarán en códigos ARM :)

Kernel A7. Descargar y ejecutar programas


Para cargar el programa en la placa de demostración, use el comando:

scp gtk_hello_world root@192.168.1.18: / usr / local

Este comando descarga el archivo gtk_hello_world a la sección / usr / local, que se encuentra en la placa con la dirección IP: 192.168.1.18. Root: la contraseña que está en el tablero de forma predeterminada.

Intercambio de datos entre núcleos


La mayor parte del tiempo se dedicó a comprender el mecanismo de intercambio de datos entre los núcleos. En los ejemplos proporcionados por STM, hay varias opciones para implementar dicho intercambio. Puede trabajar directamente con el controlador de OpenSTLinux o utilizar el mecanismo virtual UART. Decidí hacer que compartir a través de puertos virtuales sea más simple.

En el lado de Linux, se ve así:

Abra el dispositivo:

fd = open ("/ dev / ttyRPMSG0", O_RDWR);

Luego le escribimos o leemos:

write (fd, "LED_Toggle \ r \ 0", 10);
len = leer (fd, buf, sizeof (buf));

Todo es bastante simple, pero hay un pequeño matiz. Para que aparezca el dispositivo ttyRPMSG0, necesita el núcleo M4 para acceder al núcleo A7 de esta forma:

estas son las líneas del código del núcleo M4:

VIRT_UART_Init(&huart0); //  
VIRT_UART_RegisterCallback(&huart0, VIRT_UART_RXCPLT_CB_ID, VIRT_UART0_RxCpltCallback) //      .

Recepción de datos desde un puerto virtual por el núcleo M4:

if (VirtUart0RxMsg)
{
      //     VirtUart0ChannelBuffRx
     
      VirtUart0RxMsg = 0;
}

Escribir datos en el puerto virtual:

VIRT_UART_Transmit(&huart0, TxArray, TXCounter);

Todo funciona, pero hay un pequeño matiz que aún no puedo entender. La recepción de datos por el núcleo A7, que se transmite por el núcleo M4, no comienza a menos que el núcleo A7 escriba previamente cualquier dato en el puerto.

Todo este mecanismo está implementado por un conjunto de bibliotecas OpenAMP de terceros. Esta biblioteca debe incluirse en el proyecto del kernel M4 e inicializarse en consecuencia.

Planes futuros


Instale y configure Eclipse para escribir y depurar código para A7.
Escriba una demostración gráfica normal, como un osciloscopio de un M4 ADC.
Y finalmente, haga su placa controladora basada en este chip. :) Wiki

Enlaces útiles

STM32MP1
OpenSTM32
ST Community
AC6

All Articles