Como usar o SPM para carregar aplicativos da EEPROM – (Parte 34/46)

Cómo utilizar SPM para cargar aplicaciones desde EEPROM – (Parte 34/46)

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. En este proyecto específico, se demuestra el funcionamiento de un código Boot-Loader usando SPM reescribiendo la memoria flash con el código binario que ya ha sido flasheado en la EEPROM integrada del ATMEGA16. El hardware utilizado en este proyecto incluye ATMEGA16 como microcontrolador, USBASP como programador y el software utilizado es AVR STUDIO 4 como IDE y AVR-BURNO-MAT como software de grabació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.

Configurando o SPM para carregar o aplicativo da EEPROM no protótipo AVR

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. . A continuación se muestran las API importantes disponibles en el archivo de encabezado que ayudan en SPM.

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. . A continuación se muestran las API importantes disponibles en el archivo de encabezado que ayudan a acceder a la memoria EEPROM.

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.

Diagrama de blocos de PageErase na função SPM

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.

Diagrama de blocos carregando buffer temporário para SPM do AVR

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)

Diagrama de blocos de gravação de página na memória flash

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.

LED piscando usando a função SPM do circuito AVR na placa de ensaio

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
#incluir
#incluir #incluir #incluir #incluir #incluir #incluir #incluir int principal (nulo) { uint16_ti; uint8_tA(300); registro uint8_t; página uint32_t = 0; carácter sin firmar *buf = A; uint16_tw; volátil int j = 2; DDRD = 0x80; para (yo = 0; yo <3; yo++) { PUERTO &= 0x7F; _delay_ms(500); PUERTO = 0x80; _delay_ms(500); } para (yo = 0; yo <300; yo++) A (i) = eeprom_read_byte ((const uint8_t *) i); mientras(1) { //================================================== ========= == ========================================= ====// si(j) { //Desactiva las interrupciones. reg = SREG; cli; eeprom_busy_wait; boot_page_erase (página); boot_spm_busy_wait; //Espera hasta que se borre la memoria. para (l = 0; l

{ //Configura la palabra little-endian. w = *buf++; w += (*buf++) << 8; boot_page_fill(página + i, w); } boot_page_write (página); // Almacenar el búfer en la página flash. boot_spm_busy_wait; //Espera hasta que se escriba la memoria. boot_rww_enable; SREG = sreg; } otro { asm("jmp 0x0000"); } j--; página = página + 128; //================================================== ========= == ========================================= ====// } }

###

Código fuente del proyecto

###


 #definir F_CPU 8000000
#incluir #incluir int principal (nulo) { DDRD = 0x80; mientras(1) { PUERTO &= 0x7F; _delay_ms (2000); PUERTO = 0x80; _delay_ms (2000); } }

###

Diagramas de circuito

Diagrama de circuito de cómo usar SPM para cargar aplicaciones desde EEPROM

Vídeo del proyecto

¿Preguntas relacionadas con este artículo?
👉 Pregunte y discuta en los foros EDAboard.com y Electro-Tech-Online.com.

¡¡Dinos qué piensas!! Cancelar respuesta

Conteúdo Relacionado

O novo VIPerGaN50 da STMicroelectronics simplifica a construção de...
Você pode estar se perguntando por que Portas NAND...
Você provavelmente já se deparou com o termo 'E...
En cada vehículo hay una red de sensores integrada...
El controlador del motor es uno de los componentes...
ESP32-CAM es un módulo de cámara compacto que combina...
La evolución de los estándares USB ha sido fundamental...
SCHURTER anuncia una mejora de su popular serie SWZ...
Visual Communications Company (VCC) ha anunciado sus nuevos tubos...
A Sealevel Systems anuncia o lançamento da Interface Serial...
A STMicroelectronics introduziu Diodos retificadores Schottky de trincheira de...
Determinar uma localização precisa é necessário em várias indústrias...
A Samsung Electronics, fornecedora de tecnologia de memória avançada,...
O mercado embarcado tem uma necessidade de soluções de...
Se você é um Diagrama do circuito da porta...
Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.