En cualquier microcontrolador, Boot-Loader es el primer código ejecutado antes del código de la aplicación. La función principal del Boot-Loader es cargar el código de la aplicación en la memoria flash del microcontrolador y ejecutarlo. En el modo de autoprogramación (SPM) del microcontrolador AVR ayuda al cargador de arranque a cargar una aplicación específica desde donde se almacena el binario de la aplicación. El Boot-Loader puede recibir código binario de otros chips de memoria, tarjetas SD o mediante el puerto serie del microcontrolador en caso de programación serie.
Luego, con la ayuda del SPM, el microcontrolador escribe el código binario en la sección flash de la aplicación.
La sección BLS se utiliza normalmente para almacenar el código del gestor de arranque del microcontrolador. El código Boot-Loader se puede utilizar para inicializar los periféricos en el microcontrolador, inicializar los dispositivos conectados al microcontrolador, seleccionar la aplicación para cargar y ejecutar desde un medio de almacenamiento, cargar la aplicación seleccionada en la sección de aplicaciones, saltar a la sección de aplicaciones y ejecutar la aplicación. El código que se ejecuta en la sección BLS se puede ejecutar en modos de modo de autoprogramación (SPM) que están bloqueados para el código que se ejecuta en la sección Aplicación. Usando las instrucciones SPM, el código BLS puede reescribir el código en la sección de la aplicación o el código en el propio BLS.
Fig. 2: Diagrama de bloques de la función SPM con BLS en el AVR
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 3: API importantes para la función AVR SPM
Con las API anteriores, se puede escribir código para SPM en un microcontrolador AVR, siempre que el código siga ciertos pasos en orden.
· Paso: 1 Elimina la página flash que estás a punto de escribir
{W · Paso:2 Almacene los archivos binarios en un búfer temporal antes de escribir en una página flash
{W} · Paso:3 Programe el buffer temporal llenado en la página flash ya borrada
Los tres pasos anteriores se explican en detalle en un artículo anterior del proyecto sobre AVR SPM. En este proyecto en particular, los datos necesarios para llenar el búfer de página temporal, como se analiza en el paso: 2, se toman de la EEPROM integrada del microcontrolador AVR, donde ya se ha ingresado un código simple. La EEPROM interna del microcontrolador AVR tiene una capacidad de 512 bytes. Se puede leer y escribir fácilmente con la ayuda de las API disponibles en el archivo de encabezado.
FUNCIÓN |
DESCRIPCIÓN |
vacío eeprom_is_ready (vacío) |
Devuelve 1 si la EEPROM está lista para una nueva operación de lectura/escritura, 0 en caso contrario. |
void eeprom_read_block (void *dst, const void *src, size_t n) |
Devuelve un bloque de n bytes desde la dirección EEPROM src a SRAM dst |
uint8_t eeprom_read_byte (const uint8_t *p) |
Devuelve un byte de la dirección EEPROM a la que hace referencia el puntero p |
uint32_t eeprom_read_dword (const uint32_t *p) |
Leer un doble de 32 bits de la dirección EEPROM a la que hace referencia el puntero p |
flotador eeprom_read_float (const flotador *p) |
Devuelve un valor flotante de la EEPROM al que hace referencia el puntero p |
uint16_t eeprom_read_word (const uint16_t *p) |
Leer una palabra de 16 bits de la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_update_block (const void *src, void *dst, size_t n) |
Actualice un bloque de n bytes a la dirección EEPROM dst de src |
void eeprom_update_byte (uint8_t *p, valor uint8_t) |
Actualizar un valor de byte a la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_update_dword (uint32_t *p, valor uint32_t) |
Actualice un valor de palabra doble de 32 bits a la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_update_float (flotante *p, valor flotante) |
Actualizar un valor flotante a la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_update_word (uint16_t *p, valor uint16_t) |
Actualizar un valor de palabra a la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_write_block (const void *src, void *dst, size_t n) |
Escriba un bloque de n bytes en la dirección EEPROM dst de src. |
void eeprom_write_byte (uint8_t *p, valor uint8_t) |
Escriba un valor de byte en la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_write_dword (uint32_t *p, valor uint32_t) |
Escriba un valor de palabra doble de 32 bits en la dirección EEPROM a la que hace referencia el puntero p |
void eeprom_write_float (flotante *p, valor flotante) |
Escriba un valor flotante en la EEPROM a la que hace referencia el puntero p |
void eeprom_write_word (uint16_t *p, valor uint16_t) |
Escriba un valor de palabra en la EEPROM a la que hace referencia el puntero p |
Figura 4: API para acceder a la memoria EEPROM
Los datos para llenar el búfer temporal como se analiza en el paso: 2 se leen desde la memoria EEPROM integrada del microcontrolador AVR usando la función de biblioteca;
uint8_t eeprom_read_byte (const uint8_t *p)
La función anterior puede devolver el byte de datos almacenado en la dirección EEPROM a la que hace referencia el argumento del puntero. El código está escrito de modo que el puntero primero apunte a la ubicación 0 de la EEPROM y luego incremente la dirección a medida que lee cada byte para almacenarlo en el búfer temporal. Así, a continuación se representan gráficamente los pasos con los cuales se lee el código binario de la memoria EEPROM y se flashea en la memoria flash;
Paso: 1 Elimina la página flash que estás a punto de escribir
El primer paso es borrar la página flash que está a punto de escribirse con los nuevos valores. La API que ayuda a ejecutar este paso es;
Boot_page_erase (dirección)
Esta API puede eliminar una página completa en flash a la que se dirige el parámetro. En el código, la dirección de la página borrada es 256. La siguiente imagen muestra el estado del búfer de página temporal y la memoria flash en el paso 1. El búfer de página temporal es un búfer en el que se puede almacenar una página completa antes de que se muestre. una página en la memoria flash.
Fig. 5: Diagrama de bloques de PageErase en la función SPM
Paso: 2 Almacene los valores en un búfer temporal antes de escribir en una página flash
Este es el segundo paso en el que debe almacenar el binario requerido en un búfer temporal antes de escribir en cualquier página de memoria flash. La API que se puede utilizar para este fin es;
boot_page_fill (dirección, datos)
Esta API llena el búfer de página temporal del Boot-Loader byte a byte antes de actualizar los datos en el búfer de página temporal en una página como tal. Los datos del parámetro representan cada byte en el búfer y la dirección del parámetro representa la dirección de la página + desplazamiento de la ubicación del búfer donde se debe almacenar el byte de datos. Los datos de los parámetros en la API boot_page_fill (dirección, datos) en realidad se leen desde la primera ubicación de la memoria EEPROM con la ayuda de una API que está disponible en el archivo de encabezado.
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. |
Fig. 6: Diagrama de bloques cargando el buffer temporal para AVR SPM
Paso:3 Programe el buffer temporal llenado en la página flash ya borrada
Este es el paso final en el que el búfer temporal lleno se actualiza utilizando una API en la página ya borrada de la memoria flash. La API que ayuda en este paso es;
boot_page_write (dirección)
Fig. 7: Diagrama de bloques de escritura de página en memoria flash
El código de este proyecto que fue escrito para BLS puede copiar 300 bytes de la memoria EEPROM al búfer temporal comenzando en la dirección 0x00. Luego, estos bytes se transfieren a la página de la memoria flash comenzando en la dirección 0x0000. Después de hacer esto, el código BLS saltará a la dirección 0x0000 para que el binario reescrito pueda ejecutarse a continuación. Con este código del cargador de arranque, cualquier programa actualizado en la EEPROM se reescribirá en la sección Flash de la aplicación AVR y se ejecutará. Se puede escribir una aplicación de prueba de LED parpadeante simple en la memoria EEPROM comenzando a probar la operación.b Actualice primero el código BLS y luego el código de aplicación de LED en la memoria EEPROM siguiendo los pasos explicados en el proyecto anterior sobre el LED parpadeante BLS del AVR . Cuando el LED parpadea, significa que el código se ha cargado desde una sección de la memoria EEPROM a la memoria flash y se está ejecutando. Con esto, el código en el BLS puede cargar cualquier aplicación que esté programada en la EEPROM al reiniciar y por lo tanto actúa como un Boot-Load.
Fig. 8: LED parpadeando usando la función SPM del circuito AVR en la placa de pruebas
Código fuente del proyecto
###
#definir F_CPU 8000000
###
Código fuente del proyecto
###
#definir F_CPU 8000000
###
Diagramas de circuito
Diagrama de circuito de cómo usar SPM para cargar aplicaciones desde EEPROM |
¿Preguntas relacionadas con este artículo?
Pregunte y discuta en los foros EDAboard.com y Electro-Tech-Online.com.
¡¡Dinos qué piensas!! Cancelar respuesta
Debes iniciar sesión para publicar un comentario.