Sou um verdadeiro novato na área de microcontroladores. Então, sinto muito se perdi alguma coisa ou errei a terminologia.
Existem muitas questões realmente específicas para problemas específicos nesse tópico, mas quero entender um pouco mais em um nível geral.
Minha referência é um STM32F1 em um Bluepill.
Eu sei que este controlador como todos? na família STM32 tem memória de sistema começando no endereço 0x00000000 contendo o bootloader e a memória flash principal começando em 0x08000000 contendo meu firmware.
Quando eu tiver BOOT0 e BOOT1 no GND, o processador inicializará a partir da memória flash principal e se eu definir BOOT0 como HIGH, ele inicializará o bootloader.
Então bootloader tem um significado diferente em relação a computadores e sistemas operacionais, pois para uso final do dispositivo não preciso do bootloader, preciso apenas da configuração correta dos pinos de BOOT0 e BOOT1.
Meu entendimento foi que se eu quiser alterar o firmware, devo configurar o controlador para inicializar o bootloader e então conectar através de uma das muitas interfaces e atualizar a memória flash principal. Quando eu configuro assim e conecto via USB ao meu PC, nada acontece.
O que adaptei com sucesso das introduções à ferrugem incorporada foi configurar o controlador para inicializar a partir da memória flash principal e conectar um ST-LinkV2 ao Bluepill. Então posso conectar via gdb com o ST-LinkV2 e atualizar meu firmware.
Então, eu tenho algumas perguntas:
Por que o ST-LinkV2 é usado com a configuração de memória para inicializar o firmware principal e não o bootloader?
Por que não vejo nenhum dispositivo USB quando configuro o controlador para inicializar no bootloader e conectá-lo via USB?
Vejo muitas pessoas que desejam usar Bluepills com Arduino IDE. Eles atualizam um novo bootloader no controlador. Eles estão substituindo o bootloader ST? A interface USB será semelhante à programação via ST-Link?
A SRAM do STM32F103 está no endereço
0x20000000
e seu flash está no endereço0x08000000
(observe o zero à esquerda). Ele também possui um bootloader (em ROM) no endereço0x1FFFxxxx
.Dependendo da configuração dos pinos BOOTx, uma dessas três áreas de memória terá o alias de
0x00000000
. por exemplo, se você estiver inicializando a partir do flash, a memória flash ficará visível em address0x08000000
e também em address0x00000000
.Como a CPU, quando sai da redefinição, sempre busca o vetor de redefinição do endereço
0x00000004
, esse alias permite que você inicialize a partir da SRAM, do flash ou do gerenciador de inicialização.O bootloader do sistema está em ROM e não pode ser alterado ou atualizado.
Ao programar sua placa com um ST-Link, você não está usando o bootloader do STM32 (ou qualquer software do STM32), a programação acontece inteiramente pela interface JTAG ou SWD.
O bootloader do STM32F103 não suporta USB, apenas suporta USART1. Consulte a tabela 3 em AN2606 .
É possível escrever seu próprio bootloader, e muitas pessoas o fazem. No entanto, isso ainda permaneceria na memória flash normal e não substituiria o gerenciador de inicialização embutido.
Primeiro, vamos definir o bootloader no contexto do MCU. Bootloader, como comumente entendido, é um trecho de código dedicado que permite fazer upload ou atualizar o software do seu aplicativo para o flash para que ele possa ser executado posteriormente a partir dele.
Você tem várias perguntas aqui. Vamos examiná-los um por um.
Quando falamos em STLink, estamos falando em usar conexão de depurador, provavelmente SWD. Este é um método de conexão de nível muito baixo que se conecta diretamente aos componentes internos do MCU. Nenhum bootloader é usado neste método; na verdade, o núcleo do MCU não funciona, ou seja, está parado e nenhuma instrução é executada. O programador pode apagar e gravar diretamente o novo firmware no flash principal sem usar o núcleo de execução.
Presumo que estamos falando do MCU STM32F103, encontrado no Bluepills. Este MCU contém um bootloader que só pode operar via USART. Ele não inicia o hardware USB, então você não o verá. Se você quiser usar este bootloader, você deve se conectar ao USART do MCU usando algum adaptador e usar essa porta COM no programador (você pode encontrar o protocolo para ele na nota AN3155 do ST se estiver interessado em seu funcionamento interno - ou usar um dos aplicativos de programação que o suportam).
Não, eles não estão substituindo o bootloader ST. Não pode ser substituído; ele é armazenado em ROM - ROM adequada que não pode ser apagada e modificada.
O bootloader Arduino para STM32 (denominado stm32duino) é um bootloader personalizado que reside na memória flash principal. No que diz respeito ao MCU, é apenas uma aplicação normal; no entanto, é um aplicativo muito especializado e seu único objetivo é permitir que você atualize outro aplicativo (principal) na memória flash principal lado a lado com ele mesmo e, em seguida, execute-o. Observe que é preciso um pouco de memória flash e seu aplicativo principal deve estar ciente disso e abrir espaço para o bootloader; por exemplo, stm32duino reserva os primeiros 8 KB de flash para si, que não devem ser tocados por um aplicativo.