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
 
              