UART通信を行う(Hellow worldの表示)
1.本日の内容
(1) STM32マイコン(nucleo f401RE)を使用して、UART通信を行う。
(2) UART通信を行い、TeratermにHellow worldを表示する。
目次
2.内容
(1) 実施内容の詳細
・nucleof401でUART通信を行い、PCと通信を行う。
・mbed起動時に、TeraTermにHellow Worldを表示する。
・設定方法及び意味を記載する。
(2) 使用部品
個数 | 部品名 | 型番 |
---|---|---|
1 | USBケーブル | USBミニBタイプ |
1 | mbed(マイコンボード) | nucleo f401RE |
(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が自動的に起動される。
・下記動画の2分13秒までの内容を参照
設定の参考:
(4) AtricTrueStdioでプログラム作成
・AtricTrueStdioを起動
・インポート元のディレクトリをクリック
・CubeMXで作成した場所を指定
・フォルダーにPractice_USART1(作成したプロジェクトの名前)が表示
・チェックされているのを確認して、終了をクリック
(b) プログラムの書き込み
・トンカチマークをクリックして、ビルドする。
・エラーが出ないことを確認する。
・下記プログラムを記載する。
/* USER CODE BEGIN 2 */ //uartbuffにHellow worldの文字列を格納 uint8_t uartbuff[] = "Hello world"; //UART通信送信 //uartbuffを送信 HAL_UART_Transmit(&huart2,uartbuff,sizeof(uartbuff),100); /* USER CODE END 2 */
(5) STM32CubeMXの設定について
Connectivityは、使用するものによって、設定が異なる。
今回は、ただ単語を表示するだけなので、非同期通信で行う。
・Asynchronous:非同期通信
送信者のデータ送信タイミングと受信者のデータ受信タイミングを合わせずに通信を行う。
(b) NVIC Settingsの設定内容
割り込みの優先度設定
(6) プログラムの説明
・配列の宣言と、配列にHelllow worldを入れる。
(b) HAL_UART_Transmit(&huart2,uartbuff,sizeof(uartbuff),100);
・第一引数 :&huart2
・イベントハンドラ
・UARTモジュールの構成情報を含むUART_HandleTypeDef構造体へのポインター
・出力したプログラム上のPrivate variablesを見ると分かる。
・今回の場合は、下記プログラムがある。
/* Private variables ---------------------------------------------------------*/
・「&変数」は、「この変数のアドレスを取ってくる」という意味
参考:*と&の意味と使い方
・第二引数:uartbuff
・データバッファ
・uint8_t又はuint16_tどちらかの型を使用する。
・送信データがこれにあたる。
・今回の場合は、uartbuff
・第三引数:sizeof(uartbuff)
・送信されるデータ要素
・uint8_t又はuint16_tどちらかの型を使用する。
・今回は、sizeof(uartbuff)により、uartbuffのメモリサイズを取得している。
・第四引数:100
・タイムアウト時間
・データ送信時間、この時間以上になると失敗となる。
・uint32_tの型を使用する。
・今回は数値(100)を直接書いた。
・多分単位はmsだけど。ここには、書いてない。
(c)UARTの通信について
UART通信の送信プログラムについては下記データシートを参照する。
・UM1725
このデータシートで、HAL_UART_Transmitと検索すると下記のようなページがある。
これが、上記第一引数~第四引数についての内容である。
(7) 別の書き方(補足)
/* USER CODE BEGIN 2 */
別の書き方:
/* USER CODE BEGIN 2 */
これでも、結果は同じになる。
通常、C言語で文字列は昔からの習わしでcharが使われることが多い。
参考:C言語ゼミ(char-文字を表現する型)
この場合、Transmitでは、uint8_t又はuint16_tである必要があるため、
その部分だけ型変換を行っている。
→(uint8_t *)uartbuff
また、ここではsizeof()を使用しているが、strlenという文字列の長さを取得するものがある。
その場合は、
uint8_t uartbuff = "Hello world";
HAL_UART_Transmit(&huart2,uartbuff,strlen((char*)uartbuff),100);
とする。
strlenを使用する場合は、string.hのヘッダをインクルードする必要があるので、
下記宣言が必要。
/* USER CODE BEGIN Includes */
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