Entonces, el trabajo de este mandrigal fue impulsado por la ausencia casi completa de instrucciones paso a paso utilizando las herramientas habituales que ofrece STMicroelectronics.
Lamentablemente, la gran cantidad de gestores de arranque que se encuentran en la red, a veces muy ocupados, se "afilan" para cualquier cristal en particular.
El material propuesto contiene el procedimiento para usar el paquete CubeMX, el "gestor de arranque" DfuSeDemo y la utilidad de preparación de firmware del administrador de archivos Dfu, es decir, extraemos nuestra lista de deseos del hardware, perdonamos al ensamblador de macros y al gurú de la hoja de datos.
Cocinar el medio ambiente ...
Necesitamos CubeMX, la descarga del administrador de archivos DfuSeDemo + Dfu, todos están en el mismo paquete, STM32 ST-LINK Utility, encontramos todo en el sitio web de STMicroelectronics de forma gratuita.
Nuestro palo experimental con el chip STM32F103C8T6 del tío Liao

y el programador ST-Link desde allí.

Bueno, su IDE favorito, en esta presentación específica usamos KEIL, la configuración de compilación en otros IDE no es muy diferente.
Entonces vamos ...
Inicie CubeMX y seleccione su cristal ...

Celebra tu lista de deseos ...

En esta tarea específica, activamos el dispositivo USB → Dispositivo FS y, en consecuencia, el dispositivo USB → DownLoad Update Firmware class, y el inolvidable RCC → High Speed Clock → Cristal / Ceramic Resonator es el que está a bordo.
A continuación, seleccione el conmutador de modo bootloader-a, en este ejemplo, simplemente use el puente boot1 existente.

Observamos el pequeño esquema y, de acuerdo con él, boot1 está conectado a la pata de PB2, por lo que lo usamos en modo GPIO_Input.
Hecho, active la pestaña Configuración de reloj e inicie la máquina de selección de configuración.

Salte a la pestaña Cofiguración ...

Seleccione el botón GPIO ...

Y en el campo ...

escribe una etiqueta personalizada, deja que sea boot1.
A continuación, configure el proyecto ...

Elija Proyecto → Configuración ...

Seleccionar y rellenar ....

En consecuencia, elegimos para qué IDE Cub generaremos el proyecto, en nuestro caso, MDK-ARM V5.
La pestaña Generador de código en esta realización permanecerá sin cambios ...

Bueno, eso es todo, comenzamos la generación del proyecto Proyecto → Generar Código

Al final, Cub le pedirá que inicie inmediatamente su IDE ... lo que debe hacer.


Comenzamos la compilación, el ensamblaje y la carga en el cristal ... F7, F8 ...

El resultado final ...
Cambiamos los pines de nuestra placa al modo operativo y conectamos el cable USB ...


Abra el panel de control en Windows → sistema → administrador de dispositivos → controlador USB. Y mire la lista de dispositivos, Windows se moverá un poco e instalará el dispositivo STM en el controlador de modo DFU (si aún no estaba en pie).
Entonces, el conductor se levantó y decidió, iniciar el "arranque" DfuSeDemo ...

Observamos lo que atrapamos el dispositivo DFU y hacemos doble clic en el campo Seleccionar destino ...

Cuidadosamente miramos y nos maravillamos de que el flash hasta la dirección 0x0800C000 esté cerrado para escribir y escribimos esta dirección, la necesitamos ...
Por cierto, lo probé en STM32F407VE, donde la memoria está abierta para grabar desde 0x08000000, es decir, desde el principio ... por qué, en nuestra versión, no está claro, no está cavando, está enterrado en algún lugar, pero claramente no está escrito, no hay ningún error, porque una pieza grande desaparece sin dueño ... tal vez alguien te dirá dónde cavar ...
Entonces, "el corte de pelo acaba de comenzar" ...
Solo necesitamos dos archivos fuente ...

Los abrimos en IDE y corregimos, agregamos ...
Tenemos en cuenta que CubeMX NO SE JUNTA al regenerar el inserto entre COMENZAR CÓDIGO DE USUARIO y FIN DE CÓDIGO DE USUARIO ... allí ingresaremos nuestras adiciones ...
Comencemos con main.c
typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; . . . uint32_t AddressMyApplicationBegin = 0x0800C000; uint32_t AddressMyApplicationEnd = 0x0800FBFC; . . . if(HAL_GPIO_ReadPin(boot1_GPIO_Port, boot1_Pin ) == GPIO_PIN_SET) { if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000) == 0x20000000) { JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication(); } } MX_USB_DEVICE_Init(); . . .
eso es todo con main.c ...
vaya a usbd_conf.h y a
#define USBD_DFU_APP_DEFAULT_ADD 0x0800000
traer a la mente ...
#define USBD_DFU_APP_DEFAULT_ADD 0x080C000
pasamos a usbd_dfu_it.c, aquí más ...
. . . extern uint32_t AddressMyApplicationBegin; extern uint32_t AddressMyApplicationEnd; . . . #define FLASH_ERASE_TIME (uint16_t)50 #define FLASH_PROGRAM_TIME (uint16_t)50 . . . , «» … uint16_t MEM_If_Init_FS(void) { HAL_StatusTypeDef flash_ok = HAL_ERROR;
En realidad eso es todo ...
Conectamos el programador, colocamos los puentes en el modo de programación, se graban F7, F8 y botloader ...
¿Puedo usar ...
Ahora prepararemos nuestra aplicación para cargar mediante bootloder ...
La aplicación favorita parpadeará LED ...
Preparamos y depuramos la aplicación, y cambiamos los lugares individuales en el compilador y el cuerpo del programa para cambiar la dirección del inicio del programa e interrumpir los vectores ...
A saber, en KEIL → Configurar → Herramientas Flash

Cambiar la dirección del inicio del programa ...

Decimos generar un archivo HEX

y cambiar la dirección de la tabla de vectores ...
recolectando el programa F7 ...
convierta el HEX recibido en un archivo dfo utilizando la utilidad del administrador de archivos Dfu ...

seleccione nuestro archivo HEX con el botón S19 o HEX ... y haga clic en Generar ...

obtenemos el archivo dfu.
En realidad, todo está listo.
Cargando en el controlador ...
Conectamos nuestra placa experimental con el cargador de bot ya cargado a USB, después de configurar los puentes en modo DFU.

Puede controlar la apariencia del dispositivo STM en modo DFU en la lista de dispositivos.
ejecuta el "gestor de arranque".

dile nuestro archivo dfu ...

Presionamos Actualizar y observamos el resultado de la carga ... para mayor seguridad, presionamos verificar.

todo tiene éxito ... puedes correr ...
si el error salió, significa en algún lugar una jamba ...

por ejemplo ...
Entonces, asumiremos que todo tiene éxito ... cambie el puente al modo de aplicación

y disfruta del diodo parpadeante ...
...
Uhhhh Tantos bukoffff. Cansado de copiar fotos :-)
Gracias a todos por su atención ...