TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: remi04 en 04 de Octubre de 2018, 11:32:43
-
Hola. Tengo un proyecto funcionando con bootloader que yo mismo hice utilizando xtea de tiny. Permite que el usuario pueda actualizar firmware con un cable usb.
Todo perfecto hasta que se me ha presentado una causa que me exige cambiar el bootloader a todas las placas. Esto está basado en pic18f26k20.
Para solucionarlo os cuento como lo he hecho y ya a ver si alguien me aclara otras opciones más sencillas..
El bootloader tiene reservados desde la posición 0x0000 hasta la 0x0c7f. (Mucho) pero lo necesito, aunque ocupa algo menos, le dejé memori reservada por si pasaba esto de tener que modificarlo en un futuro y que ocupase más. El resto de la flash es para la app que arranca en vector 0xc80 con interrupt en 0x0c88.
Pues bien. Lo que he hecho es crear una app (programa) que se carga aquí, a partir del vector de arranque. El bootloader se inicia y salta a esta aplicación que lo que va a hacer es leer la flash a partir de la posición 0xf000, casi al final y luego copiar su contenido a partir de la posición 0 machacando el bootloader existente. A la misma vez, cada bloque de 64 bytes (erase_size) de mi pic una vez que es leído y copiado al principio de la flash lo que hago es verificar la copia y luego borrar ese bloque de la zona alta de la flash. Así sucesivamente con todos los bloques.
¿Por que leemos a partir de la 0xf000? Pues por que supone que de alguna manera ahí tendré grabado el bootloader nuevo. Será lo primero que compruebe la app, escaneara el primer bloque en busca de datos. Si los hay comienza la copia. Si está todo a FF se cancela todo. Así evito machacar el bootloader con valores FF, ya que eso dejaría la placa “brickeada” y entonces ya solo sería posible resucitar por icsp.
El marrón de todo no es esto, sino el cómo consigo que el bootloader cargue la aplicación en el vector de arranque Y ADEMÁS cargue todo el contenido del nuevo bootloader al final de la flash. Para que luego la app los lea y sobreescriba el bootloader.
Lo que he hecho es compilar el nuevo bootloader normal, editar el fichero *.hex y modificar a mano las posiciones de memoria a donde apunta cada línea. Pasando la 0x0000 a 0xf000. La 0x0001 a la 0xf001 y así sucesivamente. Elimino las líneas de los fuses (no me interesa modificarlos) y las de los datos de la eeprom (si los hubiere).
Ahora cojo el fichero *.hex de la aplicación la cual es compilada para que arranque en la posición 0x0c80. Lo edito y al final del hex, justo antes de la línea :00000001FF (fin de fichero) pues pego todo lo del bootloader nuevo.
Así obtengo un solo HEX que lo contiene todo.
Eso lo cargo con mi actual bootloader y.... Bingo.... todo funciona a la perfección.
La pregunta es: ¿ se puede de forma más fácil que andar editando los HEX copiando y pegando trozos de unos a otros?? Vamos, lo que se llama un hex franskestein xd xd...
-
1º Modificas bootloader y lo compilas para su posición natural, la posición 0x0000
2º Copias el HEX generado en una tabla de datos de un programa nuevo (puedes hacerlo en automático con una pequeña macro de Python)
Este programa leerá los datos de la tabla y los escribirá en la posición del bootloader (0x0000 en adelante)
3º Envias el programa al micro y cuando se ejecute, actualizará el bootloader
-
Vale, lo que tú dices sería por ejemplo, si el hex tiene por ejemplo 30 líneas de 43 caracteres cada una crearía una tabla de 30 objetos de 43 bytes y colocar las líneas como caracteres ascii. Luego en la función de volcado ir tirándoles atoi ‘s...
¿ a eso te refieres??
Hombre, de ser así facilita algunas cosas, pero es imperativo lo de la macro más que nada por que como tengas que ir entrecomillando línea a línea hay faena.
-
El programa seria simple. Solo hay que convertir el código hexadecimal del .hex en una serie de bytes 0x00, 0xA8, etc. dentro de un array tipo char.
-
https://pypi.org/project/hexformat/
Esa libreria permite leer el hex en python.
Luego, generar la tabla de datos en c es sencillo.
PD: mejor esta librería
https://pypi.org/project/IntelHex/
-
Por fin tengo un rato. Te respondo en el foro Python:
https://www.todopic.com.ar/foros/index.php?topic=49068
-
Muchísimas gracias Picuino. Mañana mismo me pongo a implementarlo a ver que tal....
-
¿Funcionó?
-
¿Funcionó?
Hola Picuino. Perfectamente, tuve que pelearme un poco con Pyton por que tenía una instalación antigua que no iba por migrar el sistema a otro pc.
De todas formas al final me hice una aplicación para la consola en c++ que ya se encarga de cargar toda la memoria entera del pic.
Muchas gracias.