Programación de microcontrolador usando UART

Estoy tratando de diseñar una placa de desarrollo con un micro de diálogo. Estoy tratando de eliminar la necesidad de un programador en esta placa. Para que el usuario simplemente pueda conectar un cable USB y poder comunicarse con el chip y arrancarlo. He visto que arduino usa un micro adicional (ATMEGA16U2) para hacer usb a uart y esto se alimenta al micro real de arduino (ATMEGA328P-PU). Disculpas si lo siguiente parece muy estúpido, pero para mis propias aclaraciones, tengo 2 preguntas:

En primer lugar, ¿cómo se programa el primer micro para empezar? Me imagino que el chip viene vacío, así que si conecto un USB al principio, ¿no vería nada?

En segundo lugar, ¿podría usar un chip FTDI usb a serie para hacer lo mismo? ¿No habría sido una solución más sencilla?

Supongo que una vez que se inicie la comunicación entre mi computadora portátil a través de USB y mi micro a través de UART, podría usar cualquier IDE para programar este chip.

Tengo una experiencia previa muy básica trabajando con micros y me gustaría aprovechar esta oportunidad para mejorar eso.

Pequeño ajuste: son microcontrolador, no microprocesador
IIRC, ATMEGA16U2 se utiliza para emular el chip FTDI, que es más caro.
Sí, hay muchos ejemplos de fuente abierta y probablemente cerrada del uso de chips FTDI con los diversos protocolos compatibles con esta y otras MCU (esta marca y otras). Puede obtener algunos programadores económicos que a menudo se basan en un chip FTDI, donde alguien ha creado el software para usted. Pero si desea ingresar a MCU, esto es parte de esto, programar el código mcu en sí mismo es el 5% del trabajo entre toda la lectura, dominar la cadena de herramientas, resolver la programación preprogramada o de campo, etc. Todo se combina para cubrir el resto del trabajo.
Empuje el empujón, compre un arduino o un nucleo o mbed o innumerables otras herramientas basadas en soluciones de sandbox, y haga su propio programador. También existen otros productos, que están programados de fábrica para admitir dfu, por ejemplo. conéctelos, configure el pin de la correa correctamente, enciéndalos o reinícielos y puede programarlos a través de USB, retire / cambie el reinicio de la correa y listo. Otros tienen cargadores de arranque uart incorporados que hacen un buen acoplamiento con un FTDI u otra parte en un modo uart.
parece que quiere dar el paso desde la placa arduino de $ 50 donde se encuentra en una caja de arena donde todo lo demás, incluido el 90% de la programación de los periféricos en la parte, se ha hecho por usted, y quiere comenzar a comprar la parte de $ 2 usted mismo y usarlo. Vale la pena el esfuerzo, pero hay un esfuerzo que comienza con la lectura de las interfaces de programación del sistema, y ​​tampoco hay nada que xmegas vs megas y dispositivos menores no siempre compartan los mismos protocolos en el mundo AVR. Estudie las hojas de datos y las notas de la aplicación.
@old_timer De alguna manera, todos se perdieron el pequeño detalle: no es un chip atmega sobre el que pregunta el OP. Es una variante de Cortex-M0 con una secuencia de arranque muy específica. Encontré algunos detalles (enlaces en mi respuesta) pero no mucho.
"Estudie las hojas de datos y las notas de la aplicación" lo que viene integrado en el chip, ya sea hardware o roms programados de fábrica, es muy específico para ese producto o línea de productos. Entonces no hay una respuesta genérica. Sí, definitivamente hay productos cortex-m0 de al menos un par de proveedores que tienen soluciones basadas en uart que son triviales con un ftdi usb para cualquier ruptura. Del mismo modo, el cortex-ms tiene una interfaz SWD de dos cables que también es trivial con una placa de conexión usb a ftdi (mpsse).
Varias de las placas de evaluación/demostración, los núcleos, los descubrimientos y las plataformas de lanzamiento, etc., tendrán un mcu de depuración del lado usb que usted no controla y un mcu bajo prueba que hacemos, proporcionando una interfaz usb para que el proveedor del chip cree una herramienta para y luego ese chip usa uno de los protocolos admitidos para el mcu de destino, de los cuales muchos no tienen usb directo. no es una práctica poco común.
Me han informado que hacer una placa que se pueda programar directamente con un conector USB y sin programador sería un gran proyecto por sí solo. También dijo que la mayoría de las placas de evaluación vendrán con 2 MCU, donde 1 de la MCU es el programador con un código pesado para programar el gestor de arranque de destino. Dijo que las empresas se dedican a hacer este tipo de cosas cuando hacen que sus programadores estén basados ​​en un software muy pesado. UART.

Respuestas (3)

En primer lugar, ¿cómo se programa el primer micro para empezar?

En la fábrica con un programador.

En segundo lugar, ¿podría usar un chip FTDI usb a serie para hacer lo mismo?

El Atmega328 se puede programar usando el 'protocolo' SPI. Para obtener una transmisión SPI de un chip FTDI se requiere una programación ingeniosa.

La mayoría de los kits de desarrollo de 'autoprogramación' tienen un programa de arranque básico en una sección protegida de su memoria FLASH. Se pone allí en la fábrica. Tiene SW para usar una interfaz (UART, USB) que le permite cargar datos en el resto del FLASH y saltar a él. El protocolo es propietario, pero a veces se divulga.

Entonces podría usar cualquier IDE para programar este chip.

No, su IDE necesitaría saber qué interfaz y qué protocolo usar. También es poco probable que funcione trabajar con puntos de interrupción y recorrer paso a paso el código. Es la razón por la cual gastar algo de dinero en un programador decente (ICE) vale cada centavo.

Así que diseñar un kit de autoprogramación será más difícil de lo que pensaba. Alguien mencionó que podía cargar el cargador de arranque inicialmente usando herramientas JTAG y luego hacer toda la programación posterior mediante comunicaciones a través de uart usando un chip FTDI. Entonces, ¿los chips FTDI no se usan para comunicaciones micro y comp?
Supongo que lo que es más importante, ¿no existe una solución simple para diseñar un 'kit de autoprogramación'? ¿Uno en el que el desarrollador solo agrega sus computadoras portátiles al kit usando USB?
Sí, puede escribir su propio 'cargador de arranque' y escribirlo con un programador dedicado. Luego use el FTDI/UART para cargar imágenes. También necesita escribir SW en la PC para enviar una imagen a un puerto COM (virtual). Pensé que estabas buscando una solución completa 'sin programador'.
Los chips ftdi se pueden usar para generar varios protocolos spi, uart, jtag, i2c, custom. los que admiten mpsse lo hacen más suave, pero los otros pueden ser golpeados un poco.
Esta respuesta pierde el punto: la pregunta no se trata de un objetivo ATmega.

Cuando compras Arduino, el chip (Atmega8U2/16U) ya viene programado con firmware. Se puede actualizar mediante el protocolo DFU, comúnmente compatible con muchos dispositivos USB. Si compra el chip solo, tendrá que cargar el mismo firmware la primera vez utilizando el mecanismo ISP normal.

Habiendo dicho eso, el firmware en Atmega8U2/16U es un puente simple de USB a UART, por lo que definitivamente puede sustituirlo por FTDI o puente de hardware de Silicon Labs.

Supongo que una vez que se inicie la comunicación entre mi computadora portátil a través de USB y mi micro a través de UART, podría usar cualquier IDE para programar este chip.

La conexión eléctrica entre USB y UART usando cualquier chip puente no significa comunicación. Necesita un software que se ejecute en un microcontrolador y escuche UART. El software se llama "cargador de arranque" y debe cargarse la primera vez usando un método alternativo.

Para ATMega328P, este método alternativo es el mismo ISP utilizado para programar el firmware en el puente USB ATmega8U.

Sin embargo, está utilizando el microcontrolador Dialog, que parece ser una variante de Cortex-M0. La documentación en el sitio de Dialog requiere registro, por lo que no puedo verla. A partir de este documento, parece que los MCU de Dialog usan un mecanismo complejo con dos cargadores de arranque, uno de los cuales puede reemplazarse por el suyo, otro parece estar grabado en la memoria OTP (Programable por única vez) en la fábrica.

Si ese es el caso, conectar USB al puerto UART con FTDI sería suficiente para comenzar el desarrollo. Alternativamente, puede usar JTAG para cargar su aplicación directamente en la RAM (el llamado modo de desarrollo en la documentación)

Tienes que averiguarlo tú mismo si tienes acceso a la documentación. Hay algo de información aquí

Para que el usuario simplemente pueda conectar un cable USB y poder comunicarse con el chip y arrancarlo

Hay algún problema con la terminología aquí. Cuando dice "el usuario", ¿se refiere a usted mismo o al "usuario final"? Debido a que los usuarios finales no "arrancan el chip", conectan el dispositivo al puerto USB (o suministran energía por otros medios) y se inicia solo.

Si podrán o no comunicarse con él depende completamente del software que cargue. Sin ese software, ellos (o usted) podrían comunicarse con el cargador de arranque existente y cargar sus propios programas, como se mencionó anteriormente.

Si en "comunicar" quiere decir algo diferente a cargar la aplicación desde IDE, entonces el chip FTDI no lo ayudará. Por ejemplo, desea admitir el protocolo DFU (para que los usuarios finales puedan actualizar el software fácilmente), o si desea que su dispositivo aparezca en la PC como otra cosa (por ejemplo, dispositivo de entrada o almacenamiento), entonces debe cambiar la clase de dispositivo USB. No puede hacer esto con el chip FTDI.

ACTUALIZAR

Como dijo @chris-stratton en los comentarios a continuación, es muy recomendable agregar al menos un marcador de posición para SWD (Conector de depuración Cortex de 10 pines), incluso si hay otros métodos de programación disponibles. Te ahorrará muchos dolores de cabeza a la larga.

Para un objetivo Cortex M0, sería un error lamentable diseñar una placa que no rompa las señales SWD, independientemente de si se admite otro método como un cargador de arranque USB o UART. La mayoría de las placas de detección y evaluación nucleo de ST, por ejemplo, tienen un segundo micro integrado que funciona como un adaptador de depuración y programación USB-SDW y, en algunos casos, también proporciona una interfaz UART de tiempo de ejecución para el objetivo.
"el firmware en Atmega8U2/16U es un puente simple de USB a UART, por lo que definitivamente puede sustituirlo por FTDI o puente de hardware de Silicon Labs". proveedores) hacen esta sustitución. Y, por lo general, tampoco con un chip FTDI genuino, lo que a menudo significa pasar un tiempo buscando un controlador adecuado antes de poder usarlo.
@ChrisStratton "grave error al diseñar una placa que no rompió el SWD" - De acuerdo con esto al 100%. No entiendo por qué socava inmediatamente la declaración anterior con la referencia al segundo micro. El objetivo de OP, como se indicó, es simplificar el diseño y evitar una interfaz de programación especial. Tener el encabezado SWD y el chip FTDI es suficiente para la mayoría de las tareas, excepto aquellas que requieren un cambio de clase de dispositivo.
@Jules Muchos clones de Arduino realmente se las arreglan con solo el encabezado ISP. El bricolaje y los Arduinos con placa ciertamente siguen el mismo camino.
@Maple: porque poner la serie SWD y USB en un micro integrado teóricamente significa que están disponibles incluso para usuarios novatos. Aunque nada con USB termina siendo sencillo...
@ChrisStratton Todavía no entiendo por qué necesitas un segundo micro para esto. Usar el puente FTDI es ciertamente una solución más simple, especialmente para los "usuarios novatos".
@Maple: Arduino encontró ventajoso el ATmega8u2 o 16u2 incluso cuando su funcionalidad solo reflejaba un FTDI. Pero una MCU también se puede programar para hacer más, por ejemplo, ser una interfaz SWD, algo en lo que las piezas FTDI baratas como la FT2232RL son malas (realmente necesita las de gama alta como la 2232H)

Tanto Arduino como NodeMCU usan un chip puente USB a UART, como FTDI, y ambos usan líneas de control adicionales (CTS RTS) para controlar los pines de reinicio y/o selección de arranque del uC de destino, de esta manera puede restablecer el uC de destino y también póngalo en modo bootloader, donde un software especial dentro de la uC se encargará de recibir el nuevo código a través de serial y grabarlo en flash. En el caso de Arduino, como ya se ha dicho, este código del cargador de arranque debe grabarse previamente en la uC a través de una interfaz de programación estándar.

Pero en el caso de NodeMCU (ESP8266), el cargador de arranque ya está presente en la memoria ROM (y siempre estará allí, no es posible borrarlo), por lo que el software de la PC fuerza el reinicio de ESP8266 (a través de CTS) y usa la señal RTS. (conectado a otro IO) para forzar el inicio del gestor de arranque de la ROM, luego la aplicación utiliza el protocolo del gestor de arranque para enviar el nuevo código que se va a flashear.

Ya trabajé con microcontroladores STM32 Cortex-M3, y también tienen un gestor de arranque de ROM que se puede seleccionar en el momento del reinicio a través de una señal en uno de los IO, por lo que, en teoría, es totalmente posible hacer una "placa arduino" STM32 que funcione exactamente en de la misma manera que un NodeMCU-ESP8266, que no requiere ningún cargador de arranque preinstalado y tampoco es "bloqueable", ya que el cargador de arranque siempre estará accesible.