2016-09-23 8 views
0

私はSTM32F103の世界で初めてです。私はSTM32F103のデモコードを持っており、コンパイルするにはarm-none-eabiを使用しています。STM32F103でprintfを作成するには?

私は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 
+1

「動作しない」とはどういう意味ですか?それはマイクロコントローラーです。テキストはどこに印刷されると思いますか?通常、埋め込みターゲットをプログラミングするときは、UART(または他の通信プロトコル)を使用する独自の 'print'関数セットを作成します。いくつかのUARTライブラリ、またはデバッガを使用するデバッグライブラリを探します(Seggerデバッガを使用している場合は、PC上のJLinkビューアでSegger RTTなど) – Tim

+0

私はarm-none-eabi- to comipleを使用します。それが問題です。私はkeilプロジェクトでprintfを使う方法を知っています。私はUSART1を使って出力します。このコンパイラを使用してbinファイルを作成しようとしますか? –

答えて

0

Look there。これは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も書き込むことができます。 Standart vsprintfは非常に重いです。通常、vsprintf機能のほとんどの部分が使用されます。

2

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

最後に、軽量のprintfの実装を見つけることができます。これらの軽量実装によって提供されるコードサイズと機能セットは、カスタム書込みprintf関数とストック標準printf関数(別名ビースト)の間にあります。私は最近、このTiny Printfを試してみました。そして、ARMのコアでのパフォーマンスと、必要な実行サイクル数という点で非常に満足しています。バック私自身writingsいつかからコピー

-PS

1

リンク:How to retarget printf() on an STM32F10x?

ので、同じよう_write機能をハイジャックしてみてください。

#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 

int _write(int file, char *ptr, int len) 
{ 
    switch (file) 
    { 
    case STDOUT_FILENO: /*stdout*/ 
     // Send the string somewhere 
     break; 
    case STDERR_FILENO: /* stderr */ 
     // Send the string somewhere 
     break; 
    default: 
     return -1; 
    } 
    return len; 
} 

元のprintfは(あなたはもちろん使用するものLIBSに応じて)この機能を通過します。以下のリンカのフラグを含むことで

+0

私はSTM32F072でこのメソッドを使用しています。詳細はこちら。 http://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32/279945#279945 –

0

:あなたはセミホスティングと呼ばれるものを使用しようとしているよう

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

それが見えます。リンカーにシステムコールライブラリを含めるように指示しています。

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

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

あなたは(Makefileと腕-なし-EABI)あなたのSTM32の開発のためのオープンソースのツールを使用しているので、私はあなたにも、あなたのマイクロコントローラをプログラムするopenOCDを使用していると仮定しています。 openOCDでは、次のコマンドを使用して、同様セミホスティング有効にする必要があります。

arm semihosting enable 

あなたはあなたのopenOCDスクリプトにコマンドで使用すると、コンフィギュレーションの段階を終了し、「initは」コマンドで実行段階に入ることを確認することができます。以下は、(STM32F103のために適合さ)openOCDスクリプトの例です:

source [find target/stm32f1x.cfg] 
init 
arm semihosting enable 
あなたのUARTインターフェースにfputc()機能を再ターゲットここで言及

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

関連する問題