39- Arduino, Programadores, Fusibles e ISP


Cargar el firmware Arduino con programador.

En este tutorial, veremos c贸mo cargar el firmware en un arduino a trav茅s de 芦programadores禄 externos. Recordemos de lo que ya hablamos en una de las primeras lecciones: cargar firmware a Arduino es posible de dos formas:

  • 芦Directamente禄 a la memoria flash del microcontrolador usando ISP (In System Programing) o programador en el sistema.
  • Usando el gestor de arranque, que vive al final de la memoria Flash del Arduino, recibe el c贸digo del programa a trav茅s del protocolo TTL (UART) y lo escribe en la memoria Flash.

Cargador de arranque

El cargador de arranque se encuentra al final de la memoria flash de Arduino y le permite escribir el firmware enviado a trav茅s de la UART. El cargador se inicia cuando se enciende el MC, espera un momento (de repente, alguien comienza a enviar el c贸digo de firmware a trav茅s de UART) y luego transfiere el control al programa principal recien cargado. Esto sucede cada vez que se inicia el MC.

  • El cargador de arranque le permite actualizar la MCU a trav茅s de UART;
  • El cargador de arranque ralentiza el inicio del Mc, porque en cada lanzamiento, espera alg煤n tiempo para una posible descarga de firmware;
  • El cargador ocupa espacio en la memoria Flash. El antiguo est谩ndar para Arduino NANO toma aproximadamente 2 kB , 隆lo cual es bastante significativo!
  • Es el cargador de arranque que hace parpadear el LED en el pin 13 cuando se enciende, como una indicaci贸n de funcionamiento.

Programador

Adem谩s de escribir firmware en la memoria flash, el programador permite:

  • Leer el contenido de la memoria Flash (descargar el firmware a una computadora)
  • Borrar completamente el chip de todos los datos y configuraciones
  • Escribir y leer el gestor de arranque
  • Lectura / escritura de memoria EEPROM
  • Leer y configurar fusibles (Fuses) y bloqueos.

El programador es su 煤nico amigo cuando trabaja con un microcontrolador 鈥渄esnudo鈥, es decir, por su configuraci贸n de bajo nivel y descarga de firmware.


USB-TTL (UART).

Este m茅todo se implementa directamente en las placas Arduino mediante un convertidor USB-TTL (USB-UART), por lo que podemos conectar la placa a una computadora y descargar el c贸digo. USB-TTL solo permite cargar datos en flash, otras funciones (como un programador ISP) no est谩n disponibles para 茅l. Al mismo tiempo, est谩 limitado solo por las capacidades del gestor de arranque, pero en esta lecci贸n solo consideramos las est谩ndar. Adem谩s, el puente USB-TTL permite que el microcontrolador se comunique con una computadora a trav茅s de una conexi贸n en serie (el mismo monitor de puerto serie y com).

Hay placas sin USB-TTL integrado, como Arduino Pro Mini. Para trabajar con ellos, debe comprar un convertidor USB-TTL externo. Tambi茅n es posible descargar firmware a trav茅s de UART a un microcontrolador 芦b谩sico禄, siempre que haya un cargador de arranque all铆 que escribir谩 el c贸digo recibido en flash. Hablaremos sobre la grabaci贸n del gestor de arranque a continuaci贸n.

El 鈥渃argador de arranque鈥 UART est谩 conectado a los pines RX y TX del Arduino (o microcontrolador), RX-> TX y TX-> RX, y la tierra GND tambi茅n est谩 necesariamente conectada. Si la placa que se est谩 flasheando no tiene su propia fuente de alimentaci贸n, entonces la alimentaci贸n tambi茅n est谩 conectada. El gestor de arranque funciona al inicio del Mc, por lo tanto, inmediatamente antes de cargar el firmware, arduino debe reiniciarse (Reset), y para esto hay un pin DTR (Terminal de datos listo) en las placas USB-UART, que est谩 conectado al pin de reinicio RST y en realidad realiza un reinicio antes de cargar el firmware. Las placas Pro Mini tienen un pin DTR separado.

 separado .

USB-TTLArduino
DTRDTR
RXTX
TXRX
GNDGND
VCC / 5 V / 3,3 VVCC
Conexiones.
Conexiones del programador arduino
Conexiones del programador arduino

Los chinos producen m贸dulos USB-TTL en una amplia gama, pero en general todos son de la misma naturaleza. Enlace al resultado de la b煤squeda en aliexpress. 驴Qu茅 estoy usando? Principalmente un convertidor CP2102. Antes de pedir un m贸dulo, aseg煤rese de que tenga una salida DTR; de lo contrario, este m贸dulo solo se puede utilizar para 芦comunicarse禄 con el controlador a trav茅s del puerto COM.

Para trabajar con dicho convertidor, debe instalar un controlador para el chip en base al cual se ensambla el m贸dulo, puede ser CP2102, CH340 / 341, FT232, PL2303 y otros. El firmware se carga como de costumbre: seleccione el puerto en el que se encuentra el convertidor, la versi贸n del cargador de arranque y haga clic en descargar, 隆eso es todo! Un punto importante: en algunas versiones chinas de las placas Arduino Pro Mini, el pin DTR no est谩 cableado, es decir, no pasa a RST y no se reinicia autom谩ticamente antes de cargar el firmware. En este caso, el reset debe realizarse manualmente, utilizando el bot贸n RST, inmediatamente antes de descargar el firmware.

La carga de firmware a trav茅s del cargador de arranque es posible desde cualquier dispositivo UART, incluso a trav茅s de Bluetooth. Pero hablaremos de esto en una lecci贸n separada.


Fusibles Arduino.

Los fusibles (bits de Fuse) son configuraciones de Arduino de bajo nivel que se almacenan en un lugar especial en la memoria y solo se pueden cambiar usando el programador ISP. Estas son configuraciones como la elecci贸n de la fuente de reloj, el tama帽o del 谩rea de memoria para el cargador de arranque, la configuraci贸n de corte de voltaje, etc. Los bits de fusible se ensamblan en 8 piezas en bytes (los llamados bytes de configuraci贸n), como un registro t铆pico de un microcontrolador AVR. Puede haber varios de estos bytes, se denominan fusibles bajos, fusibles altos, fusibles extendidos. Para configurar los bytes, se recomienda utilizar una calculadora de fusibles (por ejemplo, esta), en la que simplemente marque los bits necesarios, y la salida es un byte listo en forma hexadecimal. Echemos un vistazo al ATmega328p como ejemplo:

Configurador de fusibles de arduino
Configurador de fusibles de arduino

Un punto importante: en AVR, los bits est谩n invertidos, es decir, 1 est谩 apagado, 0 est谩 encendido. Colocando casillas de verificaci贸n en la calculadora, formamos un byte, la casilla de verificaci贸n est谩 activada: el bit est谩 activado, pero en el byte resultante, los bits incluidos son ceros. Debe pensar en esto cuando compile manualmente un byte de fusible; cuando usa una calculadora, es posible que ni siquiera lo recuerde.

驴Qu茅 te permiten personalizar los bits?

  • CKSEL0 – CKSEL3 – selecci贸n de la fuente y la frecuencia del reloj (verifique en la hoja de datos de su Arduino qu茅 configuraci贸n es responsable de qu茅)
  • SUT0 – SUT1 – inicio retrasado de Arduino despu茅s del reinicio.
  • CKOUT – reloj duplicado en uno de los pines (ver hoja de datos)
  • CKDIV8 : divide la velocidad del reloj entre 8.
  • BOOTRST : si est谩 habilitado, Arduino se inicia desde el cargador de arranque.
  • BOOTSZ0 – BOOTSZ1 – establece el tama帽o del sector del cargador de arranque.
  • EESAVE : protecci贸n de EEPROM contra el borrado durante la limpieza completa de bits.
  • WDTON : si est谩 habilitado, Watchdog se habilitar谩 a la fuerza sin la capacidad de deshabilitarse.
  • SPIEN es un bit peligroso, cuando est谩 desactivado, la capacidad de flashear a trav茅s del ISP desaparece y incluyendo la capacidad de desactivar este bit. *
  • DWEN : habilita / deshabilita la interfaz de depuraci贸n DebugWire. En otros modelos Arduino, existe tanto JTAG como su bit: JTAGEN
  • RSTDISBL es un bit peligroso, cuando lo enciende, puede usar la pata RST como un pin digital normal, pero la capacidad de flashear a trav茅s del ISP desaparece y, como resultado, apaga este bit *
  • BODLEVEL0 – BODLEVEL3 – ajusta de control de voltaje (Arduino se reiniciar谩 cuando caiga por debajo del voltaje establecido)

* – Cargar el firmware es posible usando un programador de alto voltaje.


Bloquear accesos a memoria Arduino.

Los bits de bloqueo le permiten controlar el acceso a la memoria del microcontrolador, que generalmente se usa para proteger el Arduino de ser copiado. Los bits de bloqueo se recopilan nuevamente en un byte de configuraci贸n de bloqueo, que contiene: BOOTLOCK01, BOOTLOCK02, BOOTLOCK11, BOOTLOCK12, LOCKBIT1, LOCKBIT2 (para ATmega328). Calculadora de bit de bloqueo, puedes usar esta.

Los bits BOOTLOCK le permiten prohibir que el propio Arduino escriba ( autoprogramaci贸n ) en la memoria flash (谩rea del programa y 谩rea del cargador de arranque)

Bits de bloqueo de acceso en arduino
Bits de bloqueo de acceso en arduino

Pero los bloqueos LOCKBIT le permiten prohibir la escritura y lectura de la memoria flash y EEPROM desde el exterior, utilizando un programador, es decir, proteger completamente el firmware de la descarga y copia:

 Bits de bloqueos LOCKBIT Arduino
Bits de bloqueos LOCKBIT Arduino

Por lo tanto, al habilitar LOCKBIT1 (el byte de bloqueo ser谩 0x3E ), prohibiremos la escritura externa en la memoria Flash y EEPROM, es decir, usando el programador ISP y habilitando LOCKBIT1 y LOCKBIT2 (lock-byte: 0x3C) al mismo tiempo, bloquearemos completamente la lectura de datos de la memoria del Arduino. Nuevamente, todo lo descrito anteriormente se aplica al ATmega328p, para otros modelos Arduino lea las fichas t茅cnicas correspondientes.


Programador ISP.

USBasp

Los programadores ISP baratos tambi茅n est谩n disponibles en el mercado chino, recomiendo tomar USBasp como el m谩s com煤n. Buscar en aliexpress, me gusta la versi贸n en el cuerpo. USBasp no tiene una salida de 10 pines muy 煤til en el cable, por lo que se recomienda comprar un adaptador de 10 a 6 pines, que le permite conectarse inmediatamente al encabezado ISP, que se encuentra en la mayor铆a de las placas Arduino. 隆Atenci贸n! Muy a menudo hay un defecto en forma de contactos no soldados, por lo tanto, para evitar problemas, se recomienda soldar el adaptador y lavar el fundente (cepillo de dientes + limpia flux).

Conexi贸n usbasp a arduino
Conexi贸n usbasp a arduino

Comienzo r谩pido:

  • Conecte usbasp a la computadora.
  • Descargue e instale controladores para usbasp ( hay un sitio aqui: disco Yandex )
  • Abra el administrador de dispositivos y aseg煤rese de que el programador sea detectado por el sistema.
  • Abra el IDE de Arduino.
  • Seleccione usbasp en Herramientas> Programador.

Soluci贸n de problemas

La soluci贸n a la mayor铆a de los problemas de descarga a trav茅s del programador (independientemente de lo que est茅 escrito en el registro de errores):

  • Extraiga y vuelva a insertar usbasp en el puerto usb.
  • Conectar en otro puerto usb.
  • Reinstale el controlador de usbasp.
  • Verifique la calidad de la conexi贸n USBasp con Arduino.
  • Vuelva a soldar el adaptador y limpie el fundente.

Para firmware de un microcontrolador con reloj a baja frecuencia (reloj interno de menos de 1 MHz):

  • USBasp: La placa tiene un jumper JP3 que habilita el modo de baja velocidad de descarga. En las versiones de firmware m谩s recientes para USBasp, la velocidad se selecciona autom谩ticamente, pero los chinos venden la versi贸n anterior. C贸mo flashear uno nuevo?: busque en Internet.

Errores b谩sicos en el registro IDE de Arduino

avrdude: error: no se pudo encontrar el dispositivo USB 
con vid = 0x16c0 pid = 0x5dc vendor = 'www. fischl . de 'producto =' USBasp '

Raz贸n: la computadora no ve USBASP:

  • Verifique y cambie el puerto USB.
  • Intente reinstalar el controlador.
  • Verifique la soldadura del conector USB en la placa del programador.
  • Verifique la presencia e integridad de elementos cerca del conector usb del programador, resonador de cuarzo.
  • Quiz谩s el programador est茅 mal soldado; si es posible, intente volver a flashear.
  • Quiz谩s el microcontrolador en la placa del programador est茅 defectuoso o muerto, intente reemplazarlo y flashear.
avrdude: error: habilitaci贸n del programa: el objetivo no responde. 

Motivo: usbasp no ve el microcontrolador conectado:

  • Verifique la correcci贸n e integridad de la conexi贸n con el Arduino.
  • Intente reducir la frecuencia del firmware utilizando un puente o especificando una velocidad m谩s baja en el entorno de programaci贸n.
  • Compruebe la soldadura del conector de 10 pines y el adaptador de 10 pines – 6 pines.
  • Quiz谩s el microcontrolador de firmware qued贸 atrapado con un bucle, o est谩 muerto.

Arduino como ISP

Casi cualquier otra placa Arduino puede convertirse en un programador ISP, para esto solo necesita cargar el boceto ArduinoISP en ella:

  • Abrir archivo de boceto > Ejemplos> 11. ArduinoISP> ArduinoISP.
  • Su Arduino ahora es un programador ISP.
  • Le conectamos otro Arduino o un chip desnudo de acuerdo con el diagrama a continuaci贸n.
  • Seleccionar Arduino como ISP en Herramientas> Programador.
  • Y podemos escribir cargadores de arranque, fusibles o cargar el firmware directamente en Flash.
Arduino-como-programador-ISP-1
Arduino como programador ISP

El programador ISP est谩 conectado a cuatro pines del Arduino, sin contar la fuente de alimentaci贸n, uno de los pines env铆a un reset, el resto se utilizan para la transmisi贸n de datos. En el caso de Arduino como programador, se recomienda colocar un condensador de ~ 10 uF en el pin RST de la placa del programador.

Soluci贸n de problemas

Para cargar el firmware de un microcontrolador con reloj a baja frecuencia (reloj interno de menos de 1 MHz):

  • Arduino de ISP: debe cambiar la frecuencia de descarga del firmware en el boceto del Arduino que hace de ISP y actualizarlo nuevamente en el programador de arduino;

Trabajando en el IDE de Arduino.

Firmware del cargador de arranque

Desde el IDE de Arduino usando el programador ISP, podemos escribir otro cargador de arranque (de hecho, el cargador de arranque + fusibles) y cargar el boceto, as铆 como configurar / flashear fusibles y bloquear bits, pero no de una manera muy conveniente. Cuando seleccionamos una placa en Herramientas> Placa y cargador de arranque en Herramientas> Placa (cargador de arranque), el Arduino IDE autom谩ticamente hace que el cargador de arranque deseado est茅 鈥渁ctivo鈥. Al hacer clic en Herramientas> Escribir cargador de arranque, flasheamos el cargador de arranque correspondiente a la placa seleccionada y su configuraci贸n. Adem谩s, simult谩neamente con el gestor de arranque, se muestran los fusibles y los bits de bloqueo, correspondientes a la placa seleccionada en el IDE de Arduino. C贸mo y d贸nde cambiarlos, vea a continuaci贸n.

Veamos un ejemplo de una entrada del cargador de arranque para un atmega328 en la placa Arduino NANO de China. Por el momento, los chinos est谩n actualizando una versi贸n antigua del cargador de arranque en Arduino, que se llama el antiguo cargador de arranque en el men煤 de la placa. Las placas originales vienen con un cargador de arranque m谩s moderno, por lo que cuando trabajamos con placas chinas, tenemos que seleccionar el cargador de arranque antiguo para cargar el firmware a trav茅s del puerto USB integrado. Conectemos usbasp de acuerdo con el diagrama anterior, selecci贸nelo como programador en Herramientas> Programador, seleccione la placa Arduino NANO, el cargador de arranque para el atmega328 (el primero en la lista). Presionemos escribir el gestor de arranque. Ahora la placa se puede cargar a trav茅s del puerto USB integrado, eligiendo el primer cargador de arranque. Por cierto, es m谩s ligero, 芦flashea禄 m谩s r谩pido y el firmware en s铆 芦se inicia禄 m谩s r谩pido.

驴C贸mo elimino el cargador de arranque?

No existe la opci贸n 芦sin cargador de arranque禄 en el n煤cleo Arduino est谩ndar. Para eliminar manualmente la compatibilidad con el cargador de arranque, debe poder trabajar con boards.txt y fusibles: deber谩 cambiar el fusible BOOTRST y ajustar el tama帽o m谩ximo del boceto. Hay una opci贸n m谩s f谩cil: buscar e instalar un kernel, que implementa la elecci贸n de un cargador de arranque con una opci贸n 芦sin cargador de arranque禄, por ejemplo, para ATmega328 es miniCore y otro GyverCore. Debe instalar el soporte del kernel de acuerdo con las instrucciones discutidas anteriormente, seleccionar una placa, especificar la opci贸n 芦sin un cargador de arranque禄 y hacer clic en 芦Escribir un cargador de arranque禄. Los fusibles correspondientes se aplicaran en el Arduino.

Subiendo un boceto

En el IDE de Arduino, puede cargar un boceto a trav茅s del programador, para esto debe hacer clic en Boceto> Descargar a trav茅s del programador. Esto es logico cuando el Arduino se usa sin un gestor de arranque, o simplemente un MC desnudo.

Fusibles

El configurador de la placa en el IDE de Arduino est谩 organizado de la siguiente manera: cada placa en Herramientas> Placa tiene su propio conjunto de configuraciones, incluidos los fusibles que se muestran junto con el cargador de arranque . Algunos son:

  • Cargador (ruta al archivo)
  • Velocidad de descarga (a trav茅s del cargador de arranque)
  • Memoria flash y sram disponible.
  • Todo el conjunto de fusibles y bloqueos.

El archivo de configuraci贸n se llama boards.txt y se puede encontrar en la carpeta principal de Arduino: C: \ Archivos de programa (x86) \ Arduino \ hardware \ arduino \ avr \ boards.txt. La documentaci贸n de boards.txt se puede leer aqu铆. Si lo desea, puede mostrar los fusibles necesarios a trav茅s de la calculadora (leer m谩s arriba), cambiarlos en boards.txt (lo principal es no confundirse sobre la configuraci贸n de la placa seleccionada para la que se realiz贸 el cambio) y flashearlo en el Arduino haciendo clic en Herramientas> Escribir cargador de arranque.

  • Los fusibles est谩n marcados como fusibles bajo / alto / extendido, puede insertar el valor obtenido en la calculadora.
  • Los lockbits funcionan de la siguiente manera: unlock_bits son candados que se activaran antes de que se escriba el cargador de arranque (al hacer clic en el bot贸n Escribir cargador de arranque). Pero despu茅s de actualizar el cargador de arranque, lock_bits se actualizar谩 autom谩ticamente, lo que determinar谩 el acceso a la memoria del controlador durante su funcionamiento. Para proteger el firmware de la lectura, configure lock_bits 0x3C.
Archivo board.txt de arduino
Archivo boards.txt de arduino

Avrdudeprog.

Avrdudeprog es una utilidad de un programador ruso, que es un shell. Puede descargar AVRDUDE_PROG desde el sitio oficial  ( enlace de descarga ). Como parte de esta lecci贸n, el programa puede:

  • Leer / escribir / borrar memoria flash.
  • Leer / escribir / borrar memoria eeprom.
  • Borrado completo de bytes.
  • Calculadora de fusibles y bloqueos (lectura / escritura)

Deja un comentario