Quando carrego um novo esboço no meu Arduino Uno usando o carregador de inicialização Optiboot, o que realmente acontece?
- O que é enviado para o Arduino?
- Como ele responde?
- O que significa "não sincronizado"?
- O que está "sincronizado"?
Nota: Isto é pretendido como uma "pergunta de referência" .
arduino-uno
bootloader
Nick Gammon
fonte
fonte
Respostas:
Quando você redefine um Uno executando o carregador Optiboot, o carregador de inicialização primeiro pisca o pino 13 três vezes.
A linha superior (cinza) é enviada ao Arduino, a linha do meio (laranja) é enviada a partir do Arduino.
Enquanto isso está acontecendo, o programa
avrdude
em execução no seu computador está enviando uma consulta ao dispositivo:O Arduino não percebe o primeiro "get sync" porque está ocupado piscando o pino 13. Depois de concluído, ele percebe o "get sync" (seria armazenado em buffer pelo hardware serial) e responde:
Parece que o avrdude ficou um pouco impaciente e atingiu o tempo limite, porque tenta novamente com a consulta "obter sincronização". Desta vez, a Optiboot responde imediatamente.
O restante do upload é descrito na próxima imagem. Exemplo produzido ao fazer o upload do programa "Blink".
(Clique na imagem acima para uma versão maior)
Os passos são:
Defina os parâmetros do dispositivo. Os seguintes parâmetros do dispositivo são enviados para o chip:
O Optiboot ignora todos esses e responde com In Sync / OK. :)
Defina os parâmetros estendidos do dispositivo:
O Optiboot ignora todos eles e responde com In Sync / OK.
Entre no modo de programa. Resposta: Em Sincronização / OK.
Leia a assinatura. Optiboot responde
0x1E 0x95 0x0F
sem realmente ler a assinatura .Escreva fusíveis (quatro vezes). Optiboot não escreve o fusível, mas apenas responde em Sincronização / OK.
Endereço de carga (inicialmente 0x0000). O endereço está em palavras (ou seja, uma palavra tem dois bytes). Isso define o endereço para onde a próxima página de dados será gravada.
Página do programa (até 128 bytes são enviados). O Optiboot responde "In Sync" imediatamente. Depois, há uma pausa de cerca de 4 ms enquanto ele programa a página. Em seguida, ele responde "OK".
Endereço de carga (agora 0x0040). Este é o endereço 64 em decimal, ou seja. 128 bytes desde o início da memória do programa.
Outra página está escrita. Essa sequência continua até que todas as páginas sejam gravadas.
Carregar endereço (voltar para 0x0000). Isto é para verificar a gravação.
Página de leitura (até 128 bytes são lidos). Isto é para verificar. Observe que, mesmo que a verificação falhe, os dados incorretos já foram gravados no chip.
Saia do modo de programação.
O que significa "não sincronizado"?
Como você pode ver acima, a cada passo da sequência de programação o Arduino deve responder com "In Sync" (0x14), possivelmente seguido por alguns dados, seguido de "OK" (0x10).
Se "não estiver sincronizado", significa que o avrdude não obteve a resposta "sincronizada". Os possíveis motivos podem ser:
O que está "sincronizado"?
Como mencionado acima, a resposta "Em sincronização" significa que o Arduino (carregador de inicialização) está sincronizado com o programa de upload.
Qual protocolo está sendo usado?
O protocolo é o protocolo STK500, conforme documentado pela Atmel. Veja as referências abaixo.
Referências
Nota : O STK500 Versão 2 não é usado no Optiboot, mas é incluído para obter informações, caso você esteja usando placas como o Mega2560.
Constantes do STK500
fonte
avrdude
o comportamento de verificação padrão é um carregador de inicialização que suporta a leitura do conteúdo do flash.