HALとCubeMxを使ったSTM32Fxxxの受信割り込みの備忘録
STM32Fをある仕事で使ってみたら慣れてくるととても使い易いのとマイコンの単価も比較的安いの他の仕事にも使おうかと評価してます。
ここで嵌ってしまったのが、受信割込のコード記述で、CubeMxで自動生成されたコードにHALライブラリを使ってどうするのか、Web上では情報がまだ少なく四苦八苦。
ちょっとメモでポイントをまとめてみた。
開発環境は、Atollic TrueSTUDIO
for STM32 ver9

マイコンは、STM32F303を搭載したNucleo-144
基本的には、UARTの差ぐらいでどれを使ってもあまり変わらないみたい。
1.CubeMxを起動して新しいプロジェクトを作ると、マイコンまたはボード選択の画面になるので使用する使っているボードを選ぶ。
2.始めに144pinのマイコン画面(Pinout)がでるけど、既に自動設定されているのでそのまま。
3.次にConfigrationタブを選んで、有効になっているUART3(UART2のもある)をクリックして詳細の設定
4.ParameterSettingsで通信速度とか設定、NVICで割込をイネーブルにしておく。(重要)
5.最後にProject>Settingでプロジェクトネームを入力、Toolchain/IDEは"TrueSTUDIO"(←忘れる)にしておく。
6.最後にProject>Genarate Codeを実行すれば初期化のコードが全て自動生成される。
次に自動生成されたコートに受信割込処理を追加するが、念のため追加前に一回ビルドしてみる。(大抵は正常にビルドできてhexファイルが生成される)
CubeMxを使うとハードウェアの設定を変える時に、自分で追加したコードが勝手に上書きされないように作法(user codeのエリア)に従って書かねばならない。
1.割込待ち状態にする関数
割込を受け付けられるようにmain関数のイニシャル時(USER CODE BEGIN 2)にHALの割込処理を入れる。
HALライブラリの送信の確認のために、イニシャル時には5バイトだけ送信の記述も追加。
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart3, &RxData, 1);//1バイト受信割込待ちの準備
HAL_UART_Transmit(&huart3,TData, 5, 1);
/* USER CODE END 2 */
2.コールバック関数の追加
昔誰かが作ったソースには、作成者がコールバック関数のプロトタイプ宣言を自ら記述していたが、既に自動生成されていた。
コールバック関数は取りあえずmain.cなかのUSER CODE BEGIN 4に入れてみて実験。(後で他に移す予定)
取りあえず使わないが送信割込も記述した。
/* USER CODE BEGIN 4 */
/*--- Interrupt ---*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle){}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){
HAL_UART_Receive_IT(&huart3, &RxData, 1);//次の割込待ち準備
}
/* USER CODE END 4 */
以上のコードを追加してビルド、デバッグモードに切り替えてRUNさせる。
UART3はデバッグインターフェースでも使っているが、仮想UARTがIDE上で使えるので便利です。Open a terminalでIDE上の認識されているComportを開けばそのまま送受信できる。
私が嵌ったのは1.割込待ち状態にする関数を書かなかったので、コールバック関数内にブレークポイントをかけて走らせ、ターミナルウィンドウから文字を送ってもまったくプレークポイントで引っかからなかった。
よくよく考えると自分で全て書いているときは、割込許可は当然なのでした。