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

Empecé a aprender sobre el microcontrolador stm32 durante un tiempo usando una placa de desarrollo muy pequeña "stm32f103c8t6" (o pastilla azul). cuando comencé, aprendí de algunos tutoriales que tengo que cambiar un puente para poder programarlo.

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

ingrese la descripción de la imagen aquí

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

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

ingrese la descripción de la imagen aquí

Entonces, mi pregunta aquí, ¿existe realmente algo llamado "modo de programación"? y si es 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).

Respuestas (4)

Solo necesita poner el microcontrolador en modo de cargador de arranque si va a programarlo sobre el UART, usando el cargador de arranque.

En términos generales, puede programar el microcontrolador sobre SWD en cualquier momento.

Las principales excepciones son si el microcontrolador está ejecutando un programa que deshabilita SWD configurando un SWJ_CFGbit AFIO->MAPR(por ejemplo, para usar los pines asociados como GPIO), o si la MCU está funcionando en modos de bajo consumo sin las DBGMCUbanderas apropiadas configuradas para mantener el interfaz de depuración activa en esos modos. Si alguno de estos es el caso, poner el microcontrolador en modo de cargador de arranque es una solución sencilla, ya que la interfaz SWD está activa (y no se utilizan los modos de suspensión) mientras se ejecuta el cargador de arranque.

Ni siquiera necesitas jugar con los pines BOOT0/1 para hacer eso. He reiniciado con éxito el cargador de arranque ROM en varias familias STM32 a través de una codificación cuidadosa. Los pines BOOT son útiles pero no absolutamente necesarios.
Tenga en cuenta también que el cargador de arranque ROM admite varios tipos de interfaces, no solo UART. Aunque el `103 tiene USB, esa no es una de las interfaces compatibles con el gestor de arranque de la ROM. En variantes posteriores de STM32 lo es.
@ChrisStratton No es necesariamente tan simple como las variantes "posteriores", pero básicamente tienes razón. La nota de aplicación ST AN2606 tiene un extenso resumen de qué partes STM32 tienen qué cargadores de arranque y qué características son compatibles.
@akohlsmith que no es una ciencia espacial (6-7 líneas de código para invocar). Pero el cargador de arranque interno es un poco inútil ya que no verifica si la imagen es correcta, no proporciona ningún descifrado de la imagen cargada y no funciona si protege la memoria. En los dispositivos de producción utilizo los míos; escribirlos es bastante sencillo y sencillo.
@duskwuff-inactive- después del encendido, ¿este cargador de arranque espera un programa a través de UART para siempre? o comprueba el programa y continúa ejecutando el código existente?

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

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

  2. Tenga instalado OpenOCD, las versiones más recientes pueden tener menos errores (por ejemplo, al menos 0.9.x o mejor 0.10.x). Las versiones anteriores, como las que se incluyen en las distribuciones de Linux, pueden tener problemas, por ejemplo, para restablecer la configuración y requieren manipular los archivos de configuración.

  3. [opcional] Si ejecuta Linux y no se siente cómodo ejecutando OpenOCD como root, cree un archivo /etc/udev/rules.dcon el siguiente contenido:

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

Esto permitirá que los miembros del stlinkgrupo accedan al dispositivo ST-Link. Crea este grupo y agrégate a él. Puede usar cualquier grupo que sea conveniente.

  1. Suponiendo un host Linux y una instalación OpenOCD predeterminada en todo el sistema, verifique si la conectividad está bien, la MCU está activa y OpenOCD puede comunicarse con ella:

     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 todo va bien, OpenOCD imprimirá información sobre la MCU (voltaje, número de puntos de interrupción de HW, etc.) y seguirá funcionando.

  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 tiene un binario compilado correctamente, digamos blinky.bin, puede programarlo en la 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"
    

Tenga en cuenta que hay un nombre de archivo dentro de este script que deberá ajustar. Probablemente sea una buena idea comenzar con algo realmente simple.

Lo anterior asume principalmente a Linux como host, pero los pasos deberían ser conceptualmente similares en Windows, después de instalar los controladores y hacer ajustes en la forma en que se instalan las cosas, como las rutas, etc.

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

Un cargador de arranque es lo que permite que el chip "descargue" y ejecute un nuevo programa. El puente de "modo de programación" utiliza los pines de ARRANQUE para indicarle al cargador de arranque de la ROM que necesita prepararse para descargar un nuevo programa, de lo contrario, el chip comenzará a ejecutar el programa que ya está en la memoria. Dado que está utilizando SWD para la programación, no se necesita el cargador de arranque ROM.

[editar]: como señalan Chris Stratton y duskwuff a continuación, el gestor de arranque de ROM STM32F103 no admite la programación a través de USB, solo UART, y no se puede borrar. Hay un cargador de arranque flash de usuario separado que se puede cargar en la placa que admite la programación a través de USB (es decir, para usar con Arduino IDE), pero no usa los pines BOOT (por lo que no se ve afectado por el puente "modo de programación") .

El cargador de arranque involucrado aquí está en ROM (o, al menos, en flash no modificable por el usuario). Es independiente del flash del usuario y no se puede borrar con SWD.
@duskwuff, ¡gracias por la corrección! Estaba pensando en un chip diferente.
Esto es incorrecto : el gestor de arranque de la ROM de fábrica en el STM32F103 no es compatible con USB , aunque sí lo es en muchas variantes posteriores del STM32. Por lo tanto, cualquier cargador de arranque USB funcional para el `103 tendría que residir en la aplicación flash en lugar de en la ROM y, por lo tanto, para ingresar, los pines de arranque estarían configurados para un arranque flash normal, no un arranque del cargador de arranque ROM.
@ChrisStratton, ¡gracias por la corrección! Aparentemente, solo usé partes STM32 compatibles con USB/DFU para el gestor de arranque de fábrica, por lo que no sabía que no era compatible con este chip.
"solo UART" tampoco es correcto: admite una variedad de interfaces, pero no (en el `103) USB.
@ChrisStratton, según la especificación STM32F103x8 y AN2606 , parece que solo USART1 es compatible con el cargador de arranque en este chip. ¿Puede proporcionar un enlace que muestre las otras interfaces que admite?

De la hoja de datos de especificaciones del producto DS5319 PDF , Rev 17 (con fecha de agosto de 2015), Sección 2.3.8, Modos de arranque:

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

  • Arrancar desde Flash de usuario
  • Arranque desde la memoria del sistema
  • Arranque desde SRAM integrado

El cargador de arranque se encuentra en la memoria del sistema. Se usa para reprogramar la memoria Flash usando USART1. Para obtener más detalles, consulte AN2606.

De la introducción de AN2606 PDF (rev. 42, con fecha de diciembre de 2019) : "El gestor de arranque se almacena en la memoria ROM de arranque interna (memoria del sistema) de los dispositivos STM32. ST lo programa durante la producción. Su tarea principal es descargar la aplicación programa a 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 enumerados en la Tabla 1. Se denominan STM32 en todo el documento".

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

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