Portanto, o trabalho desse mandril foi motivado pela quase completa ausência de instruções passo a passo, usando as ferramentas usuais oferecidas pela STMicroelectronics.
Infelizmente, o grande número de gerenciadores de inicialização encontrados na rede, às vezes muito ocupado, é "aguçado" para qualquer cristal em particular.
O material proposto contém o procedimento para usar o pacote CubeMX, o “carregador de inicialização” DfuSeDemo e o utilitário de preparação de firmware do gerenciador de arquivos Dfu, ou seja, abstraímos nossa lista de desejos do hardware, perdoamos o montador de macro e o guru da folha de dados.
Cozinhando o ambiente ...
Precisamos do próprio CubeMX, o download do gerenciador de arquivos DfuSeDemo + Dfu, estão todos no mesmo pacote, STM32 ST-LINK Utility, encontramos tudo no site da STMicroelectronics gratuitamente.
Nosso bastão experimental com o chip STM32F103C8T6 do tio Liao

e o programador ST-Link de lá.

Bem, seu IDE favorito, nesta apresentação específica, usamos KEIL, as configurações de compilação em outros IDEs não são muito diferentes.
Então vamos lá ...
Inicie o CubeMX e selecione o seu cristal ...

Celebre a sua lista de desejos ...

Nesta tarefa específica, ativamos o dispositivo USB → Device FS e, consequentemente, a classe Device USB → DownLoad Update Firmware, e o inesquecível RCC → Relógio de alta velocidade → Ressonador Cristal / Cerâmico é aquele a bordo.
Em seguida, selecione o comutador de modo bootloader-a; neste exemplo, basta usar o jumper boot1 existente.

Observamos o pequeno esquema e, de acordo com ele, o boot1 é anexado à parte do PB2 e, portanto, o usamos no modo GPIO_Input.
Feito, ative a guia Configuração do relógio e inicie a máquina de seleção de configuração.

Vá para a guia Cofiguração ...

Selecione o botão GPIO ...

E no campo ...

escreva um rótulo personalizado, seja boot1.
Em seguida, configure o projeto ...

Escolha Projeto → Configuração ...

Selecione e preencha ....

Assim, escolhemos para qual IDE Cub iremos gerar o projeto, no nosso caso, o MDK-ARM V5.
A guia Gerador de código nesta modalidade permanecerá inalterada ...

Bem, isso é tudo, começamos a geração do projeto Projeto → Gerar código

No final, o Cub solicitará que você inicie imediatamente seu IDE ... o que você deve fazer.


Começamos a compilação, montagem e carregamento no cristal ... F7, F8 ...

O resultado final ...
Mudamos os pinos da nossa placa para o modo operacional e conectamos o cabo USB ...


Abra o painel de controle no Windows → sistema → gerenciador de dispositivos → controlador USB. E observe a lista de dispositivos, o Windows fará um farfalhar e instalará o dispositivo STM no driver do modo DFU (se ainda não o estava).
Então, o motorista se levantou e decidiu, iniciar o "boot" DfuSeDemo ...

Analisamos o que capturamos no DFU Device e clicamos duas vezes no campo Selecionar destino ...

Olhamos e ficamos maravilhados com o fato de o flash até o endereço 0x0800C000 estar fechado para gravação e escrevermos esse endereço, precisamos dele ...
A propósito, eu tentei no STM32F407VE, onde a memória está aberta para gravação de 0x08000000, ou seja, desde o início ... por que, em nossa versão, não está claro, não está cavando, está enterrado em algum lugar, mas claramente não está escrito, não há nenhum comentário, porque um pedaço grande desaparece sem dono ... talvez alguém lhe diga onde cavar ...
Então, "o corte de cabelo está apenas começando" ...
Precisamos apenas de dois arquivos de origem ...

Nós os abrimos no IDE e corrigimos, adicionamos ...
Levamos em conta que o CubeMX NÃO JUNTO ao regenerar a inserção entre USER CODE BEGIN e USER COD END ... lá inseriremos nossas adições ...
Vamos começar com 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(); . . .
isso é tudo com main.c ...
vá para usbd_conf.he
#define USBD_DFU_APP_DEFAULT_ADD 0x0800000
trazer à mente ...
#define USBD_DFU_APP_DEFAULT_ADD 0x080C000
passamos para usbd_dfu_it.c, aqui mais ....
. . . 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;
Na verdade isso é tudo ...
Conectamos o programador, jogamos os jumpers no modo de programação, F7, F8 e botloader são gravados ...
Posso usar ...
Agora vamos preparar nosso aplicativo para carregamento via bootloder ...
Aplicação favorita piscará LED ...
Preparamos e depuramos o aplicativo e alteramos os locais individuais no compilador e no corpo do programa para alterar o endereço dos vetores de inicialização e interrupção do programa ...
Ou seja, em KEIL → Configurar → Ferramentas Flash

Mude o endereço do início do programa ...

Dizemos para gerar um arquivo HEX

e altere o endereço da tabela vetorial ...
coletando o programa F7 ...
converter o HEX recebido em um arquivo dfo usando o utilitário gerenciador de arquivos Dfu ...

selecione nosso arquivo HEX com o botão S19 ou HEX ... e clique em Gerar ...

nós obtemos o arquivo dfu.
Na verdade, está tudo pronto.
Carregando no controlador ...
Conectamos nossa placa experimental com o botloader já carregado ao USB, depois de definir os jumpers no modo DFU.

Você pode controlar a aparência do dispositivo STM no modo DFU na lista de dispositivos.
execute o "carregador de inicialização".

diga a ela nosso arquivo dfu ...

Pressionamos Upgrade e observamos o resultado do carregamento ... por confiança, pressionamos check.

tudo é bem sucedido ... você pode correr ...
se o erro sair, isso significa que em algum lugar um batente ...

por exemplo ...
Então, vamos assumir que tudo foi bem-sucedido ... alterne o jumper para o modo de aplicação

e aproveite o diodo piscando ...
...
Uhhhh Tantos bukoffff. Cansado de copiar fotos :-)
Obrigado a todos pela atenção ...