O BootLoader é um código que é executado quando um microcontrolador é ligado ou reiniciado. Basicamente, ele define um ambiente para a execução do código do aplicativo. É o Boot-Loader que configura o hardware e carrega o código da aplicação de qualquer meio de armazenamento ou recebido através de comunicação externa e deixa a aplicação executar. Assim, um Boot-Loader deve executar a seguinte função básica: Inicialize os periféricos do controlador,
Qualquer código executado a partir do BLS pode usar o modo de autoprogramação (SPM). Usando o recurso SPM, um código da seção BLS pode ler ou gravar toda a memória flash, incluindo a seção BLS de onde o código está sendo executado. Este recurso pode ser usado para carregar qualquer código binário de aplicativo na memória flash e deixá-lo executar. A inicialização necessária dos periféricos do controlador como USART, bits de porta etc. e a inicialização dos dispositivos externos como LCD etc. pode ser feita a partir do próprio BLS antes de carregar o código da aplicação.
A memória flash AVR é dividida em duas seções: a seção de aplicativos e a seção Boot-Loader (BLS). No caso do ATMEGA16 possui 16 KB de memória flash dos quais 15 KB são seção de aplicação e os 1 KB restantes são BLS. A arquitetura de memória do ATMEGA16 é mostrada na figura a seguir;
Fig. 2: Arquitetura de memória Flash do ATMEGA16
O código para o BLS e a seção do aplicativo pode ser escrito normalmente e não há muita diferença. A única coisa a ter cuidado é o tamanho do código binário. Não deve ter mais de 1 KB, caso contrário não será possível codificar programado no BLS. O projeto sobre codificação AVR BLS discute como programar um código simples no BLS do microcontrolador ATMEGA16 com a ajuda do estúdio AVR como IDE, USBasp como programador e AVR-Burnomat como software gravador.
Neste projeto específico, o Boot-Loader é codificado para executar UART inicialização junto com um simples LIDERADO inicialização do pino e também uma inicialização de hardware externo do 4 bits LCD. Portanto os códigos da aplicação não requerem esses códigos, ainda assim funcionam porque antes de executar os códigos da aplicação as funções de inicialização serão executadas pelo Boot-Loader.
O código BLS possui funções de inicialização que não deveriam estar presentes nos códigos de aplicação. As funções de inicialização usadas no código Boot-Loader para este projeto são fornecidas abaixo;
Função |
Descrição |
vazio lcd_init ( vazio ) |
Inicialize o LCD no modo de 4 bits |
vazio usart_init (void) |
Inicialize o usart em taxa de transmissão de 9600 com transmissão e recepção habilitadas |
DDRD = 0x80; |
Inicialização do pino LED como saída |
Fig.3: Funções de inicialização usadas código Boot-Loader do AVR
Qualquer código de aplicativo pode usar diretamente as seguintes chamadas de função para acessar USART, LCD e LED sem inicializar suas funções em qualquer lugar do código.
Função |
Descrição |
lcd_clear |
Limpe o LCD |
lcd_string |
Exibir uma string no LCD |
usart_send_string |
Envie uma string via usart |
PORTD &= 0x7F; |
Ligue o LED |
PORTD = 0x80; |
DESLIGUE o LED |
Fig. 4: Chamadas de função usadas pelo código da aplicação para acessar periféricos no AVR
A inicialização do hardware antes de executar o código da aplicação é explicada detalhadamente em um projeto em Inicialização de hardware do AVR BLS.
A principal função do Boot-Loader é carregar um código em formato binário de meio de armazenamento ou que possa ser recebido através da comunicação externa com outros dispositivos para a memória flash. O recurso SPM disponível para o código em execução no BLS auxilia no carregamento de um código binário da aplicação na memória flash. A tarefa de escrever o código BLS com SPM foi simplificada pelas APIs disponíveis no arquivo de cabeçalho
FUNÇÃO |
DESCRIÇÃO |
PARÂMETRO |
boot_page_erase (endereço) |
Apague a página flash referida pelo endereço |
Um endereço de byte em flash |
boot_page_fill (endereço, dados) |
Preencha o buffer de página temporário do Boot-Loader para endereço flash com palavra de dados |
O endereço é um endereço de byte. Os dados são uma palavra |
boot_page_write (endereço) |
Grave o buffer de página temporário do Boot-Loader na página flash que contém o endereço |
Endereço de byte em flash |
Figura 5: APIs importantes no AVR
As etapas necessárias para fazer o SPM na memória flash da aplicação são explicadas em um projeto sobre o uso do SPM na programação flash para flash do AVR.
Neste projeto específico, o Boot-Loader é codificado de tal forma que tentará carregar qualquer código binário do aplicativo que tenha sido carregado na EEPROM interna integrada do microcontrolador AVR. As APIs disponíveis no
A API fornecida pelo
uint8_t eeprom_read_byte (const uint8_t *p)
FUNÇÃO |
DESCRIÇÃO |
PARÂMETRO |
uint8_t eeprom_read_byte (const uint8_t *p) |
A função retorna um byte de dados que é armazenado no endereço EEPROM referido pelo ponteiro p |
O ponteiro refere-se ao endereço EEPROM do qual o byte de dados precisa ser lido |
Figura 6: API
Com a ajuda das APIs discutidas acima de
{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}· {C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}Passo: 1 Apague a página flash que está prestes a escrever
{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}· {C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}Etapa: 2 Armazene o código binário que é lido da EEPROM em um buffer temporário antes de gravar em uma página flash
{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}· {C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}{C}Etapa: 3 Programe o buffer temporário preenchido na página flash já apagada
Depois de executar as três etapas acima, o Boot-Loader pode dar um salto usando a instrução
asm(“jmp 0x0000”);
para a seção de código do aplicativo e deixe o aplicativo recém-programado ser executado.
Atualize o código do Boot-Loader para o BLS primeiro, qualquer código de aplicativo de tamanho pequeno para a memória EEPROM usando as etapas explicadas no projeto anterior em LED piscando do BLS do AVR. Assim que a programação da EEPROM for concluída e o controlador for reiniciado, o Boot-Loader começará a ser executado. Pode-se observar que ele está executando as funções de inicialização e carregando o aplicativo a partir da EEPROM integrada.
Fig. 7: Gravando código BLS no BLS do circuito AVR na placa de ensaio
Fig. 9: Display LCD inicializado pelo código BLS na configuração do AVR na placa de ensaio
Fig. 10: USART inicializado com taxa de transmissão de 9600 pelo BLS da configuração do AVR na placa de ensaio
Código-fonte do projeto
###
#define F_CPU 8000000
#define _LCD_H #ifndef F_CPU #define F_CPU 8000000 #endif #include
###
Código-fonte do projeto
###
#ifndef _USART_H
#define rs PA0 #define rw PA1 #define en PA2 #include
###
Diagramas de circuito
Diagrama de circuito de como escrever um carregador de inicialização simples para AVR em linguagem C |
Componentes do Projeto
- ATmega16
- LCD
- LIDERADO
- Resistor