Bootloader-module-00-bc6bfc15

La App Makers

Normalmente, al trabajar con microcontroladores, alguna vez hemos usado tarjetas de desarrollo que cuentan con el microcontrolador embedido, es decir, que se encuentra soldado o incrustado en el circuito. En otras situaciones es posible que tengamos que comprar un programador externo que pueda establecer una comunicación directa entre la PC y el microcontrolador que deseamos programar.

Fig 1 De izquiera a derecha: Programador PICkit 3, programador genérico PIC, programador AVR USBASP ISP.

Este tipo de programadores, sin importar marcas o arquitecturas del microcontrolador a programar tienen en común el tipo de comunicación paralela, es decir, los bits de información se envían al mismo tiempo a través de dos o más buses de información (un bus de información es el medio por el cuál se transmite una señal eléctrica).
 

Cuando tenemos una placa Arduino  y cargamos un programa en Arduino desde el USB con el IDE, estamos haciendo uso del bootloader, se trata de un pequeño programa que ha sido guardado previamente en el microcontrolador de la placa y que nos permite cargar código sin necesidad de hardware adicional. El bootloader solo está activo unos segundos cuando se resetea el Arduino y después comienza el sketch que está cargado en la flash de Arduino y que hemos programado y subido a la placa.

El bootloader se ejecuta cuando el microcontrolador se enciende o se pulsa el botón reset, durante un corto espacio de tiempo espera que le llegue por el puerto serie un nuevo sketch desde el IDE de Arduino (este distingue un sketch de otra cosa porque tiene un formato definido). Si llega un sketch, este es guardado en la memoria flash y ejecutado, en caso contrario ejecuta el sketch anteriormente cargado.

La mayoría de los Arduinos tienen la función autoreset que permite al IDE de Arduino subir el código sin tener que pulsar el botón de reset.

El bootloader hace que parpadee el pin 13 (led integrado en la placa) cuando se ejecuta.

La mayoría de los microcontroladores de AVR pueden reservar una zona de la memoria flash (entre 256B a 4 KB) para el bootloader. El programa bootloader reprograma el microcontrolador para guardar en la memoria flash el código binario a través de cualquier interface disponible.

El bootloader de Arduino está programado en la memoria flash del ATMega328p y ocupa 0,5 KB de los 32KB disponibles. Este bootloader viene precargado en la memoria flash del microcontrolador y es lo que diferencia el ATMega328p de Arduino de otro que viene de fábrica.

El Arduino UNO viene con el microcontrolador ATMega328p precargado con un bootloader que permite cargar nuevo código sin un programador. El bootloader se comunica usando el protocolo STK500.

El protocolo STK500 http://www.atmel.com/Images/doc2525.pdf es propio de Atmel. Es un protocolo serie y los programadores emulan este protocolo sobre un puerto serie virtual en un USB. Originalmente STK500 fue un programador fabricado por Atmel y a raíz de ello liberaron el protocolo STK500.

En este enlace es posible obtener el código en C del protocolo STK500: http://www.atmel.com/dyn/resources/prod_documents/avr061.zip

Arduino decidió usar avrdude y STK500 serial bootloader para programar o cargar nuevos programas en Arduino sin necesidad de HW adicional. El bootloader de Arduino es esencialmente el bootloader STK500 de Atmel.

Las MCUs AVR de 8bits ATMega con interfaz USB integrado como son el ATmega16U2 y ATmega8U2, vienen de fábrica un USB bootloader en la sección de arranque de la flash. Este bootloader USB permite hacer In-System programming desde USB host controller sin la necesidad de un HW externo. En este documento se describe las funcionalidades del USB bootloader: http://www.atmel.com/Images/doc7618.pdf

El puerto serie durante el proceso de bootloader funciona a 19200 baudios.

El bootloader estándar de Arduino usa el protocolo STK500 versión 2 y por ese motivo es el valor que usamos en el IDE de Arduino.

Los comandos para “quemar” el bootloader en Arduino usan una herramienta open nsource llamada avrdude, de la que se hablará más tarde. Hay cuatro pasos a la hora de cargar el bootloader:

  • Desbloquear la sección de bootloader en el chip
  • Configurar los fuses en la MCU
  • Cargar el código del bootloader en el microcontrolador
  • Bloquear la sección del bootloader en la MCU

Todo esto es controlado por una serie de preferencia en el fichero de preferencias de Arduino: https://www.arduino.cc/en/Hacking/Preferences

Cuando el Boot Reset Fuse (BOOTRST) está configurado, el contador de programa en la memoria flash es inicializado a una dirección de memoria de un bloque en el extremo superior de la memoria (esto depende de como se hayan configurado los fuses, ver https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf para más información). El código que comienza no puede hacer nada, si realmente se quiere se podría poner su propio programa de allí si se utiliza un ICSP (los bootloaders por lo general no puede sobrescribirse a sí mismos).

El bootloader se trata de un programa especial y puede leer datos de una fuente externa como UART, I2C, CAN, etc… para reescribir el programa guardado en la memoria flash del microcontrolador. El bootloader busca un evento especial que puede ser cualquier cosa, pero para el desarrollo es más conveniente algo en el bus de datos que será puesto en la flash de la MCU. Si el bootloader ve ese evento especial, entonces entra en modo bootloading en el que hace un reflash de la memoria de programa del microcontrolador, pero si no aparece el evento, pasa el control al código del usuario.

El bootloader no consume RAM y los únicos efectos que tiene son modificaciones en los registros del hardware periferico, pero un buen bootloader no debe dejar ningún estado perjudicial en el que encienda periféricos que malgasten energía cuando pones la MCU en modo sleep. Es una buena práctica inicializar los periféricos que se usan, así aunque el bootloader haga algo extraño, habremos inicializado como queremos que se comporte.

Avrdude es un programa para descargar y cargar a la memoria de las MCUs AVR de Atmel. Puede programar la Flash y la EEPROM y es soportado por el puerto serie.

Avrdude funciona mediante la línea de comandos y soporta los siguientes tipos de programadores:

  • Atmel’s STK500
  • Atmel’s AVRISP and AVRISP mkII devices
  • Atmel’s STK600
  • Atmel’s JTAG ICE (both mkI and mkII, the latter also in ISP mode)
  • appnote avr910
  • appnote avr109 (including the AVR Butterfly)
  • serial bit-bang adapters
  • PPI (parallel port interface)

Avrdude junto con otras herramientas se encuentran en: C:Program Files (x86)Arduinohardwaretoolsavr

Para cargar un sketch con avrdude en Arduino en lugar de usar el IDE, simplemente conectar el cable USB y presionar el botón de reset antes de ejecutar avrdude. Luego ejecutar con estas opciones:

  • Use -b 19200 to set the baud rate to 19200
  • The device signature reads dont seem to work so you’ll want to use -F
  • The programmer type is avrisp
  • The device type is -p m168
  • The port is whatever the FTDI chip shows up as

Un tutorial de avrdude se encuentra en http://ladyada.net/learn/avr/index.html

  • Tutorial
  • Arduino
0 Comentarios

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos. Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Nuevo informe

Cerrar

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account