0

STM32F103 の世界は初めてです。STM32F103 のデモ コードがあり、arm-none-eabi を使用してコンパイルしています。

Google で見つけたものを試しましたが、これまでのところ何も機能しませんでした。私はすでにこの問題に 3 日を費やしました。

誰でもうまく動作するprintfのデモコードを教えてもらえますか?

私のメイクファイルの一部:

CFLAG   = -mcpu=$(CPU) -mthumb -Wall -fdump-rtl-expand -specs=nano.specs --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group
LDFLAG  = -mcpu=$(CPU) -T ./stm32_flash.ld -specs=nano.specs --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group
4

4 に答える 4

2

独自のprintf実装を作成することはオプションであり、おそらく私によると最も推奨されるオプションです。標準ライブラリの実装からインスピレーションを得て、要件を満たすためだけに独自のバージョンを作成してください。一般に、最初にputc関数を再ターゲットして、シリアル インターフェイスを介して char を送信する必要があります。次に、カスタム実装printfを使用してメソッドをオーバーライドします。putcおそらく、非常に単純なアプローチは、putc関数の再帰呼び出しによって文字単位で文字列を送信することです。

printf最後になりましたが、いくつかの軽量実装を見つけることができます。これらの軽量実装によって提供されるコード サイズと一連の機能は、カスタム作成printf関数とストック標準printf関数 (別名ビースト) の中間にあります。最近、このTiny Printfを試してみましたが、ARM コア上でのメモリ フットプリントと必要な実行サイクル数のパフォーマンスに非常に満足しています。

-PS

昔の自分の書き込みから転載。

于 2016-09-26T21:52:02.183 に答える
2

次のリンカー フラグを含めることにより:

LDFLAGS   += --specs=rdimon.specs -lc -lrdimon

セミホスティングと呼ばれるものを使用しようとしているようです。システムコールライブラリを含めるようにリンカーに指示しています。

セミホスティングは、ARM ターゲット上で実行されるコードが、デバッガーを実行しているホスト コンピューター上で通信し、入出力機能を使用できるようにするメカニズムです。

これらの機能の例としては、キーボード入力、画面出力、ディスク I/O などがあります。たとえば、このメカニズムを使用して、printf() や scanf() などの C ライブラリの関数を有効にし、ターゲット システムに画面とキーボードを配置する代わりに、ホストの画面とキーボードを使用できます。

STM32 開発に openSource ツール (Makefile と arm-none-eabi) を使用しているため、マイクロコントローラのプログラミングにもopenOCDを使用していると思います。openOCD では、次のコマンドを使用してセミホスティングも有効にする必要があります。

arm semihosting enable

openOCD スクリプトのコマンドで、構成段階を終了し、「init」コマンドで実行段階に入ることを確認できます。以下は、openOCD スクリプトの例です (STM32F103 に適合)。

 source [find target/stm32f1x.cfg]
 init
 arm semihosting enable

fputc()関数を UART インターフェイスにリターゲットする、ここで言及されている他のソリューションも機能し、機能する可能性があります。セミホスティングは、最近のすべての ARM Cortex-M で動作しますが、コンパイラとデバッガの構成が必要になります (上記を参照)。関数を UART インターフェイスに再ターゲットするfputc()と、どのコンパイラでも機能しますが、すべてのボードのピン構成を確認する必要があります。

于 2016-12-19T21:52:55.523 に答える
1

そこを見てくださいprintfからですglib。しかし、あなたはマイクロコントローラを持っています。printfしたがって、独自の を書く必要vfprintfがあります。結果はバッファに返され、次にバッファから UART にデータが送信されます。すこし

void printf( const char * format, ... )
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  send_via_USART1 (buffer);
  va_end (args);
}

独自に書くこともできますvsprintf。スタンダールvsprintfはとても重いです。通常、vsprintf機能のごく一部が使用されます。

于 2016-09-25T15:24:06.707 に答える