7 votos

¿Realmente necesito poner el microcontrolador stm32 en modo de arranque para programarlo?

He comenzado a aprender el microcontrolador stm32 por un tiempo usando una placa de desarrollo muy pequeña "stm32f103c8t6" (o pill azul). cuando empecé, aprendí de algunos tutoriales que tenía que cambiar un puente para programarlo.

introducir descripción de la imagen aquí (La foto es una captura de pantalla tomada de un tutorial al azar, pero todos los tutoriales que he visto también dijeron eso)

introducir descripción de la imagen aquí

El puente - hasta donde sé - solo cambia el modo de arranque del procesador para cargar desde la memoria del sistema (el cargador de arranque) lo que solo tiene efecto si reinicio la placa para arrancar desde allí.

No sé cómo se supone que eso sea un "modo de programación", ya que estoy usando un programador st-link externo que utiliza SWD.

introducir descripción de la imagen aquí

Entonces mi pregunta aquí, ¿Realmente existe algo llamado "modo de programación"? y de ser así, ¿Cómo funciona exactamente?

También vale la pena mencionar que acabo de intentar programarlo y el programa funcionó como se suponía (espero no haber arruinado nada :d).

17voto

duskwuff Puntos 1570

Solo necesitas poner el microcontrolador en modo de bootloader si vas a programarlo a través del UART, utilizando el bootloader.

En general, puedes programar el microcontrolador a través de SWD en cualquier momento.

Las excepciones principales son si el microcontrolador está ejecutando un programa que deshabilita SWD al establecer un bit SWJ_CFG en AFIO->MAPR (por ejemplo, para usar los pines asociados como GPIO), o si la MCU está funcionando en modos de bajo consumo energético sin los flags DBGMCU apropiados establecidos para mantener activa la interfaz de depuración en esos modos. Si alguno de estos es el caso, poner el microcontrolador en modo de bootloader es una solución fácil, ya que la interfaz SWD está activa (y los modos de suspensión no se utilizan) mientras el bootloader está en ejecución.

1 votos

No necesitas ni siquiera jugar con los pines BOOT0/1 para hacer eso. He reiniciado con éxito al cargador de arranque ROM en varias familias de STM32 a través de una codificación cuidadosa. Los pines BOOT son útiles pero no absolutamente necesarios.

1 votos

También ten en cuenta que el cargador de arranque de ROM soporta varios tipos de interfaces, no solo UART. Aunque el '103 tiene USB, ese no es uno de las interfaces soportadas por el cargador de arranque de ROM. En variantes posteriores de STM32 sí lo es.

1 votos

@ChrisStratton No es necesariamente tan simple como las variantes "later", pero básicamente tienes razón. Nota de Aplicación de ST AN2606 tiene un extenso resumen de qué partes STM32 tienen qué bootloaders y qué funciones son compatibles.

4voto

mwfearnley Puntos 101

Si estás utilizando un programador ST-Link (SWD), entonces no necesitas poner la placa en "modo de programación".

Un bootloader es lo que permite que el chip "descargue" y ejecute un nuevo programa. El jumper de "modo de programación" utiliza los pines BOOT para indicarle al bootloader de ROM que se prepare para descargar un nuevo programa, de lo contrario el chip ejecutará el programa que ya está en memoria. Dado que estás utilizando SWD para la programación, el bootloader de ROM no es necesario.

[editar]: como señalan Chris Stratton y duskwuff a continuación, el bootloader de ROM del STM32F103 no es compatible con la programación a través de USB, solo UART, y no se puede borrar. Existe un bootloader de usuario flash que se puede cargar en la placa y que sí admite la programación por USB (es decir, para su uso con el IDE de Arduino), pero no utiliza los pines BOOT (por lo tanto no se ve afectado por el jumper de "modo de programación").

1 votos

El cargador de arranque involucrado aquí está en ROM (o, al menos, en flash no modificable por el usuario). Es independiente de la memoria flash del usuario y no se puede borrar a través de SWD.

0 votos

@duskwuff, ¡gracias por la corrección! Estaba pensando en otro chip.

2 votos

Esto es incorrecto - el cargador de arranque de fábrica en el STM32F103 no admite USB, aunque en muchas variantes posteriores de STM32 sí lo hace. Por lo tanto, cualquier cargador de arranque USB funcional para el '103 tendría que residir en la flash de la aplicación en lugar de en ROM, y por lo tanto, para ingresar, los pines de arranque se configurarían para un arranque de flash normal, no un arranque de cargador de arranque ROM.

4voto

mjv Puntos 38081

Posiblemente haya muchas formas de programar la placa, utilizando diferentes herramientas. Uno de ellos, que parece bastante fácil es usar el ST-Link V2 (búscalo en Google) y OpenOCD.

  1. Deja ambos jumpers de arranque en "0". Conecta los pines SWDIO, SWCLK, GND a los pines apropiados del ST Link. Aplica energía a la placa prestando atención a si es de 5V o 3.3V. El ST-Link convenientemente tiene una salida de 3.3V que se puede usar. Dado que la placa recibe 5V del conector USB, no conectes otros pines de alimentación al mismo tiempo con el puerto USB. Puede ser útil tener un cable con 4 terminales en el lado del ST-Link y dividir 3+1 terminales en el lado de la placa. La placa debería encender un LED y podría comenzar a parpadear con el otro, si está programado.

  2. Tener instalado OpenOCD, las versiones más recientes pueden tener menos errores (por ejemplo, al menos 0.9.x o mejor 0.10.x). Versiones más antiguas, como las incluidas en distribuciones de Linux, pueden tener problemas con la configuración de reinicio y requerir ajustes en archivos de configuración.

  3. [opcional] Si usas Linux y no te sientes cómodo ejecutando OpenOCD como root, crea un archivo en /etc/udev/rules.d con el siguiente contenido:

    SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0664", GROUP="stlink"

Esto permitirá que los miembros del grupo stlink accedan al dispositivo ST-Link. Crea este grupo y añádete a él. Puedes utilizar cualquier grupo que sea conveniente.

  1. Suponiendo un host de Linux y una instalación predeterminada de OpenOCD a nivel del sistema, verifica si la conectividad está bien, el MCU está vivo, y OpenOCD puede comunicarse con él:

     openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg

Dependiendo de la versión de OpenOCD, lo siguiente también puede funcionar:

     openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg

Si las cosas van bien, OpenOCD imprimirá información sobre el MCU (voltaje, número de breakpoints de hardware, etc.) y seguirá ejecutándose.

  1. Puede ser posible ejecutar OpenOCD como un demonio y usar telnet para usarlo, pero creo que es más conveniente iniciarlo cada vez. Suponiendo que tienes un binario compilado correctamente, digamos, blinky.bin, puedes programarlo en el MCU con el siguiente script:

    OPENOCD="openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg"
    $OPENOCD -c "init" -c "reset halt" -c "stm32f1x mass_erase 0" -c "flash write_bank 0 blinky.bin 0" -c "reset run" -c "shutdown"

Nota que hay un nombre de archivo dentro de este script que necesitarás ajustar. Probablemente sea una buena idea comenzar con algo realmente simple.

Lo anterior principalmente asume Linux como un host, pero los pasos deberían ser conceptualmente similares en Windows, después de instalar controladores y hacer ajustes en cómo se instalan las cosas, como rutas y demás.

1voto

Andre Puntos 91

Del datasheet de Especificaciones del Producto DS5319 en PDF, Rev 17 (fechado agosto 2015), Sección 2.3.8, Modos de arranque:

Al iniciar, los pines de arranque se utilizan para seleccionar una de tres opciones de arranque:

  • Arranque desde Flash de Usuario
  • Arranque desde Memoria del Sistema
  • Arranque desde SRAM incrustada

El cargador de arranque está ubicado en la Memoria del Sistema. Se utiliza para reprogramar la memoria Flash mediante el uso de USART1. Para más detalles por favor consulte AN2606.

Desde la introducción de AN2606 en PDF (rev 42, fechado Dic 2019): "El cargador de arranque está almacenado en la memoria interna de ROM de arranque (memoria del sistema) de los dispositivos STM32. Es programado por ST durante la producción. Su tarea principal es descargar el programa de aplicación en la memoria Flash interna a través de uno de los periféricos seriales disponibles (USART, CAN, USB, I2C, SPI, etc.). Se define un protocolo de comunicación para cada interfaz serial, con un conjunto de comandos y secuencias compatibles. Este documento se aplica a los productos mencionados en la Tabla 1. Se les denomina STM32 a lo largo del documento."

El capítulo sobre el cargador de arranque de los dispositivos STM32F10xxx dice "Una vez inicializado, la configuración de USART1 es: 8 bits, paridad par e 1 bit de parada." "Pin PA10: USART1 en modo de recepción", "Pin PA9: USART1 en modo de transmisión".

Luego está AN3155, que describe el protocolo USART real, que se inicia cuando el STM32 recibe el byte 0x7F.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X