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

6

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

(Lafotoesunacapturadepantallatomadadeuntutorialaleatorio,perotodoslostutorialesquehevistotambiéndiceneso)

Elpuente,porloquesé,solocambiaelmododearranquedelprocesadorparacargarlodesdelamemoriadelsistema(elcargadordearranque)quesolotieneefectosireiniciolaplacaparainiciarelarranquedesdeallí.

Nosécómosesuponequeesun"modo de programación", ya que estoy usando un programador externo de st-link que usa SWD.

Entoncesmipreguntaaquí,¿existerealmentealgollamado"modo de programación"? y si es así, ¿cómo funciona exactamente?

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

    
pregunta iMohaned

3 respuestas

12

Solo necesitas poner el microcontrolador en modo de cargador de arranque si lo vas a programar a través del UART, usando el cargador de arranque.

En términos generales, puede 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 estableciendo un bit SWJ_CFG en AFIO->MAPR (por ejemplo, para usar los pines asociados como GPIO), o si la MCU se está ejecutando en baja potencia los modos sin los indicadores DBGMCU apropiados se establecen para mantener la interfaz de depuración activa en esos modos. Si cualquiera de estos es el caso, poner el microcontrolador en modo de cargador de arranque es una solución fácil, ya que la interfaz SWD está activa (y los modos de suspensión no se usan) mientras el cargador de arranque está en ejecución.

    
respondido por el duskwuff
4

Posiblemente hay muchas formas de programar la pizarra, usando diferentes herramientas. Uno de ellos, que parece bastante fácil, es utilizar el ST-Link V2 (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 energía a la placa prestando atención a si es 5V o 3.3V. El ST-Link convenientemente tiene una salida de 3.3V que se puede usar. Dado que la placa recibe 5 V del conector USB, no conecte otras clavijas de alimentación al mismo tiempo con el puerto USB. Puede ser útil tener un cable con 4 terminales en el lado de ST-Link y dividir 3 + 1 terminales en el lado de la placa. La placa debe encender un LED y puede comenzar a parpadear con el otro, si está programado.

  2. Tener OpenOCD instalado, las versiones más recientes pueden tener menos errores (por ejemplo, al menos 0.9.xo mejor 0.10.x). Las versiones anteriores, como las que se incluyen en las distribuciones de Linux, pueden tener problemas con, por ejemplo, restablece la configuración y requiere que juegues con los archivos de configuración.

  3. [opcional] Si ejecuta Linux y no se siente cómodo con ejecutar OpenOCD como root, cree 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á a los miembros del grupo stlink acceder al dispositivo ST-Link. Crea este grupo y súmate a él. Puedes usar cualquier grupo que sea conveniente.

  1. Suponiendo que un host Linux y la instalación de OpenOCD predeterminada para todo el sistema, compruebe si la conectividad es correcta, la MCU está activa y OpenOCD puede hablar 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 están bien, OpenOCD imprimirá cierta información sobre la MCU (voltaje, número de puntos de interrupción de HW, etc.) y seguirá funcionando.

  1. Es posible ejecutar OpenOCD como 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 Linux como host, pero los pasos deberían ser conceptualmente similares en Windows, después de instalar los controladores y realizar ajustes en la forma en que se instalan las cosas, como las rutas, etc.

    
respondido por el A.K.
4

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

Un cargador de arranque es lo que permite que el chip se "descargue" y ejecute un nuevo programa. El puente "modo de programación" utiliza los pines BOOT para indicar al cargador de arranque 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, el cargador de arranque ROM no es necesario.

[editar]: como señalan a continuación Chris Stratton y duskwuff, el gestor de arranque de la 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 del usuario que se puede cargar en la placa que admite la programación por USB (es decir, para usar con Arduino IDE), pero no utiliza los pines BOOT (por lo que no se ve afectado por el puente "modo de programación").

    
respondido por el youtooth

Lea otras preguntas en las etiquetas