BootLoader es un código que se ejecuta cuando se enciende o reinicia un microcontrolador. Básicamente, define un entorno para ejecutar el código de la aplicación. Es el Boot-Loader el que configura el hardware y carga el código de la aplicación desde cualquier medio de almacenamiento o recibido a través de comunicación externa y permite que la aplicación se ejecute. Por tanto, un Boot-Loader debe realizar la siguiente función básica: Inicialice los periféricos del controlador,
Cualquier código ejecutado desde BLS puede utilizar el modo de autoprogramación (SPM). Al utilizar la función SPM, un código de la sección BLS puede leer o escribir toda la memoria flash, incluida la sección BLS desde donde se ejecuta el código. Esta característica se puede utilizar para cargar cualquier código binario de aplicación en la memoria flash y dejarlo ejecutar. Inicialización requerida de los periféricos del controlador como USART, bits de puerto, etc. e inicialización de dispositivos externos como LCD, etc. Se puede hacer desde el propio BLS antes de cargar el código de la aplicación.
La memoria flash del AVR se divide en dos secciones: la sección Aplicaciones y la sección Cargador de arranque (BLS). En el caso de ATMEGA16 dispone de 16 KB de memoria flash de los cuales 15 KB son sección de aplicaciones y el 1 KB restante es BLS. La arquitectura de memoria de ATMEGA16 se muestra en la siguiente figura;
Fig. 2: Arquitectura de memoria flash ATMEGA16
El código para BLS y la sección de aplicación se pueden escribir normalmente y no hay mucha diferencia. Lo único con lo que hay que tener cuidado es con el tamaño del código binario. No debe tener más de 1 KB, de lo contrario no será posible programar código en BLS. El proyecto sobre codificación AVR BLS analiza cómo programar un código simple en el BLS del microcontrolador ATMEGA16 con la ayuda de AVR Studio como IDE, USBasp como programador y AVR-Burnomat como software de grabación.
En este proyecto en particular, el Boot-Loader está codificado para realizar la inicialización UART junto con una simple inicialización del pin LEAD y también una inicialización de hardware externo desde la pantalla LCD de 4 bits . Por lo tanto, los códigos de aplicación no requieren estos códigos, aún funcionan porque antes de ejecutar los códigos de aplicación, el cargador de arranque ejecutará las funciones de inicialización.
El código BLS tiene funciones de inicialización que no deberían estar presentes en los códigos de aplicación. Las funciones de inicialización utilizadas en el código Boot-Loader para este proyecto se detallan a continuación;
Función |
Descripción |
vacío lcd_init (vacío) |
Inicialice la pantalla LCD en modo de 4 bits |
usert_init vacío (nulo) |
Inicialice el usuario a una velocidad de baudios de 9600 con transmisión y recepción habilitadas |
DDRD = 0x80; |
Inicialización del pin LED como salida |
Fig.3: Funciones de arranque utilizadas Código del cargador de arranque AVR
Cualquier código de aplicación puede usar directamente las siguientes llamadas a funciones para acceder a USART, LCD y LED sin inicializar sus funciones en ninguna parte del código.
Función |
Descripción |
lcd_claro |
Limpiar la pantalla LCD |
cadena_lcd |
Mostrar una cadena en la pantalla LCD |
cadena_envío_usuario |
Enviar una cadena a través de usuario |
PUERTO &= 0x7F; |
Enciende el LED |
PUERTO = 0x80; |
Apague el LED |
Fig. 4: Llamadas a funciones utilizadas por el código de la aplicación para acceder a los periféricos del AVR
La inicialización del hardware antes de ejecutar el código de la aplicación se explica en detalle en un proyecto. en Inicialización del hardware AVR BLS.
La función principal del Boot-Loader es cargar código en formato binario desde un medio de almacenamiento o que pueda recibirse a través de comunicación externa con otros dispositivos a la memoria flash. El recurso SPM disponible para el código que se ejecuta en BLS ayuda a cargar el código binario de la aplicación en la memoria flash. La tarea de escribir código BLS con SPM se ha simplificado gracias a las API disponibles en el archivo de encabezado.
FUNCIÓN |
DESCRIPCIÓN |
PARÁMETRO |
boot_page_erase (dirección) |
Eliminar la página flash a la que hace referencia la dirección |
Una dirección de byte en flash |
boot_page_fill (dirección, datos) |
Llene el búfer de página temporal de Boot-Loader para la dirección flash con palabra de datos |
La dirección es una dirección de bytes. Los datos son una palabra. |
boot_page_write (dirección) |
Escriba el búfer de la página temporal del Boot-Loader en la página flash que contiene la dirección |
Dirección de bytes flash |
Figura 5: API importantes en AVR
Los pasos necesarios para realizar SPM en la memoria flash de la aplicación se explican en un proyecto sobre el uso de SPM en la programación flash a flash de AVR.
En este proyecto en particular, el Boot-Loader está codificado de tal manera que intentará cargar cualquier código binario de aplicación que haya sido cargado en la EEPROM interna incorporada del microcontrolador AVR. Las API disponibles en
La API proporcionada por
uint8_t eeprom_read_byte (const uint8_t *p)
FUNCIÓN |
DESCRIPCIÓN |
PARÁMETRO |
uint8_t eeprom_read_byte (const uint8_t *p) |
La función devuelve un byte de datos que se almacena en la dirección EEPROM a la que hace referencia el puntero p |
El puntero se refiere a la dirección EEPROM desde la cual se debe leer el byte de datos. |
Figura 6: API
Con la ayuda de las API analizadas anteriormente
{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} Paso: 1 Elimine la página flash que está a punto de escribir
{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} Paso: 2 Almacene el código binario que se lee desde EEPROM en un búfer temporal antes de escribir en una 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} Paso: 3 Programar el búfer temporal lleno en la página flash ya eliminada
Después de realizar los tres pasos anteriores, el cargador de arranque puede saltar usando la instrucción
asm(“jmp 0x0000”);
a la sección del código de la aplicación y deje que se ejecute la aplicación recién programada.
Primero actualice el código del cargador de arranque al BLS y cualquier código de aplicación de tamaño pequeño a la memoria EEPROM siguiendo los pasos explicados en el proyecto anterior sobre el LED parpadeante del AVR BLS . Una vez que se completa la programación de EEPROM y se reinicia el controlador, el cargador de arranque comenzará a ejecutarse. Se puede ver que está realizando funciones de inicialización y cargando la aplicación desde la EEPROM integrada.
Fig. 7: Escribir código BLS en el BLS del circuito AVR en la placa de pruebas
Fig. 9: Pantalla LCD inicializada por código BLS en configuración AVR en placa
Fig. 10: USART inicializado con velocidad de baudios 9600 mediante BLS de configuración AVR en la placa
Código fuente del proyecto
###
#definir F_CPU 8000000
#definir _LCD_H #ifndef F_CPU #definir F_CPU 8000000 #endif #incluir
###
Código fuente del proyecto
###
#ifndef _USART_H
#definir rs PA0 #definir rw PA1 #definir en PA2 #incluir
###
Diagramas de circuito
Diagrama de circuito de cómo escribir un gestor de arranque simple para AVR en lenguaje C |
Componentes del proyecto
- ATmega16
- LCD
- CONDUJO
- Resistor