STM32で使用可能な開発環境の1つのSW4STM32を使用して、
Nucleoボード版STM32F303K8のUartについて、戸惑った点含めて備忘録として軽くまとめます。
STM32CubeMXでUART1を有効にして、
ボーレートを9600で自動でコードを生成したコードを使用しました。
自動生成する際のUart設定でWord Lengthに注意が必要です。HALのバージョンによってはWord Lengthの初期値がなぜか7bitになっています。
これに気付かず、なぜかUartが文字化けるという不具合に遭遇。結局、Word Lengthを8bitにするとビット欠けずにUARTの送信ができました
7bitなんて普通では使わないので、なぜデフォルトが7bitなのか不明です。
UART送信ができると、次にやりたいのはPrintfです。「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__ */
/* 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;
}
{
HAL_UART_Transmit(&huart1, ptr, len, 1000);
return len;
}
STM32やARM系の場合、開発環境やコンパイラの組み合わせが1種類ではないため、
なかなかGoogle先生に聞いてもジャストな回答を得られないのが難点です。
”syscalls.cファイル”を使う方法は、私の理解を超えていて分かりませんでしたので。