2016年09月15日

UART設定とPrintf

STM32で使用可能な開発環境の1つのSW4STM32を使用して、
Nucleoボード版STM32F303K8のUartについて、
戸惑った点含めて備忘録として軽くまとめます。


STM32CubeMXでUART1を有効にして、
ボーレートを9600で自動でコードを生成したコードを使用。
ライブラリはHAL。

ここで注意!
自動生成する際のUart設定のWord Lengthで初期値がなぜか7bit!!

これに気付かず、なぜかUartが文字化けるという不具合に遭遇。
クロック系やボーレートがおかしいのかと色々調査したところ、
オシロスコープで確認するとビットが欠けていることを発見!

結局、Word Lengthを8bitにするとビット欠けずにUARTの送信ができました。
7bitなんて普通では使わないので、なぜデフォルトが7bitなのか不明。
不親切だなあと思いました。


UART送信ができると、
次にやりたいのはPrintf。


メイン関数内で
色々宣言するとUARTに出力できるとかできないとか...
「STM32 printf」で検索するといろいろなやり方が出てきて、
古いやり方だったり、環境が違ったりとうまくできない感じでした。

#ifdef __GNUC__
 /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
を宣言するとかしないとか。上記のやり方はうまくいかなかった。


当方のSW4STM32とHAL、STM32CubeMXという環境では、
下記の関数をmain関数の手前で宣言することで、
UART1へ出力されることを確認しました。

int _write( int file, char *ptr, int len )
{
   HAL_UART_Transmit(&huart1, ptr, len, 1000);
  return len;
}
他にももっとよいやり方があったら教えてください。


STM32やARM系の場合、開発環境やコンパイラの組み合わせが1種類ではないため、
なかなかGoogle先生に聞いてもジャストな回答を得られないのが難点ですね。

posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/441845169
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック