こんにちはショウです。前回はUARTとFPUの設定を行ったので今回は実際にPCと通信をさせていきたいと思います。
参考URLを見ながら作成していきます。
LLライブラリを使った1Byteシリアル通信
LLライブラリでUARTの設定を行います。
LLライブラリには1Byte転送をしてくれる関数が用意されています。LL_USART_TransmitData8という関数を使用して転送を行います。
char ch = 'a'; LL_USART_TransmitData8(LPUART1,ch);
LL_USART_TransmitData8の第一引数は今回使うST-Linkに接続されているLPUART1を指定します。ここをUSART1にすると前回設定したUSART1を使うことができます。第二引数は転送する文字を入れます。
もしUSARTピンを設定していない場合にはLPUARTの専用のLLライブラリがあるのでそちらを使うことになります。
LL_USART_TransmitData8を使ってアルファベット1文字を転送してみます。
Tera Termを使って確認をします。Tera Termの通信速度の設定を合わせてからマイコンをリセットすると、下のように表示されます。
printfを使ったシリアル通信
LLライブラリの関数を使って1文字の転送ができるようになりました。
しかし、走行データなどの情報をUARTで出力するには1文字転送では不便なので複数文字の転送を行えるようにします。
データ長を見てfor文でループすれば作れるのですが、C言語でよく使うprintf関数を使用して転送できるようにします。
まずは転送終了を待つ関数をmain.cに用意します。LL_USART_IsActiveFlag_TXE関数を使って転送終了のフラグを待つようにします。
void USART_TransmitByte(uint8_t ch){ LL_USART_TransmitData8(LPUART1,ch); while(LL_USART_IsActiveFlag_TXE(LPUART1)==0); }
これで連続転送をしても転送処理が終わるまでは次の処理が入らなくなりました。
次にprintf関数を使えるようにします。
まずはstdio.hとstdint.hをインクルードします。
printf関数を使うにはsyscalls.cの中にある_write関数を使います。_write関数を見てみると__io_putcharという関数を使用していることがわかります。
この__io_putchar関数は定義のみされていて実体がないので自分でmain.cの中に作成します。
void __io_putchar(uint8_t ch){
USART_TransmitByte(ch);
}
printfで普段同じようにプログラムを書きます。
ただしmain関数の最初にsetbufを使ってバッファをクリアしておく必要があります。
前回Use Float with printf from newlib-nanoを有効化したのでfloatを表示できるようになっています。(デフォルトでは表示できないそうです。)
main関数に下のコードを書いて確認します。
/* USER CODE BEGIN 1 */ float pi = 3.14; setbuf(stdout,NULL); /* USER CODE END 1 */ 省略 /* USER CODE BEGIN 2 */ printf("test\r\n"); printf("%f\r\n",pi); /* USER CODE END 2 */
これでPCと通信ができるようになりました。