Introducción



¿Qué es un BootLoader?

Un BootLoader para Microcontroladores se puede definir como un programa residente en el Microcontrolador (en este caso un PIC) que facilita la carga de los programas del usuario.

El BootLoader hay que programarlo en el PIC de forma convencional a través de un programador externo como el ICD-U64, ICD3, PICkit 3, etc. Una vez programado el BootLoader la carga de los programas de usuario se hacen directamente a través de un canal de comunicación, este canal puede ser el puerto serie, paralelo o USB de nuestro ordenador, en este caso el archivo .HEX se transfiere al PIC a través de una pequeña aplicación de escritorio que hace de interfaz entre el PC y el firmware del Microcontrolador, pero también se suelen utilizar otros buses de comunicación como el bus CAM, SPI, I2C, etc.
Bootloader en el PIC
Mediante un bootloader podemos actualizar el programa o firmware de un PIC sin necesidad de utilizar un programador específico, a través de la conexión de un puerto del PC con un puerto del PIC (puerto serie RS232 o USB).
Para lograrlo, ademas de disponer de un software adecuado en el PC, se debe programar previamente al PIC cargándole un programa bootloader que permita por si mismo modificar la memoria de programa, manejar el flujo de información entre el PC y el PIC y finalmente lanzar la aplicación principal del PIC.

Siempre queda que es necesario programar el PIC la primera vez para cargar el bootloader mediante un programador hardware. Por tanto el bootloader es útil para actualizar el programa de aplicación del microcontrolador no para programar un PIC virgen o borrado.
 
Lógicamente el bootloader consume un cierto porcentaje de flash y RAM y no todos los PIC lo soportan. Hay que utilizar un modelo con suficiente memoria, donde el programa pueda modificarse a sí mismo y que cuente con puertos hardware serie RS232 o USB. El PIC16F84A no cumple con estos requisitos . Si lo hace, por ejemplo, el PIC16F876A o el PIC16F886, donde típicamente ocupa unos 256 bytes de memoria.

Bootloader y boostrap. Funcionamiento típico

Para evitar confusiones, a partir de ahora llamaremos bootloader al sistema de cargador de arranque en general y al programa en el PC en particular. Llamaremosboostrap al programa que implementa el cargador de arranque en el PIC.

Una vez programado el boostrap en el PIC, se trata de transferir o después actualizar, el programa de aplicación principal .hex desde el PC hasta el PIC, por ejemplo a través el puerto serie o el usb y así directamente el PIC se entiende con el PC sin necesidad de utilizar un programador específico.

En la mayoría de los tipos, el boostrap se carga al final de la memoria de programa, dejando libre lo anterior para el programa principal

El boostrap dirije el flujo de información según el estado en que se encuentra el PIC al inicio (esto es, tras un reset). Si al iniciarse el PIC están conectados PIC y PC y activo el bootloader del PC, estonces se graba el programa que entra en las primeras posiciones de la memoria de programa, del PIC sobreescribiendo lo que hubiese, por supuesto sin llegar a la posición donde está el boostrap. Después cede el control a la aplicación principal que funcionará normalmente. Si al inicio no se dan las condiciones anteriores, el boostrap, después de un tiempo (por ejemplo 0,2 segundos) lee el contenido de la memoria: si esta contiene un programa le cede el control y se ejecutará normalmente, si está vacía no hará nada.

En definitiva el bootloader es ideal para la programación in-circuit, sin tener que retirar el PIC de la aplicación ni complicarnos con la programación ICSP con programadores específicos.

ELABORACION DE UN BOOTLOADER PARA UN PIC



El trabajo de diseñar un BootLoader para Microcontroladores que cargue la aplicación de usuario a través de un puerto de comunicación del PC se puede dividir en dos apartados, por un lado está el diseño del propio BootLoader que tendremos que cargar en el Microcontrolador y por otro lado está el diseño de la aplicación de escritorio necesaria para poder enviarle el archivo .HEX al Bootloader.

En este ejemplo vamos a utilizar un BootLoader con conexión USB que utiliza la clase CDC (Communications Device Class) para comunicarse con el PC, esta clase se caracteriza por crear un puerto COMM virtual en el ordenador donde se conecta el dispositivo y no necesita la instalación de ningún driver en el Sistema Operativo para su funcionamiento (en Windows es necesario la instalación del archivo .INF).


La parte correspondiente al firmware del BootLoader de este blog está basado en el ejemplo EX_USB_BOOTLOADER,C que trae el compilador de CCS y que podemos encontrar en el directorio donde instalamos el compilador, si en la instalación dejamos la opción por defecto ese directorio será C:\Archivos de programa\PICC\Examples.


El principio de funcionamiento en que se basa un BootLoader para saber si debe de cargar una nueva aplicación de usuario o ejecutar la que en ese momento se encuentre en la memoria flash del PIC es la siguiente: después de un reset en el PIC el BootLoader espera la llegada de un evento que determine qué acción ejecutar, ese evento puede ser provocado por Hardware (por ejemplo el cambio de estado en un determinado PIN del PIC) o por Software (la llegada de un determinado comando por un canal de comunicación como la USART del PIC).


En este ejemplo utilizaremos la detección de un evento Hardware que consiste en chequear el estado de la patilla RD0 del PIC, si está a nivel bajo el BootLoader procederá a cargar una nueva aplicación de usuario en la memoria ROM del PIC, si RD0 es diferente de cero (Nivel Alto) se ejecutará la aplicación de usuario que en ese momento tenga cargado el PIC.


En la figura de abajo se muestra un diagrama de estados de este escenario:



Como hemos comentado antes el firmware del BotLoader se puede programar para que utilice los registros de la parte alta o baja de la memoria flash del PIC, nosotros utilizaremos la parte baja de la memoria ROM para ubicar allí nuestro BootLoader y nos ahorraremos el tener que re-direccionar los vectores de interrupción.


En realidad el trabajo en cuanto a programación se refiere de hacer esto se reduce bastante si nos ayudamos del Wizard que incorpora CCS. Según se muestra en la figura de abajo con un solo clic de ratón seleccionamos el lugar donde queremos ubicar el Bootloader y el asistente se encargará de generar el código necesario. Para ello genera un archivo que se llamará: Nombre_del_Proyecto_bootloader.h incluyendo todo lo necesario para que el BootLoader trabaje en la parte alta o baja de la memoria ROM según hayamos elegido.










Una imagen más detallada de como quedaría mapeada la memoria ROM del PIC la tenemos en la figura de abajo. En ella se puede ver como el vector de reset ahora apunta al comienzo del programa del BootLoader, este determinará según sea el estado de RD0 si debe ejecutar la aplicación de usuario (RD0=1) guardada en memoria o cargar una nueva aplicación de usuario (RD0=0).