Programadores, fusibles e ISP en Arduino


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 “desnudo”, 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 “cargador 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é “activo”. 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