Bienvenido a los foros de FT81x Manía. Te invitamos a regístrate totalmente gratis. Disfruta de tu experiencia con un grandes amigos y Staff.

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5

Thread Contributor: TFTLCDCygAdición de variantes en el core genérico de danieleff

#1
0
Hace algunas semanas, danieleff publicó un procedimiento general que permite adicionar variantes de MCU en el core STM genérico de su autoría. Aparentemente es muy sencillo, sin embargo es muy fácil perderse, ya que requerimos de conocer detalles de programas como el STM32CubeMX, así como de la configuración de relojes de los micros STM32.

Siguiendo los pasos uno a uno podemos crear nuevas variantes partiendo de existentes. Esto nos permitirá ampliar poco a poco el acervo de placas que podemos usar. Solo debemos tener en cuanta algunas precisiones que no viene en la guía de danieleff.

La mejor forma de poner en práctica, es creando una variante para la discovery STM32F429 que tengo en la mesa de pruebas. Aunque el core genérico tiene una variante específica, he notado que no funciona como debería, ya que reporta solo 1 Mb en flash y 128Kb en RAM (1 Mb/128 Kb), cuando debería ser 2 Mb/192 Kb.

?mage

Hay que tomar en cuenta que se usan 64Kb de RAM para tareas de gestión con el micro, siendo una regla general, descontar 64 Kb a la RAM que podemos usar en estas placas. La F429 tiene 256 Kb en total, por lo que podemos usar solo 256 Kb - 64 Kb = 192 Kb. Esta RAM de gestión no se puede usar como medio de programación, se denomina coupled memory. En placas como las F407, solo se pueden usar 128 Kb, de los 192 Kb que tienen como especificación.

Esto lo podemos corregir, creando una variante adicional para la F429ZI. Señalaremos los pasos que hemos seguido para conseguir una variante 100% funcional, tomando como referencia el procedimiento de danieleff

Procedimiento para crear una variante

Paso 1: Asignar una carpeta y nombre a la variante

Debemos crear una carpeta con el nombre de nuestra variante nueva, en la ruta: C:\arduino-1.8.4\hardware\STM32GENERIC_danielefF\STM32\variants
En este ejemplo, llamaremos a la variante: F429ZI_DISCO

?mage

Paso 2: Copiar los archivos de la carpeta de la variante similar a nuestra placa

Los archivos base de la variante que viene en el core genérico, están en la ruta: C:\arduino-1.8.4\hardware\STM32GENERIC_danielefF\STM32\variants\DISCOVERY_F429ZI 
Debemos copiarlos en la carpeta de la variante nueva.

?mage

Los archivos son: 

Idscript.Id
variant.c
variant.h

Se pueden modificar con ayuda de un editor de texto.

Paso 3: Despliegue de la variante en el selector de placas del IDE

Hasta ahora no hemos hecho modificaciones a la variante, solo agregamos una carpeta, para poder visualizarla en el selector debemos modificar el archivo boards.txt. Este es el descriptor de la variante que estamos usando como base

################################################################################
# Discovery F429ZI board

DISCOVERY_F429ZI.name = Discovery F429ZI

# TBD: correct memory settings here and in ldscript !!
[color=#ff3333]DISCOVERY_F429ZI.upload.maximum_size=1048576[/color]
[color=#ff3333]DISCOVERY_F429ZI.upload.maximum_data_size=131072[/color]

DISCOVERY_F429ZI.build.core=arduino
DISCOVERY_F429ZI.build.board=DISCOVERY_F429ZI

DISCOVERY_F429ZI.build.mcu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
DISCOVERY_F429ZI.build.series=STM32F4
DISCOVERY_F429ZI.build.variant=DISCOVERY_F429ZI

DISCOVERY_F429ZI.build.extra_flags=-DSTM32F429ZI -DSTM32F429xx -DHSE_VALUE=8000000
# TODO f_cpu, and check SystemClock_Config() 
[color=#ff3333]# DISCOVERY_F429ZI.build.f_cpu=180000000L[/color]

DISCOVERY_F429ZI.upload.protocol=STLink
DISCOVERY_F429ZI.upload.tool=stlink_upload

DISCOVERY_F429ZI.menu.usb.SerialUSB=Serial [Virtual COM port]
DISCOVERY_F429ZI.menu.usb.SerialUSB.build.extra_flags_usb=-DMENU_USB_SERIAL
DISCOVERY_F429ZI.menu.usb.SerialMSC=Mass storage [testing, see documentation]
DISCOVERY_F429ZI.menu.usb.SerialMSC.build.extra_flags_usb=-DMENU_USB_MASS_STORAGE
DISCOVERY_F429ZI.menu.usb.Disabled=Disabled, no USB

DISCOVERY_F429ZI.menu.serial.SerialUSB=SerialUSB
DISCOVERY_F429ZI.menu.serial.SerialUSB.build.extra_flags_serial=-DMENU_SERIAL=SerialUSB
DISCOVERY_F429ZI.menu.serial.SerialUART1=SerialUART1 [PA9/PA10]
DISCOVERY_F429ZI.menu.serial.SerialUART1.build.extra_flags_serial=-DMENU_SERIAL=SerialUART1

Este segmento es el descriptor de la placa Discovery F429ZI, debemos copiarlo y pegarlo como siguiente bloque. Hay que hacer algunos cambios de nombre para adaptarlos a nuestra variante F429ZI DISCO. Si en este momento guardamos el archivo, tendremos dos bloques con el mismo identificador, pero solo se mostrará el primeros de ellos

?mage

El bloque con los ajustes adecuados para nuestra variante debe quedar de la siguiente forma:

################################################################################
# F429ZI_DISCO board

F429ZI_DISCO.name = F429ZI DISCO

# TBD: correct memory settings here and in ldscript !!
F429ZI_DISCO.upload.maximum_size=2097152
F429ZI_DISCO.upload.maximum_data_size=196608

F429ZI_DISCO.build.core=arduino
F429ZI_DISCO.build.board=F429ZI_DISCO

F429ZI_DISCO.build.mcu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
F429ZI_DISCO.build.series=STM32F4
F429ZI_DISCO.build.variant=F429ZI_DISCO

F429ZI_DISCO.build.extra_flags=-DSTM32F429ZI -DSTM32F429xx -DHSE_VALUE=8000000
# TODO f_cpu, and check SystemClock_Config() 
F429ZI_DISCO.build.f_cpu=180000000L

F429ZI_DISCO.upload.protocol=STLink
F429ZI_DISCO.upload.tool=stlink_upload

F429ZI_DISCO.menu.usb.SerialUSB=Serial [Virtual COM port]
F429ZI_DISCO.menu.usb.SerialUSB.build.extra_flags_usb=-DMENU_USB_SERIAL
F429ZI_DISCO.menu.usb.SerialMSC=Mass storage [testing, see documentation]
F429ZI_DISCO.menu.usb.SerialMSC.build.extra_flags_usb=-DMENU_USB_MASS_STORAGE
F429ZI_DISCO.menu.usb.Disabled=Disabled, no USB

F429ZI_DISCO.menu.serial.SerialUSB=SerialUSB
F429ZI_DISCO.menu.serial.SerialUSB.build.extra_flags_serial=-DMENU_SERIAL=SerialUSB
F429ZI_DISCO.menu.serial.SerialUART1=SerialUART1 [PA9/PA10]
F429ZI_DISCO.menu.serial.SerialUART1.build.extra_flags_serial=-DMENU_SERIAL=SerialUART1

Destacan la asignación del nombre de variante, cantidad de flash, RAM, y he quitado el comentario para f_cpu. Más adelante veremos como obtener ese dato.

Guardamos el archivo; al reiniciar el IDE, ya podremos ver nuestra variante en el selector de MCU. 

?mage

Los ajustes siguen siendo visuales, no se han cambiado opciones que modifiquen el desempeño de la placa seleccionada, es decir, sólo tenemos una copia de las características de la variante base.
Reply
#2
0
Los pasos siguientes permiten modificar los archivos que están dentro de la carpeta de nuestra variante (Ver paso 2); deben realizarse con mucho cuidado y antes de cada ajuste, se debe guardar un respaldo de los archivos funcionales previos, por si algún cambio resulta en errores.  Con cada cambio recomiendo reiniciar el IDE y cargar algún ejemplo sencillo usando nuestra variante-MCU. De esta forma no tendremos sorpresas al final.

También podemos usar la variante-base para compilar el ejemplo, con la finalidad de contar con un marco de referencia: RAM usada o memoria flash ocupada por el sketch.

Paso 4: Obtención de parámetros del core o chip de nuestra variante

Para conocer los parámetros correctos de nuestra placa como f_cpu, HSE, PLL-N, divisores, etc.; tenemos que recurrir al uso del programa STM32CubeMX. Una vez iniciado el programa, activamos New Project y debemos seleccionar el MCU adecuado. En mi caso, la placa es una discovery, por lo que en lugar de seleccionar la pestaña MCU selector, usaré Board selector. 

La placa en concreto es: STM32F429I-DISCO. Damos doble click para que se abra el proyecto, en la pestaña de configurador de GPIO.

?mage

?mage

Si damos click en la pestaña Clock Configuration, podremos ver que la frecuencia del chip es 50 Mhz, con un máximo de 180 MHz, en color azul, y no podemos seleccionar el reloj HSE como base de uso. Claro está, que estos parámetros no son los correctos y no podemos generar los archivos fuente de nuestro proyecto tal como están por default.

?mage

El procedimiento de danieleff, señala los siguientes puntos para que podamos asignar las frecuencias correctas a nuestra variante.  Si nuestra placa tiene un cristal externo, hay que vincularlo a HSE, y posteriormente a PLL. 

Para acceder a estos ajustes, regresamos a la pestaña pinout y ubicamos el periférico RCC. Desplegamos el contenido y tendremos acceso a opciones HSE y LSE, que por default están desactivadas. En ambos casos seleccionamos Crystal/Ceramic Resonator.

?mage

Al seleccionar nuevamente la pestaña Clock Configuration, tendremos la posibilidad de modificar las opciones HSE y PLL. 

?mage

Hay dos ajustes que debemos hacer para conseguir la frecuencia máxima de 180 MHz del chip F429ZI

a) Vinculamos PLL Source Mux a HSE
b) Seleccionamos el multiplicador PLL*N en x360

Automáticamente el programa ajustará los relojes de los periféricos, quitando los posibles errores (resaltados como cuadros rojos, en las frecuencias incompatibles)

?mage

NOTA: si no usamos los periféricos SDIO o USB, podemos acceder a los 180 MHz del procesador con el procedimiento descrito. En caso de requerirlos, debemos activarlos en la pestaña pinout, y bajar el multiplicador PLL*N a  x336, con esto tenemos una frecuencia máxima en estos dispositivos de 48 MHz.

?mage

En mi caso me interesa la frecuencia máxima de 180 MHz en el micro, por lo que usaré el multiplicador de PLL*N = x360

Guardamos el proyecto, usé la siguiente ruta: C:\Proyectos STM32\F429ZI_180

?mage

En este punto, podríamos seleccionar periféricos adicionales o modificar el GPIO de tal modo que se ajuste a nuestro proyecto general. También podemos dejarlo tal cual, ya que por el momento interesan los configuradores de reloj, RAM y Flash para nuestra variante, conservando el pinout base.

Ubicamos el botón Para Generar el código fuente de nuestro proyecto o usamos CTRL+SHIFT+G. En la ventana emergente, seleccionamos la carpeta en la que guardamos el proyecto y asignamos un nombre al código fuente. Seleccionamos en Toolchain/IDE la opción SW4STM32

?mage

Damos click en OK para generar el código fuente con los datos de RAm, flash, GPIO y relojes de nuestra variante. Posiblemente se solicite la descarga de complementos de proyecto, por lo que hay que tener disponible una conexión a internet. Al finalizar podemos cerrar el programa, no es necesario abrir nuevamente el proyecto.

?mage
Reply
#3
0
Paso 5: Mapeo RAM

Ubicamos nuevamente los archivos del Paso 2, en la ruta 

C:\arduino-1.8.4\hardware\STM32GENERIC_danielefF\STM32\variants\F429ZI_DISCO

Abrimos el archivo Idscript.Id con un editor de texto.

Eliminamos el contenido del archivo después de la línea:
ENTRY(Reset_Handler)

En la carpeta de proyecto de la nueva variante creada en el STM32CubeMX, ubicamos:

Ruta: C:\Proyectos STM32\F429ZI_180\F429ZI_DISCO
Archivo: STM32F429ZITx_FLASH.ld

Abrimos el archivo con un editor de texto y copiamos el bloque a partir de la linea mostrada, seleccionando todas las instrucciones hasta el final del contenido.

?mage


Pegamos el bloque en el archivo Idscript.Id y guardamos los cambios

Paso 6: Mapeo de frecuencias del MCU

En la ruta 
C:\arduino-1.8.4\hardware\STM32GENERIC_danielefF\STM32\variants\F429ZI_DISCO 
Abrimos el archivo variant.c

Eliminamos el contenido, procurando no dejar algún iniciador de comentario /*, el archivo debe quedar así:

?mage

Ubicamos la carpeta C:\Proyectos STM32\F429ZI_180\F429ZI_DISCO\Src y abrimos el archivo main.c con un editor de texto. Seleccionamos y copiamos la función: 

void SystemClock_Config(void)


?mage

Pegamos la función, en el archivo variant.c. Sustituimos cada función de llamado de error


    _Error_Handler(__FILE__, __LINE__);


Por esta función:


    Error_Handler();

Guardamos los cambios.

Abrimos un sketch en el IDE compatible con nuestra MCU y seleccionamos la variante que hemos creado. Si todo ha sido correcto, no habrá mensajes de error durante la compilación y podremos cargar el sketch al MCU, a través de la variante que hemos adicionado.

?mage

Conclusión

Por fin se puede tener acceso toda la RAM y flash de la placa STM32F429ZI-DISCO, como se puede observar en el resultado de la RAM y flash usada, la nueva variante tiene acceso a los 192 Kb (196608 bytes) de RAM, contra los 128 Kb (131072 bytes) que reportaba la variante Discovery F429ZI que viene en el core de danielff.

Bienvenidas las observaciones para mejorar el procedimiento, ya que esta base nos puede ser muy útil para agregar variantes al core genérico.

El procedimiento aparentemente es laborioso, pero si lo seguimos con cuidado, no cometeremos errores. Este tutorial se desarrolló en tiempo real: a la par que comenté cada paso, lo aplicaba en la variante.
Reply
#4
1
Better response on post RE: Adición de variantes en el core genérico de danieleffEntrados en modificaciones, la variante la he designado como F429ZI FT81XMania

?mage
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)