Descargar firmware a STM32 a través de USB

imagen

En mi proyecto, uso el microcontrolador STM32F103C8 y el marco stm32duino . Este clon de Arduino ofrece un cargador de arranque especial que le permite cargar firmware a través de USB, sin usar componentes externos como el adaptador ST-Link o USB-UART.

Hoy necesitaba trabajar con un controlador simple debajo de CooCox y sin stm32duino. Pero aquí está el problema. Incluso una simple bombilla intermitente vertida a través de este gestor de arranque no funciona.

Vamos a hacerlo bien. Quizás mis cálculos parecen ser comunes. Pero recién estoy comenzando a estudiar los controladores STM32 y maté al menos medio día para encontrar el problema. De repente, este artículo acortará el tiempo de desarrollo para alguien.

No tengo nada contra ST-Link y otros depuradores. Pero en mi dispositivo terminado no lo será, pero definitivamente habrá USB. ¿Por qué no establecer inmediatamente la capacidad de actualizar el firmware a través de USB? Personalmente, este método me parece conveniente. más aún, de todos modos, ya tengo un cable conectado al que hay alimentación y USB Serial.

Veamos cómo funciona el gestor de arranque. Para comenzar con el ejemplo de los controladores AVR. ¿Por qué me acordé de él? Cambié de Arduino y subconscientemente esperaba el mismo comportamiento. Pero en STM32 todo resultó de manera diferente. Por lo tanto, quiero hablar sobre la diferencia entre estos dos microcontroladores.

Entonces En los microcontroladores AVeg ATMega, se puede reservar una cierta cantidad de memoria para el gestor de arranque cerca del final del flash. Usando bits de fusible puede controlar desde qué dirección se iniciará el programa. Si no hay gestor de arranque, el programa comienza desde la dirección 0x0000. Si hay un gestor de arranque, comienza desde alguna otra dirección (por ejemplo, en ATMega32 con 0x3C00, si el tamaño del gestor de arranque es 2k).

imagen

Cuando el gestor de arranque ha hecho su trabajo, transfiere el control al programa principal desde la dirección 0x0000. Es decir El programa siempre comienza en 0x0000. El compilador y el enlazador funcionan con el hecho de que el código se ubicará al comienzo del espacio de direcciones.

En los microcontroladores STM32, esto no es así. Todos los programas comienzan desde la dirección 0x0800000. Un gestor de arranque no es tan especial. Este es el mismo programa que comienza desde la misma dirección de inicio. En el proceso, el gestor de arranque puede recibir el firmware (a través de USB o UART, leerlo desde una unidad flash USB, recibirlo de un satélite, obtenerlo de un subespacio, lo que sea ...) y escribirlo en direcciones superiores al propio gestor de arranque. Y, por supuesto, al final de su trabajo, transfiera el control al programa principal.

imagen

Entonces, al compilar el firmware, necesita saber dónde el gestor de arranque escribirá el firmware y ajustará las direcciones en consecuencia.

Eso es todo con la teoría. Pasemos a practicar. A continuación hay una instrucción paso a paso sobre cómo conectar el cargador de arranque USB a los microcontroladores de la serie STM32F1xx, y quizás también a algunos otros.

Sin embargo, existen algunas limitaciones para los circuitos. Aquí, desafortunadamente, no soy fuerte. ITP necesita una resistencia pull-up de 1.5k para el puerto PA12 (también conocido como USB D +). Esto permite que el gestor de arranque se conecte y desconecte de USB en el momento adecuado.

Instrucción:

  • Descargue github.com/rogerclarkmelbourne/STM32duino-bootloader . En el directorio STM32F1 \ binaries ya hay un paquete de gestores de arranque compilados para diferentes placas. El índice al final del nombre del archivo indica dónde está conectado el LED. En el caso de mi placa donde el LED está conectado al pin C13, utilicé el archivo generic_boot20_pc13.bin.

  • Destellamos según las instrucciones . Sí, aquí necesitará un adaptador USB-UART, pero también puede usar un depurador .

  • Ahora el microcontrolador está listo para flashear a través del cargador de arranque USB. Pero aún necesita reparar el firmware en sí. Y necesitas hacer 2 cosas:

    • Proporcione al vinculador una dirección de inicio. En CooCox, esto se hace en la configuración del proyecto, pestaña Enlace, sección Áreas de memoria, Dirección de inicio IROM1. El gestor de arranque toma los primeros 8 kilobytes, lo que significa que la dirección de inicio del firmware será 0x0800000 + 0x2000 = 0x08002000. El campo Tamaño, probablemente, también debería reducirse en 8k.

    • En algún lugar al comienzo del programa, antes de inicializar los periféricos, haga una llamada

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); 


      ACTUALIZACIÓN 17/05/2018: No existe la función NVIC_SetVectorTable () en la versión moderna de STM32Cube. En cambio, puede corregir el defecto VECT_TAB_OFFSET en el archivo system_stm32f1xx.c (o similar para otro microcontrolador)

  • El relleno de firmware se puede tomar del proyecto stm32duino . En el directorio de herramientas, busque un script llamado maple_upload. Solo utilicé la versión de Windows: maple_upload.bat.

  • Corre así:

     "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin" 

    En lugar de COM20, debe sustituir su puerto donde está conectado el microcontrolador.

    El vertedor es una cosa muy tierna, no le gustan los caminos relativos. entonces la ruta al firmware debe especificarse completamente.

    1EAF: 0003 es el VID y PID

    2: este es el parámetro AltID, que indica que el firmware debe cargarse a 0x08002000 (leer aquí ).

Otro poco de matices. Antes de cargar el firmware, debe ejecutar el gestor de arranque. La forma más fácil es presionar el botón de reinicio. Después de eso, el gestor de arranque se iniciará y esperará unos segundos el firmware. Si nadie inició maple_upload en este momento, el gestor de arranque transferirá el control al firmware principal.

Para no presionar reset cada vez, las placas basadas en libmaple / stm32duino utilizan un truco. Escuchan el puerto serie usb. Si surge una señal DTR y se transmite una secuencia clave de bytes, el microcontrolador se vuelve a cargar en el gestor de arranque. Mire la función rxHook () .

Esto puede causar inconvenientes. Si el microcontrolador se apaga y se cuelga, ya no escucha el puerto. Por lo tanto, no puede escuchar la secuencia de teclas y reiniciar en el gestor de arranque. Entonces solo reinicie para ayudar.

Eso es todo. Espero que mi artículo arroje luz sobre cómo funciona el gestor de arranque en STM32 y cómo descargar firmware a través de un puerto USB. Desafortunadamente, el umbral de entrada sigue siendo alto, pero de repente mi artículo ayudará a alguien a superarlo.

Source: https://habr.com/ru/post/es403007/


All Articles