Programación STM32: JTAG/SWD vs gestor de arranque

Estoy haciendo un PCB para un proyecto personal usando el microcontrolador STM32L031K6T7. Parece que este uC tiene un cargador de arranque que se puede usar para reprogramar la memoria del programa flash a través de UART o SPI. También tiene pines SWD.

Entonces, ¿eso significa que tengo dos métodos completamente separados pero igualmente válidos para programar este uC si quiero? Entiendo que puedo interactuar con SWD usando mi depurador j-link, pero ¿cómo me conectaría con el método del cargador de arranque?

Supongo que necesitaría un dispositivo para conectar el USB de mi computadora y el bus UART o SPI de la uC, pero no estoy 100% seguro. Y luego me pregunto si tengo que preocuparme por lo que sucedería si tuviera el bus SPI ocupado con otros dispositivos, y luego probé el método del cargador de arranque para programarlo. ¿No tendría que ser el dispositivo del programador el maestro SPI para iniciar las comunicaciones con el uC como esclavo?

Puede comenzar con: Modo de arranque de memoria del sistema del microcontrolador AN2606 STM32 . Consulte la página 15 para "Documentos relacionados".
ah Eso tiene mucho más sentido. Parece que el cargador de arranque actúa como un esclavo SPI cuando está en ese modo. Así que supongo que puedo tener otros dispositivos en el bus SPI, ya que solo activaré el pin de selección del gestor de arranque solo cuando lo necesite. Y definitivamente parece que necesitaré un dispositivo para interactuar entre USB y SPI.

Respuestas (3)

Sí. Muchos dispositivos STM32 vienen con un gestor de arranque integrado. Consulte la documentación sobre cómo activarlo. Esto a menudo se hace atando un alfiler alto durante el encendido.

También deberá leer la hoja de datos sobre cómo usar SPI y UART en el modo de cargador de arranque.

Entonces, sí, puede programar el dispositivo usando el cargador de arranque o usando SWD.

SWD también se utiliza para depurar el dispositivo (por ejemplo, un solo paso a través del código, examinar la memoria), mientras que el cargador de arranque es solo para cargar un programa.

Fantástico. ¡Gracias por confirmar lo que pensé que entendía al respecto! Entonces, parece que algunos microcontroladores tienen una memoria de cargador de arranque que está limpia cuando la obtienes, ¿entonces escriben su propio cargador de arranque para ayudar a programar el flash?
Eso es correcto. Por ejemplo, todos los PIC de Microchip (que yo sepa) no tienen un cargador de arranque incorporado; se debe programar la primera vez con uno. Tenga en cuenta que tienen servicios que le enviarán circuitos integrados preprogramados con su archivo .hex personalizado. Esto es muy útil para la producción de alto volumen.

SWD es una interfaz JTAG de 4 hilos sin reinicio de hardware. JTAG tiene más cables, pero también tiene una línea de reinicio para reiniciar el procesador usando una línea de hardware (el procesador podría entrar en un modo en el que es posible que no pueda reiniciar el procesador con un comando de depuración de software, momento en el que tendría que apagar y encender). ) La interfaz JTAG también se puede ejecutar en un "modo" SWD donde solo usa 2 cables para la comunicación.

Hay varias formas de programar un STM32 (Flash externo, USB, ROM externo), pero requieren que el código se ejecute en el procesador, por lo que inicialmente necesitará un gestor de arranque y programación. Necesitará SWD o JTAG para la depuración de todos modos.

¿Qué quiere decir cuando dice que hay varias formas de programar el STM32 que requieren que el código se ejecute en el procesador? Tenía la impresión de que JTAG/SWD podría usarse para programar el uC independientemente de qué programa esté cargado actualmente en el flash. Y luego, para la opción del cargador de arranque, el programa en el flash ni siquiera se está ejecutando; en cambio, se está ejecutando el código del cargador de arranque en la memoria del sistema. Así que no estoy seguro de lo que quiere decir cuando dice que necesitaré "cargador de arranque y programación". ¡Gracias!
Un cargador de arranque requiere programar el flash integrado en el STM32, puede ser un programa de una sola vez y luego puede cargar su programa desde cualquier fuente que desee, pero para cargar el cargador de arranque necesita un JTAG\SWD
Ohh, está bien, creo que entiendo lo que quieres decir ahora. Entonces, en este caso, el chip STM32 que estoy viendo viene con un gestor de arranque preprogramado (creo). Supongo que eso me deja programar el programa flash mem con cualquiera de los dos métodos entonces.

Sé que es viejo pero estoy viendo cosas que pueden confundir a un novato.

La "biblia" para manejar los diversos cargadores de arranque integrados STM32 es AN-2606 de ST-Micro, "modo de arranque de memoria del sistema de microcontrolador STM32", se actualiza a medida que se lanza una nueva serie. Al momento de escribir este artículo, se actualizó por última vez en octubre de 2019 (es decir, el mes pasado).

A continuación, TODOS los chips STM32 tienen, como mínimo, un cargador de arranque en serie integrado. Es ROM de fábrica y no se puede borrar. Esto significa que no se requiere una interfaz externa (JTAG/SWD) para programar un STM32at en la mayoría de los casos. Tenga cuidado con posibles desajustes en el voltaje.

AN-2605 describe los diversos métodos para invocar un cargador de arranque del sistema. La cantidad de interfaces disponibles varía desde una sola interfaz USART en algunas de las primeras series STM32F1 hasta las H7, que son monstruos, con un total de 12 interfaces, 3 USART, 3 I2C, 4 SPI, 1 USB (DFU) y 1 FDCAN .

Por supuesto, puede ignorar todo esto y usar un adaptador JTAG/SWD para programar la MCU. Estos tienen la ventaja adicional de permitirle también depurar su trabajo.

Uno tendría que tener EXTREMADAMENTE limitaciones de espacio para justificar no llevar los pines SWD a al menos pequeños puntos de prueba o vías. Pero entonces, no mostrar un UART para los mensajes de depuración también es un error que debe evitarse en todos los diseños, excepto en los más pequeños. Sí, los mensajes a través de SWD son, en teoría, una posibilidad; en la práctica, un UART suele ser mejor.
Bueno, el objetivo principal de las respuestas anteriores y el OP se referían a los cargadores de arranque con algunas cosas que pensé que eran un poco escamosas aquí y allá. He jugado con varios cargadores de arranque, pero el 99% del tiempo uso SWD para mi programación y depuración, usando SWO y/o serial para obtener información de estado, prefiero imprimir en SWO desde un subproceso de baja prioridad. Una de las razones por las que evito usar Cortex-M0/M0+ para el desarrollo es su falta de salida SWO.
No es necesario evitar los M0: hay un UART asignado a uno de los pines SWD, siempre que haya activado el reinicio y tenga un adaptador SWD no falso que realmente pueda controlar la línea de reinicio, simplemente espere uno o dos segundos después del reinicio y luego reasignar el pin SWD a UART TX y comenzar a descargar datos.
Dado que utilizo una sonda Black Magic Probe para todo, es sencillo conectar tanto el serial como el SWO a uno de los VCP. Con un par de parches sencillos, el BMP entiende muy bien la salida SWO. Entonces, con GDB en una ventana, Putty en otra y mi lector SWO favorito en una tercera, puedo obtener casi cualquier información que desee.
Estoy hablando de SWO, un UART no tiene las mismas habilidades. SWO está conectado profundamente en el hardware de depuración integrado, no cerca del mismo. Como ejemplo, tiene la opción de salida asíncrona o Manchester con SWO.
Oh, el horror, no tener su canal de salida de depuración favorito y tener que arreglárselas con uno perfectamente adecuado. ¿Y luego le dices a la gente de negocios que necesitas comprar una MCU más cara?
Bueno, si el firmware usa los UART, realmente prefiero no compartir la depuración. Además, las escrituras a través de SWO no usan la misma ruta, lo que significa que puedo volcar datos allí y no entran en conflicto con los módulos UART de ninguna manera. Además, la codificación Manchester por hardware es más robusta con respecto a los problemas de tiempo.
En cuanto al precio, $ 1.25 extra me dan un STM32F3 en comparación con STM32L0 y obtengo punto flotante y DSP como un bono, no solo la celda de depuración completa... Por suerte para mí, no trato con hardware básico lo suficiente como para asunto.