¿Es posible hacer que el puerto COM virtual de ST-LINK funcione sin iniciar ningún programa en Ubuntu?

Hice algo de desarrollo en una placa Nucleo-64 (específicamente la NUCLEO-F303RE con el microcontrolador STM32F303RE) y usé OpenOCD y GDB target remote :3333para mostrar mi código (con load) en mi microcontrolador.

Durante este tiempo, usé el puerto COM virtual de ST-LINK en mi máquina Linux (Ubuntu 16.04 (Xenial Xerus)) para hablar con el USART del microcontrolador. Ahora me gustaría usar el puerto COM virtual para hablar con el microcontrolador sin necesidad de iniciar OpenOCD o GDB.

Me sorprendió descubrir que esto no solo funciona. Los síntomas son que mi dispositivo no recibe los bytes enviados por el host ni viceversa. (Detecto los bytes que llegan al dispositivo de destino haciendo parpadear un LED). Por lo tanto, parece que el estado del microcontrolador ST-LINK, o quizás el kernel de Linux en mi máquina host, cambia de alguna manera por el proceso de conexión a través de OpenOCD y flasheando el programa.

Mi pregunta principal es: ¿Es posible llegar a este estado de funcionamiento del puerto COM virtual en mi máquina Ubuntu 16.04 sin iniciar OpenOCD o GDB? Idealmente, no necesitaría usar ningún programa adicional, pero tal vez solo cambie algunos ajustes de configuración.

Mi segunda pregunta es: ¿Por qué sucede esto? ¿El dispositivo ST-LINK está cambiando de modo aquí?

Y mi tercera pregunta: ¿Por qué sucede lo siguiente y qué puedo hacer al respecto? A veces, incluso después de un flasheo exitoso, el microcontrolador de destino puede enviar bytes con éxito, pero no puede recibirlos. Además, creo que una de mis placas no puede enviar ni recibir bytes con este método, aunque el firmware parece cargarse bien.

En MacOS 10.12.1, mi microcontrolador de destino se conecta inmediatamente y se puede acceder a él según lo desee (sin ejecutar más comandos ni actualizar el firmware) a través del puerto COM virtual en, p /dev/tty.usbmodem1423. Por lo tanto, ahora sospecho que el problema está relacionado con el kernel de Linux y el controlador que crea /dev/ttyACM0.

Debería poder instalar el controlador y se comporta como un puerto com.
sí, esa tabla/familia funcionará. algunos de los nucleos no algunos si, te lo dice la documentacion. no hay razón para usar openocd ni gdb, estos muchachos se montan como unidades flash virtuales, simplemente copie el archivo .bin en la unidad flash virtual para descargar/programar el binario en el flash en el mcu de destino. el mcu de depuración, además de proporcionar stlink, proporciona un puerto de comunicación virtual usb que se conecta al RX/TX en el MCU de destino. Para ubuntu, no, no necesita instalar nada, solo minicom en /dev/ttyACM0 y copiar su archivo .bin en el sistema de archivos virtual montado.
Ahora digo que, dependiendo de la edad de su placa, es posible que necesite actualizar el firmware en el mcu de depuración, lo hará. hay una herramienta basada en java que funciona muy bien en ubuntu/linux con la que puede actualizar su placa. Ayuda con problemas como que solo puede escribir el archivo .bin varias veces y luego dice que está lleno, tiene que desconectar y volver a conectar. el tablero. si deja minicom conectado a ACM0 cuando hace esto, incluso con el último firmware, a veces puede molestarse y no brindarle los datos correctos al principio. Tiendo a cerrar minicom antes de desconectarlo si es necesario.
Como traté de explicar arriba, no tengo problemas para actualizar el tablero. Mi problema es comunicarme con el STM32F303RE usando el puerto de comunicaciones virutal.
Es posible que el administrador del módem esté agarrando el puerto serie virtual e intentando enviar comandos para averiguar qué tipo de módem es. Recibir esos comandos inesperados puede alterar el estado de su programa cuando finalmente se conecte a él, haciendo que parezca que el puerto serie virtual no funciona correctamente. El uso de gdb/openocd para restablecer el microcontrolador haría que esos síntomas desaparecieran. Si restablecer el microcontrolador manualmente soluciona el problema, intente agregar una regla udev para evitar que el administrador del módem tome el puerto serie virtual de STLink.
@Devan buena idea, pero desafortunadamente este no es el caso: no se reciben bytes, lo cual sé porque mi programa enciende el LED para cualquier byte recibido, y el LED no se enciende cuando conecto el dispositivo USB.

Respuestas (1)

No debería haber una interacción real entre GDB u OpenOCD y el puerto serie virtual de una placa STM32 Discovery o Nucleo; sin embargo, el modemmanagerpaquete instalado de forma predeterminada en Ubuntu y las distribuciones derivadas retrasará sustancialmente la disponibilidad del dispositivo CDC/ACM después de cada reinicio, lo que normalmente incluye no solo conexiones, sino también algunas operaciones de programación (al menos aquellas que usan la emulación de almacenamiento masivo).

Las cosas funcionarán mucho mejor con modemmangerdesinstalado. No discuta sobre esto hasta que haya intentado eliminarlo ; el problema está detrás de escena, un retraso en el sistema operativo que hace que el puerto esté disponible para los programas de usuario. Hace la diferencia entre que las placas sean esencialmente inútiles y funcionen bastante bien (una regla udev o una lista negra de controladores para ignorar la emulación de almacenamiento masivo marginalmente rota también es una buena idea)

Sin embargo, es probable que aún deba establecer la configuración de línea serie adecuada, con algo como sttysi no fuera un programa de terminal real; sin eso (y posiblemente incluso después), no puede usar algo así catque ignora los detalles del puerto serie para interactuar con el puerto (aunque a menudo, si tiene un programa de terminal ejecutándose, puede usar echoo caty una redirección de shell al lado para escribir líneas específicas en él)

De hecho, la desinstalación de modemmanager pareció hacer que todo funcionara. Solo se ha probado ligeramente hasta ahora, pero muchas gracias por convencerme de probarlo más a fondo.
Entonces, después de más pruebas después de desinstalar el paquete modemmanager, todavía tengo problemas de conexión intermitentes. Por lo general, después de un par de minutos de intentar y volver a intentar, las cosas comienzan a funcionar. Pero, en general, estoy bastante frustrado porque todavía no puedo obtener una comunicación confiable con mi dispositivo a través de /dev/ttyACM0 con Ubuntu.