2

printfを使用して、ARMマイクロコントローラーのシリアルポートにテキストを表示したいと思います。私はそうすることができません。どんな助けでも大歓迎です。

私のinit_serialは次のようになります

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

これは明らかに間違っています。

4

3 に答える 3

7

putcマイクロコントローラーの場合、通常、使用しているUARTにバイトを送信する独自​​の関数を定義する必要があります。printその後、あなたを呼び出しますputc

コンパイラに付属のライブラリのドキュメントを確認してください。

これは、UARTの初期化方法とはまったく関係がないことに注意してください。重要なのは、使用しているUARTです。

(関係のない問題については、次のように言うのではなく、

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

通常#define、読みやすさを支援し、ドキュメントのビット名へのリンクを提供し、これらのようなすべての行にコメントを追加して維持する必要性を減らすレジスタ用のsがあります。例えば:

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

..等々。)

于 2009-11-10T10:33:50.757 に答える
4

printf()組み込みプラットフォームでなどを機能させるputs()には、Cライブラリで機能するいくつかのフックを実装する必要があります。これは通常、コンパイラに付属しているCライブラリに依存しているため、おそらくコンパイラに依存しています。ただし、多くの場合、ライブラリでは、(ライブラリ関数によって生成された)文字を取得して選択した出力デバイスに送信するputc()関数(または同様の名前)を指定する必要があります。printf()それは、メモリバッファ、シリアルポート、USBメッセージなどです。

Cライブラリの観点からは、putc()関数は完全に実行されるため、単純なブロッキング関数(シリアルポートが解放されるまで待機して文字を送信する)として実装するかどうかはあなた次第です。非ブロッキング(バックグラウンド割り込みタスクによって送信されるように、バッファに入れます。ただし、十分な速度で十分なバイト数を出力すると、バッファがいっぱいになり、文字をブロックまたは破棄する必要があります)。RTOSがある場合は、RTOSで正しく動作させることもできます。これにより、シリアルポートが使用可能になるまでセマフォでスリープするブロッキング書き込みが実装されます。

したがって、要約すると、コンパイラとそのCライブラリのドキュメントを読むと、動作させるために何をする必要があるかがわかりますprintf()

GCCコンパイラを使用したAVRmicroのリンク例:

newlibCライブラリを使用するARMGCCコンパイラ:

于 2009-11-11T01:05:08.613 に答える
0

特にARMについてはよくわかりません...

一部のチップでは、IDE内で、printfを使用するためにヒープが必要であること、およびヒープの大きさを指定する必要があります。プログラマーが自動的に装着することはありません。

プログラマー/IDEのメニューをチェックして、ヒープサイズを指定する場所があるかどうかを確認します。

そして、私はスティーブに同意します。これは、実際にprintfを使用できる場合のみです。それ以外の場合は、独自の小さなスニペットを作成してください。

于 2009-11-13T13:43:44.273 に答える