Pregunta

Me gustaría usar printf para visualizarlo texto en un puerto serie de un microcontrolador ARM. Soy incapaz de hacerlo. Cualquier ayuda es apreciada.

Mi init_serial se parece a esto

void init_serial (void)
{
PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR = 0x00000083; /*8 bits, 1 Stop bit */
U1DLL = 0x000000C2; /*9600 Baud Rate @12MHz VPB Clock */
U1LCR = 0x00000003; /* DLAB=0*/
}

que es obviamente erróneo.

¿Fue útil?

Solución

Para microcontollers, normalmente se tiene que definir su propia función putc para enviar bytes a lo UART que está utilizando. print A continuación, llame a su putc.

Consulte la documentación de las bibliotecas suministradas con su compilador.

Tenga en cuenta que esto es del todo ajeno a la forma en que intialise su UART. Lo único que importa es que UART que está utilizando.

(En un asunto relacionado, en lugar de decir:

PINSEL0 = 0x00050000; /* Enable RXD1 TxD1 */
U1LCR   = 0x00000083; /*8 bits, 1 Stop bit */

hay #defines normalmente para los registros de los cuales (por lo general) de legibilidad ayuda, proporcionar un enlace a los nombres de bits en la documentación, y reducir la necesidad de que se añadan comentarios y mantenidos en cada línea como estos. Por ejemplo:

PINSEL0 = PICSEL0_RXD1EN | PICSEL0_TXD1EN;
U1LCR   = U1LCR_8BITS | U1LCR_1STOPBIT;

.. y así sucesivamente.)

Otros consejos

Para hacer printf() , puts() trabajo, etc. en una plataforma integrada, es necesario implementar algunos ganchos que funcionan con la biblioteca C. Esto es típicamente dependiente de las bibliotecas de C proporcionadas con su compilador, por lo que es probablemente dependiente del compilador. Pero en muchos casos la biblioteca sólo requiere que proporcione una putc() función (o nombre similar), que tiene un carácter (generada por el printf() función de biblioteca) y lo envía a el dispositivo de salida elegido. Eso podría ser un búfer de memoria, puerto serie, el mensaje USB, lo que sea.

Desde el punto de vista de la biblioteca C, el putc() función sería dirigido a la terminación, por lo que depende de usted si se implementa a ser una función de bloqueo sencillo (esperar hasta el puerto serie está libre y el envío del personaje), o de no bloqueo (ponerlo en un buffer, para ser enviado por una tarea de fondo de interrupción; pero la memoria intermedia podría llenarse si lo suficiente como bytes de salida lo suficientemente rápido, y luego tienes que tampoco bloquear o descartar caracteres). También puede hacer que funcione correctamente con su RTOS si tiene uno, la implementación de una escritura de bloqueo que duerme en un semáforo hasta que el puerto serie está disponible.

Así, en resumen, lea la documentación de su compilador de C y su biblioteca, y que debería decirle lo que tiene que hacer para que printf() trabajo.

enlaces de ejemplo para AVR micro con compilador GCC:

compilador ARM GCC usando la biblioteca newlib C:

No estoy seguro acerca de ARM en particular ...

En algunos chips, dentro del IDE, es necesario especificar que se necesita un montón de utilizar la función printf, y lo grande que debe ser. El programador no se pondrá automáticamente en uno.

Compruebe en los menús de su programador / IDE y ver si hay un lugar para especificar el tamaño del montón.

Y estoy de acuerdo con Steve, esto es sólo si en realidad se puede utilizar la función printf, de lo contrario escribir su propio pequeño fragmento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top