Si un microcontrolador se puede flashear a través de USB o no, depende de su construcción y si el fabricante original lo permitió o no. Sin embargo, el usuario final puede modificarlo como se explica a continuación.
Arduino se basa en atmega IC de Atmel. En arduino UNO, utilizan Atmega328P. Estos circuitos integrados se han diseñado de forma tal que escuchen en sus puertos SPI durante el inicio de cualquier código / datos entrantes. Si reciben datos válidos, se volverán a programar. Los chicos de Arduino escribieron un pequeño trozo de gestor de arranque (considere un pequeño sistema operativo para la unidad de control). Este gestor de arranque añade algunas características extra. Le indica al microcontrolador que escuche en los pines UART (Serial Tx Rx) también para cualquier código válido una vez que el microcontrolador se reinicie. Y así es como se pueden programar las tarjetas arduino a través de la comunicación en serie.
Además, arduino no se está flasheando directamente a través de USB directamente. Se está programando en serie. Arduino tiene algún circuito extra - USB a convertidor de serie. Este es el responsable de convertir los datos USB (que van desde su PC) a datos en serie (que puede ser entendido por atmega 328).
Si comienza a escribir su gestor de arranque personalizado, también puede usar otras características. Por ejemplo, el código del cargador de arranque puede obligar a que el IC se inicie como esclavo i2c con una dirección predefinida y algunos maestros i2c pueden enviarle un código. O bien, puede implementar una serie de software en pines que no sean Tx Rx para grabar su código.
Sin embargo, incluso con todo esto en su lugar, lo que el fabricante ha hecho siempre se mantendrá a menos que el fabricante le permita anularlo. Por ejemplo: a pesar de que Arduino se muestra a través de Serial, puedes usar el SPI alineado para volcar el código usando ISP. Esto es lo que le permite grabar un cargador de arranque nuevo en caso de que algo malo le haya pasado al código del cargador de arranque.