Primeros pasos con los conceptos de programación AVR

Estoy tratando de empezar a programar el AVR. Elegí usar Atmega328P (que está en mi Arduino Uno). Cuando hice una búsqueda en la web sobre los pasos iniciales para aprender a programar AVR, me di cuenta de que el microcontrolador requiere un programa especial llamado "cargador de arranque" para iniciar el boceto que hemos creado usando el IDE de Arduino. El cargador de arranque verifica si los datos (programa) están presentes en los pines RX. Si los datos están presentes, el cargador de arranque toma el programa y lo coloca en la memoria flash. Este proceso de carga del programa en el microcontrolador se lleva a cabo a través del protocolo UART. En otras palabras, el gestor de arranque permite cargar el programa en el microcontrolador. Creo que he entendido el concepto hasta ahora. Cualquier corrección es bienvenida de corazón.

Mi confusión real comienza cuando no tengo cargadores de arranque en mi microcontrolador. Tengo mi programa listo para cargarlo en la memoria flash. Pero no hay nada que permita que el programa se cargue en el microcontrolador. No hay gestor de arranque, por lo que no hay nada que permita que el programa entre en la memoria. Aquí es donde el programador entra en acción. El programador toma el archivo .hex de la PC a través del protocolo USB. Luego envía este archivo al microcontrolador a través del protocolo SPI (ya que se utilizan pines MISO-MOSI-SS). Mi pregunta es:

P1- ¿Por qué no necesito un gestor de arranque para cargar el programa a través del protocolo SPI? ¿Por qué no puedo cargar el programa al microcontrolador a través del protocolo UART cuando no hay ningún cargador de arranque presente? ¿Qué permite que el microcontrolador cargue el programa en su memoria sin cargador de arranque cuando se usa el protocolo SPI?

Revisé varios recursos disponibles para obtener un concepto de estas cosas, pero a menudo me confundo de una forma u otra. Estaba estudiando "El arte de la electrónica" y me estoy confundiendo incluso con mi primera pregunta. El libro dice:

"Los microcontroladores contemporáneos usan almacenamiento interno no volátil (memoria flash) para el código del programa, que usted carga (mientras el μC está en el circuito) mediante uno de varios métodos. Por lo general, realiza la carga55 con un "pod" comercial (oficialmente llamado " programador de dispositivos"), que compra al fabricante del chip o a un tercero. Si compra un kit de desarrollo (Figura 15.24), a menudo incluirá un módulo de programación, junto con software (para compilar, simular, ensamblar y cargar), y con una placa de circuito en la que hay un microcontrolador y otro hardware (puertos digitales y analógicos, LED, un puerto serie, un encabezado de programación y quizás algún dispositivo de visualización). Aquí están los varios protocolos de carga: cargador de arranque de puerto serie UART, SPI cargador de arranque de puerto serie, cargador de arranque de puerto serie JTAG, cargador de arranque de puerto serie propietario, cargador de arranque de puerto serie USB,carga paralela".

¿El escritor está tratando de decirme que el programa que estoy cargando a través del protocolo SPI es el gestor de arranque? No puedo descartar esta posibilidad porque el cargador de arranque también se carga en el microcontrolador mediante el uso del protocolo SPI. Aquí hay un tutorial del sitio web de Arduino.

La siguiente parte que he estado estudiando es sobre el proceso de cargar el programa en el microcontrolador. Hice un programa simple de parpadeo de LED en Atmel Studio 7 y tengo su archivo hexadecimal listo para ser transportado al microcontrolador. Estoy tomando esta analogía para entender cómo se carga el archivo hexadecimal en el microcontrolador.

He considerado que mi archivo hexadecimal es un producto que el vendedor (PC) debe entregar al cliente (microcontrolador). El vehículo a utilizar es una camioneta de reparto (AVRDUDE). Pero el problema es el río entre el vendedor y el cliente. Así que necesito un puente para conectarlos. Este puente es el "programador". ¿Es correcta mi analogía? Si no, ayúdame a entender cuál es la propuesta de AVRDUDE y el 'programador'.

Respuestas (2)

Los microcontroladores AVR (y la mayoría de los µC modernos) contienen hardware especial específicamente para programar directamente usando una combinación del puerto SPI (llamado ISP para este caso especial) y el pin de reinicio.

Esta es una característica muy conveniente porque no necesita preocuparse por los cargadores de arranque o las compensaciones de memoria o cualquier otra cosa. Puede programar los chips por separado o después de instalarlos.

Para usar un método diferente para programar el flash, debe usar un cargador de arranque que le indique al chip cómo aceptarlo. UART, por ejemplo.

Algunos AVR también pueden usar otros métodos, por ejemplo, programación de alto voltaje, que no usa un cargador de arranque.

La elección se reduce a lo que es más conveniente/útil para usted.

Una cosa buena de un cargador de arranque es que potencialmente permite una manera fácil de aplicar actualizaciones de campo a su firmware.

En cuanto a tu analogía:

El archivo hexadecimal es el programa que está cargando en la memoria flash del microcontrolador. El programador es el hardware físico que transmitirá estos datos. AVRDUDE es el software que ejecuta este proceso.

Tenga en cuenta que la mayoría de los microcontroladores modernos tienen esquemas similares; esto no es exclusivo de Atmel o AVR.
Gracias @TimWescott, actualizaré mi respuesta con este valioso dato.
¿Se debe a ese "hardware especial" que no puedo usar el protocolo UART para cargar los programas en el 'microcontrolador sin gestor de arranque'? Y creo que estoy en lo correcto con mi analogía. ¿Soy yo?
El hardware especial no le impide usar el UART, es solo que sin el cargador de arranque, el chip no sabe cómo aceptar la programación a través de ese método. Y sí, tu analogía suena correcta.
Si de alguna manera diseño un cargador de arranque que sabe cómo trabajar con el protocolo SPI en lugar de UART y cargo un programa, ¿ese programa será ahora un cargador de arranque o un programa?
Debe configurar los fusibles correctos, pero sí, puede diseñar un gestor de arranque como ese. Sin embargo, puede ser más fácil, si ya tiene la conexión SPI, hacer que esa fuente también controle el pin de reinicio y simplemente use la programación ISP incorporada.
Un bootlaoder es solo un programa, en la primera sección de la memoria, que verifica si alguien está tratando de aplicar una actualización al dispositivo antes de iniciar el programa real. Si no hay nada esperando, salta al programa real y comienza a ejecutarse.
Y los gestores de arranque están en todas partes: para todas las líneas de productos en las que he trabajado que tenían su propia red de comunicaciones internas, creo que el 80 % terminó con un gestor de arranque exclusivo para ese protocolo de comunicaciones internas.

Un gestor de arranque no es la única forma de programar un microcontrolador. De hecho, es posible que deba usar algún otro método para incluso poner el programa del cargador de arranque en el microcontrolador antes de poder usar técnicas de carga de arranque en serie. El ATMega que usa es uno de esos chips.

La familia Arduino se basa en un cargador de arranque, pero en el entorno de programación de Arduino encontrará una opción para usar un programador de hardware para cargar el cargador de arranque en un nuevo chip.

Los programadores de hardware le costarán alrededor de $ 10 USD

Y el programador usa la conversión de USB a SPI. ¿Tengo razón? Además, encontré una manera de usar Arduino como programador. Como ya tengo la placa Uno, no quiero comprar un programador adicional. ¿Hay algún tipo de complicación que pueda enfrentar al usar Arduino como programador?
No sé el protocolo que usa el programador. Variará según la familia de chips.
El programador contiene pines MISO, MOSI, SS (Chip Select). Hasta donde yo sé, el protocolo SPI usa estos pines. No estoy seguro si hay otros protocolos. Esperemos a que alguien más agregue a las respuestas.
Que yo sepa (en AVR), los programadores de SPI/ISP no usan el pin SS. Utilizan MISO, MOSI, SCK y RESET.
Sí. Cometí un error. Gracias por la corrección @evildemonic