
No meu projeto, eu uso o
microcontrolador STM32F103C8 e a
estrutura stm32duino . Este clone do Arduino oferece um gerenciador de inicialização especial que permite o upload de firmware via USB, sem o uso de componentes externos, como o adaptador ST-Link ou o adaptador USB-UART.
Hoje eu precisava trabalhar com um controlador simples sob o CooCox e sem o stm32duino. Mas aqui está o problema. Mesmo uma simples lâmpada pisca-pisca derramada através deste gerenciador de inicialização não funciona.
Vamos acertar. Talvez meus cálculos pareçam comuns. Mas estou começando a estudar os controladores STM32 e matei pelo menos meio dia para encontrar o problema. De repente, este artigo reduz o tempo de desenvolvimento para alguém.
Não tenho nada contra o ST-Link e outros depuradores. Mas no meu dispositivo acabado não será, mas definitivamente haverá USB. Por que não estabelecer imediatamente a capacidade de atualizar o firmware via USB? Pessoalmente, acho esse método conveniente. ainda mais, já tenho um cabo conectado ao qual há energia e USB Serial.
Vamos ver como o gerenciador de inicialização funciona. Para começar com o exemplo de controladores AVR. Por que eu lembrei dele? Eu mudei do Arduino e subconscientemente esperava o mesmo comportamento. Mas no STM32 tudo saiu de forma diferente. Portanto, quero falar sobre a diferença entre esses dois microcontroladores.
Então Nos microcontroladores AVeg ATMega, uma certa quantidade de memória pode ser reservada para o carregador de inicialização próximo ao final do flash. Usando bits de fusível, você pode controlar a partir de qual endereço o programa será iniciado. Se não houver carregador de inicialização, o programa inicia no endereço 0x0000. Se houver um carregador de inicialização, ele será iniciado a partir de outro endereço (por exemplo, no ATMega32 com 0x3C00, se o tamanho do carregador de inicialização for 2k).
Quando o carregador de inicialização faz seu trabalho, transfere o controle para o programa principal a partir do endereço 0x0000. I.e. o programa sempre inicia em 0x0000. O compilador e o vinculador trabalham com o fato de que o código estará localizado no início do espaço de endereço.
Nos microcontroladores STM32, isso não é verdade. Todos os programas iniciam no endereço 0x0800000. Um gerenciador de inicialização não é tão especial. Este é o mesmo programa que inicia no mesmo endereço inicial. No processo, o carregador de inicialização pode receber o firmware (via USB ou UART, ler de uma unidade flash USB, receber de um satélite, obtê-lo de um subespaço, qualquer que seja ...) e gravá-lo em endereços maiores que o próprio carregador de inicialização. E, é claro, no final de seu trabalho, transfira o controle para o programa principal.
Portanto, ao compilar o firmware, você precisa saber onde o carregador de inicialização gravará o firmware e ajustará os endereços de acordo.
Isso é tudo com a teoria. Vamos seguir praticando. Abaixo está uma instrução passo a passo sobre como prender o carregador de inicialização USB aos microcontroladores da série STM32F1xx e talvez a alguns outros também.
Existem, no entanto, algumas limitações aos circuitos. Infelizmente, aqui não sou forte. O ITP precisa de um resistor pull-up de 1,5k para a porta PA12 (também conhecida como USB D +). Isso permite que o carregador de inicialização se conecte e desconecte do USB no momento certo.
Instrução:
Mais um pouco de nuances. Antes de fazer o upload do firmware, você precisa executar o gerenciador de inicialização. A maneira mais fácil é pressionar o botão de redefinição. Depois disso, o carregador de inicialização será iniciado e aguardará alguns segundos pelo firmware. Se ninguém iniciou o maple_upload nesse momento, o carregador de inicialização transferirá o controle para o firmware principal.
Para não pressionar reset cada vez, as placas baseadas em libmaple / stm32duino usam um truque. Eles ouvem a porta serial USB. Se um sinal DTR surgir lá e uma sequência principal de bytes for transmitida, o microcontrolador será recarregado no carregador de inicialização. Olhe
para a função rxHook () .
Isso pode causar transtornos. Se o microcontrolador desligar e travar, ele não atenderá mais à porta. Portanto, ele não pode ouvir a sequência de teclas e reinicializar no carregador de inicialização. Em seguida, redefina apenas para ajudar.
Só isso. Espero que meu artigo explique como o gerenciador de inicialização funciona no STM32 e como fazer o download do firmware através de uma porta USB. Infelizmente, o limite de entrada ainda é alto, mas de repente meu artigo ajudará alguém a superá-lo.