UART通信でキーボードの入出力
1.本日の内容
(1) STM32マイコン(nucleo f401RE)を使用して、UART通信を行う。
(2) UART通信を行い、Teratermにキーボードで打った文字を表示する。
・目次
2.内容
(1) 内容の詳細
・nucleof401でUART通信を行い、PCと通信を行う。
・キーボードで打った文字をTeraTermに表示する。
作成動画:
学習した動画:
(2) 使用部品
個数 | 部品名 | 型番 | |
1 | USBケーブル | USBミニBタイプ | |
1 | mbed(マイコンボード) | nucleo f401RE |
※2022年4月現在nucleo f401は楽天で買えないみたいです。
(3) STM32CubeMXの設定、プログラムを出力
(a)使用ピンを設定
・PA2:USART2_TX
・PA3:USART2_RX
(b)使用するピンの名前を変更
・PA2→右クリック→Enter Username→USART_TXとする。
・PA3→右クリック→Enter Username→USART_RXとする。
(c)Connectivity(USARTの基本設定)
・USART2を選択
・Mode:Asynchronous(非同期で行う)
・Hardware Flow Control :Disable (ハードウェアのフロー制御なし)
・NVIC Settingsを開く→USART2 global interruptのEnabledにチェックを入れる。
・Parameter Settings→今回はそのままで行う。
・Baud Rate :115200Bits/s
→通信速度、値が大きいほど1秒間に送るデータ数が多くなる。
リアルタイムで数値を取得したい場合などの場合には、大きくする必要があるが、
今回は、9600Bits/sでも良い。
・Word Length :8Bits
・Parity :None
・Stop Bits :1
(d)System Core
・NVICを選択
・USART2 global interrupt部分をクリック
・Preemption Priorityを0から1に変更
これで、マイコンの設定は終了
(e)プログラムの出力
・Project Maagerを選択
・Project Nameにプログラムの名前を入力:Practice_USART1
※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。
・Project Location:プロジェクトを保存する場所
・Application Structure:Advanced (出力するフォルダの構成を選択)
・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)
(f)GENERATE CODEで、コードを出力
(g)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。
(4) AtricTrueStdioでプログラム作成
・AtricTrueStdioを起動
・インポート元のディレクトリをクリック
・CubeMXで作成した場所を指定
・フォルダーにPractice_USART1(作成したプロジェクトの名前)が表示
・チェックされているのを確認して、終了をクリック
(b) プログラムの書き込み
・トンカチマークをクリックして、ビルドする。
・エラーが出ないことを確認する。
・下記プログラムを記載していく。
/* USER CODE BEGIN Includes */ //ヘッダファイルのインクルード #include <string.h> //アスキー文字列を使用するためのヘッダファイル /* USER CODE END Includes */ /* USER CODE BEGIN 0 */ //uart_status変数の作成 __IO uint8_t uart_status; //送受信格納用変数(8byte) uint8_t uartbuff[8]; /* USER CODE END 0 */ while(1){ /* USER CODE BEGIN 3 */ //uart_status変数の初期化 uart_status = 0; //送受信バッファのクリア memset(uartbuff,0x00,sizeof(uartbuff)); //HAL_UART_Receive_ITはUART受信割込みITを開始するための、関数 /*第一引数:使用するUARTハンドラ 第二引数:受信するためのバッファ 第三引数:受信するバイト数*/ if(HAL_UART_Receive_IT(&huart2,uartbuff,1)== HAL_OK)//受信した時 { while(uart_status != 3) //uart_statusが3以外の時はループ { switch(uart_status) { case 0:break; /*receive complete wait*/ case 1: uart_status = 2; /*UART送信開始用関数*/ /*第一引数:送信に使用するUARTハンドラ 第二引数:送信するためのバッファ 第三引数:送信バイト数*/ HAL_UART_Transmit_IT(&huart2,uartbuff,strlen((char const*)uartbuff)); break; case 2:break;/*transmit complete wait*/ case 3:break;/*end*/ }/*end of switch*/ }/*end of while*/ }/*end of if*/ } /* USER CODE END 3 */ /* USER CODE BEGIN 4 */ //UART受信割り込み確認 void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart) { if(&huart2 == huart) //huart2を受信した時 { uart_status = 1; //ステータスを1に変更 } } //どのUARTから割り込みが入ったのかを確認 //UART送信割り込み確認 void HAL_UART_TxCpltCallback(UART_HandleTypeDef*huart) { if(&huart2 == huart) //uart2を送信した時 { uart_status = 3; //ステータスを3に変更 } } /* USER CODE END 4 */
(5) プログラムの説明
(a) #include <string.h>
アスキー文字列(アルファベットや数字、記号など)を使用するためのヘッダファイル。
(b)uint8_t uartbuff[8];
・キーボードから、文字を受け取ると、このバッファに一時的に格納される。
・その受け取った文字を、mbedに、送信している。
・バッファとは、データを送受信する際に、処理速度や転送速度の差、
3.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
・SPI通信とは - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
*1:char const*)uartbuff