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 :3333
para 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
.
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 modemmanager
paquete 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 modemmanger
desinstalado. 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 stty
si no fuera un programa de terminal real; sin eso (y posiblemente incluso después), no puede usar algo así cat
que ignora los detalles del puerto serie para interactuar con el puerto (aunque a menudo, si tiene un programa de terminal ejecutándose, puede usar echo
o cat
y una redirección de shell al lado para escribir líneas específicas en él)
Pico de voltaje
viejo contador de tiempo
viejo contador de tiempo
andres paja
Deván
andres paja