Bootloader



1. Introducción:

 Una característica de algunos microcontroladores, es su capacidad de autograbar la memoria de programa. Esta ventaja nos permite usar un Bootloader para realizar la carga del programa sin necesidad de usar un programador.

 Al poder actualizar el programa usando el puerto USB, nos hará más cómodo el trabajo.


2. Bootloader USB:

 El bootloader es un pequeño programa que se ejecuta nada más iniciar el sistema, o realizando alguna secuencia, que permite grabar el programa principal sin necesidad de usar un programador.

 Podemos usar varios interfaces para comunicarnos con el bootloader, como un puerto uart o USB. Un bootloader basado en comunicación uart, será mucho más ligero y sencillo que un bootloader USB.


3. Herramientas necesarias:


 Nota:  Para compilar el bootloader debemos tener las optimizaciones activadas y para esto es necesario tener la licencia PRO. Al instalar el compilador, podemos registrarnos y se nos habilita temporalmente este modo.


4. Observaciones:

  Lo primero es abrir el fichero “Readme Usage Notes for Bootloader with XC8.txt” que está en "\Mla\v2016_11_07\apps\usb\device\bootloaders\firmware\pic18_non_j". Este fichero nos indica:


Hay dos formas de trabajar:  Para hacer esto segundo, sólo tenemos que añadir el hex del bootloader en la carpeta “Loadables” de la aplicación. Al compilar, se creará un único fichero .hex


5. Empezamos:

  Lo más sencillo es abrir el proyecto de ejemplo que nos proporciona Microchip. Desde el MplabX abrimos el proyecto "pic18f4550.X" en el directorio: "\Mla\v2016_11_07\apps\usb\device\bootloaders\firmware\pic18_non_j"


5.1. Definir los vectores de reset e interrupción:

 Al usar el proyecto proporcionado de ejemplo para el PIC18F4550, los vectores de interrupción y reset ya están apuntando a la dirección correcta.
 La función de estos punteros, es indicar la dirección de memoria dónde se encuentra la aplicación ya que hay que reservar una parte para el bootloader:


5.1.1. Modificando la dirección de reset:

  Esto lo hacemos sobre el fichero "BootPIC18NonJ.h":


5.1.2. Modificando la dirección de interrupción:

  Esto lo hacemos sobre el fichero "VectorRemap.asm":



5.2. Configurar el cristal:

  En el fichero "main.c", configuraremos el cristal. En mi caso tengo uno de 16MHz, pero para que el usb funcione, debemos conseguir 48MHz internos usando los preescaler.

En esta imagen hay un ejemplo utilizando un cristal de 20MHz. Se puede observar, que después del primer preescaler, hay un cuadro que pone “96MHz PLL” y para conseguir esta frecuencia, debemos darle 4MHz en la entrada. En la imagen se consigue, dividiendo 20MHz entre 5.

  Con nuestro cristal, debemos dividir 16MHz entre 4.



5.3. Indicando led y pulsador:

 Esto lo hacemos sobre el fichero "HardwareProfile.h":

 Normalmente, con resetear el microcontrolador no provoca la activación del bootloader, se suele asociar un pulsador para entar y un led para indicar el estado. Esta sería la secuencia:

 En mi caso defino el led 1 que corresponde con el pin RD7 y el pulsador k4 que corresponde con el pin RB3.




6. Seleccionando el programador:





7. Compilar y cargar el bootloader:

  Conectamos la placa al programador y pulsamos en "Cargar":


 Podemos indicar si queremos que el propio programador alimente el Pic; nosotros no lo seleccionamos ya que alimentamos desde el USB:


  Esto es lo que saca si todo va bien:

Nota: Para compilar correctamente el bootloader, debemos tener activadas las optimizaciones de código; es decir, tener una licencia PRO. También nos sirve hacerlo durante el tiempo de evaluación.


8. Ya tenemos el bootloader cargado:

  Para comprobar que el bootloader está cargado, usaremos la aplicación de carga que nos proporciona Microchip. Conectamos la placa por USB y arrancamos la aplicación:

Nota: La primera vez entra en modo bootloader sin realizar la secuencia porque no tiene un programa en memoria. Una vez cargado el primer programa, debemos realizar la secuencia para activar de nuevo el bootloader.


 9. Creando el primer programa para cargar:

Creamos el siguiente código:

  Una vez lo tengamos, pulsamos con el botón derecho del ratón sobre el proyecto y debemos configurar el campo “codeoffset”. Aquí indicaremos que el programa a cargar debe dejar libre la ubicación del booltloader:

Construimos para generar el .hex:

 Una vez haya compilado sin errores, se crea un fichero.hex en el siguiente directorio del proyecto:

 Ahora ejecutamos la aplicación de carga "HID Bootloader" que se encuentra en la ruta de instalación de las MLA: "C:\Program Files (x86)\Microchip\Mla\v2016_11_07\apps\usb\device\bootloaders\utilities\bin\win"

 Nota: Para habilitar el modo bootloader, en esta placa no me funciona pulsando el reset (tengo que revisarlo).
 Entonces para entrar, pulso K4, cambio el interruptor S1 de posición (que selecciona alimentación desde el usb o desde el conector externo) y como no tengo una fuente en el conector externo, se apaga.
 Lo devuelvo a su posición y suelto K4.

Empieza a parpadear el led L7 y la aplicación de carga reconoce la placa:

 El fichero .hex se encuentra en el directorio del proyecto: "\LedBlink.X\dist\default\production". Abrimos y pulsamos sobre el icono resaltado:

Nos devuelve lo siguiente:

Sólo nos queda pulsar el botón de reset para que se active la nueva programación.

Nota: Hay aplicaciones que nos permiten leer la memoria del uControlador. Al leerla, veremos que se cumple lo anterior.
 En la primera parte tendremos el bootloader que tendrá como máximo desde la dirección 0x0000 hasta la 0x0FFF.
 Luego desde la 0x1000 hasta el final, se reserva para nuestra aplicación. Una curiosidad, es que vemos que nuestro código ocupa desde el final de memoria hacia la 0x1000.


- Bootloader funcionando:



 10. Descargas:

www.microedu.es

Si chove, non orballa!