STM32 + LL のUSARTでprintf(float)が動くようにする
STM32マイコンのペリフェラル関連記事を一覧にまとめました。
LLライブラリでSPI通信やエンコーダモードの動作確認など、確認を行うときに、USART通信でPCにデータを出力することができない場合大変なので、LLAPIを使用したUSART通信の仕方について書いていこうと思います。今回使用するマイコンはSTM32F405RGTです。
リファレンスマニュアルを確認する
USARTで1Byte書き込み方を確認する
データシートをみていきたいと思います。
1Byteデータを送るには、
- USARTの初期化設定をする(今回は、STM32CubeMXが自動でLLAPI対応のソースコードを生成したものを使用)
- USARTが有効になっていない場合はUSARTを有効にする(CR1レジスタのUEビット=1,自動生成してもらった初期化処理のソースコードを確認して判断する)
- DRレジスタに送信するデータを書き込む
- TXEビットが立つまでまつ
という流れでプログラムを書けばいいということがわかりました。
レジスタを確認する
通信の流れはわかりましたが、TXE,RXNEビットやDRレジスタがどのようになっているのかわからないため確認をしていきます。
必要そうなところだけピックアップしました。TXEビットはSRレジスタに、DRレジスタは下位9ビット以外は予約済みであり、今回は8ビットで通信を行うことを考えているため、char型でデータの受け渡しをしても大丈夫であるということがわかりました。逆に、予約済みビットを変更してしまう可能性のある8ビット以上の数値を書き込まないようにする必要がありそうです。
STM32CubeMXの設定
設定は以下の通り行いました。今回は、前回作成したプッシュスイッチの入力状態のチェックと、float型の表示まで行いたいと考えています。
プロジェクト名やClock Configurationなどは、STM32 + LL でGPIO 機能を使用すると同じです。
今回のピン設定は以下の通りになりました。
各自の使用したいUSART機能をONにした後に、USARTxの使用するライブラリをLLライブラリに設定をしてから、コード生成をしてもらいましょう。
ソースコードの実装
初期化コードの確認
先程のデータシートを読んだ点を頼りに設定を確認してみます。GPIOポートの設定をしたのちに、ボーレート、データの長さなど初期化処理を設定処理の後にUSARTの機能をEnableにしてくれていることが、MX_USART3_UART_Init関数を読むことで分かりました。
したがって、先程確認した手順の3,4番目の処理をしてあげれば大丈夫そうであるということがわかりました。
実装
ここまでの内容を踏まえて、レジスタをたたくと次のようになります。
char ch = 'a';
USART3->DR = ch;
while ( ((USART3->SR &USART_SR_TXE)==USART_SR_TXE) == 0);
DRレジスタにchar型の数値を入れたあとにSRレジスタのTXEビットが1になるまで待つという処理を入れています。
LLライブラリの関数を用いて、関数にまとめてみると、
void USART_TransmmitByte(uint8_t ch)
{
LL_USART_TransmitData8(USART3, ch);
while (LL_USART_IsActiveFlag_TXE(USART3) == 0);
}
1byte送るプログラムを上記のように書くことができました。
printfを動くように設定する
詳しくは、STM32+HALのUSARTでprintf(float),scanf, FPUを有効可をご覧ください。
相違点は、__io_puschar関数内で呼ぶプログラムを先程実装したUSART_TransmmitByteに変えるだけなので、この記事で説明することは省略させていただきます。
printf動作確認プログラム
printfの動作確認プログラムは下記のものを使用しました
// int main内
float a = 3.14f;
while( 1 )
{
printf("hello pi = %f, pushSW = %dr", a, getPushSW() );
}
文字列、float型、プッシュスイッチの入力の表示の確認を行っています。
さいごに
LLAPIを使用してマイコンからデータの通信ができるようになりました。これで、ペリファイ関連のデバッグが捗ること間違いなしだと思います。
PCにマイコンの変数の表示ができることで、SPI通信やエンコーダモードなどデータを読み取る系のプログラムを実装をした後に、動作確認が容易にできるようになりました。次回はLLAPIを使用したTIMxのエンコーダ入力について書いていきたいと思います。
参考文献