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.
(La foto es una captura de pantalla tomada de un tutorial aleatorio, pero todos los tutoriales que he visto también dicen eso)
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.
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).
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_CFG
bit AFIO->MAPR
(por ejemplo, para usar los pines asociados como GPIO), o si la MCU está funcionando en modos de bajo consumo sin las DBGMCU
banderas 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.
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.
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.
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.
[opcional] Si ejecuta Linux y no se siente cómodo ejecutando OpenOCD como root, cree un archivo /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 stlink
grupo accedan al dispositivo ST-Link. Crea este grupo y agrégate a él. Puede usar cualquier grupo que sea conveniente.
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.
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") .
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
.
akohlsmith
chris stratton
usuario39382
0___________
Arosha Dissanayake