
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).
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.
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:
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.