2009-11-09 12 views
2

Je voudrais utiliser printf pour afficher du texte sur un port série d'un microcontrôleur ARM. Je suis incapable de le faire. Toute aide est appréciée.Utilisation de Printf pour afficher sur le port série d'un microcontrôleur ARM

Mon init_serial ressemble à ceci

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*/ 
} 

ce qui est évidemment faux.

+0

Vous aurez probablement besoin de fournir plus d'informations pour obtenir une réponse: (a) Quel microcontrôleur, exactement? "ARM" spécifie simplement le jeu d'instructions. (b) Pourquoi le code ci-dessus est-il "manifestement" incorrect? Il y a beaucoup de pièces qui travaillent ensemble pour faire 'printf()' travail, l'initialisation du port série est juste l'un d'eux. Savez-vous * que c'est la mauvaise partie? (c) Avez-vous un exemple de code qui fonctionne, peut-être fourni par le fabricant? (d) Avez-vous un oscilloscope? –

+0

Par exemple microcontrôleur LPC213x. Ce code est incorrect car il ne fonctionne pas avec printf. Ne pas avoir de code qui fonctionne. –

Répondre

7

Pour les microcontollers, vous devez généralement définir votre propre fonction putc pour envoyer des octets à l'UART que vous utilisez. print appellera alors votre putc.

Consultez la documentation des bibliothèques fournies avec votre compilateur. Notez que cela n'a aucun rapport avec la façon dont vous initialisez votre UART. Tout ce qui compte, c'est dont vous utilisez UART.

(Sur une question sans rapport, plutôt que de dire:

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

il y a généralement #define s pour les registres qui (habituellement) la lisibilité de l'aide, fournir un lien vers les noms de bits dans la documentation, et de réduire la nécessité des commentaires à ajouter et maintenus sur chaque ligne comme ceux-ci, par exemple:..

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

..et ainsi de suite)

4

pour printf(), puts() etc fonctionne sur une plate-forme intégrée, vous devez implémenter quelques hooks qui fonctionnent avec la bibliothèque C. Cela dépend généralement des bibliothèques C fournies avec votre compilateur, donc dépend probablement du compilateur. Mais dans de nombreux cas, la bibliothèque vous demande simplement de fournir une fonction (ou un nom similaire) qui prend un caractère (généré par la fonction de bibliothèque printf()) et l'envoie à votre périphérique de sortie choisi. Cela pourrait être un tampon mémoire, un port série, un message USB, peu importe.

Du point de vue de la bibliothèque C, la fonction putc() serait exécuté à la fin, il est à vous si vous le mettre en œuvre pour être une simple fonction de blocage (en attente jusqu'à ce que le port série est libre et l'envoi du caractère), ou non-bloquant (le mettre dans un tampon, pour être envoyé par une tâche d'interruption en arrière-plan, mais le tampon peut se remplir si vous produisez assez d'octets assez vite, et vous devez bloquer ou supprimer les caractères). Vous pouvez également le faire fonctionner correctement avec votre RTOS si vous en avez un, en implémentant une écriture bloquante qui dort sur un sémaphore jusqu'à ce que le port série soit disponible.

Donc, en résumé, lisez la documentation de votre compilateur et sa bibliothèque C, et il devrait vous dire ce que vous devez faire pour printf() travail.

liens Exemple pour AVR micro avec le compilateur GCC:

ARM compilateur GCC à l'aide de la bibliothèque newlib C:

0

Je ne suis pas sûr ARM en particulier ...

Pour certaines puces, au sein de l'IDE, vous devez spécifier que vous avez besoin d'un tas d'utiliser le printf et quelle devrait être sa taille. Le programmeur n'en mettra pas automatiquement un.

Vérifiez dans les menus de votre programmeur/IDE et voir s'il y a un endroit pour spécifier la taille du tas.

Je suis d'accord avec Steve, c'est que si vous pouvez réellement utiliser le printf, sinon écrire votre propre petit extrait.