Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_2(UART通信:TeraTermにHellow表示)

​​​​

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秒までの内容を参照

設定の参考:

project-oki.hatenablog.com  

(4) AtricTrueStdioでプログラム作成
  (a) AtricTrueStdioから開く場合(上記(g)をした場合は不要)
    ・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の設定について
  (a) Connectivityの設定内容
    Connectivityは、使用するものによって、設定が異なる。
    今回は、ただ単語を表示するだけなので、非同期通信で行う。
    
    ・Asynchronous:非同期通信
     送信者のデータ送信タイミングと受信者のデータ受信タイミングを合わせずに通信を行う。

    ・Synchronous:同期通信
     データ通信のリクエストを出し、
     レスポンスが来るまでほかの処理を行わずレスポンスを待つ。

    ・Single Wire:1 Wire
     参考:​STM32F4で1Wireを使う
    ・Multiprocessor Communication:マルチプロセッサ

    ・IrDA:赤外線を利用した近距離データ通信の技術標準
     参考:​IrDAとは
    ・LIN:LINトランシーバの使用
     参考:​STM32でLIN通信
    ・SmartCard:スマートカード(ICカード)
     参考:​AN2598アプリケーションノート
     ・SmartCard with Card Clock:スマートカードクロック
      参考:​AN4800アプリケーションノート

  (b) NVIC Settingsの設定内容
    割り込みの優先度設定
(6) プログラムの説明
 (a)  uint8_t uartbuff = "Hellow world";
   ・配列の宣言と、配列にHelllow worldを入れる。

 (b)  HAL_UART_Transmit(&huart2,uartbuff,sizeof(uartbuff),100);
   ・第一引数 :&huart2
     ・イベントハンドラ
     ・UARTモジュールの構成情報を含むUART_HandleTypeDef構造体へのポインター
     ・出力したプログラム上のPrivate variablesを見ると分かる。
     ・今回の場合は、下記プログラムがある。
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;
     ・「&変数」は、「この変数のアドレスを取ってくる」という意味
     ・今回はhuart2のアドレスを取るため、&huart2となっている。
   参考:​*と&の意味と使い方

   ・第二引数: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 */
  uint8_t uartbuff = "Hello world";
  HAL_UART_Transmit(&huart2,uartbuff,sizeof(uartbuff),100);
/* USER CODE END 2 */

   別の書き方:
/* USER CODE BEGIN 2 */
  char uartbuff = "Hello world";
  HAL_UART_Transmit(&huart2,(uint8_t *)uartbuff,sizeof(uartbuff),100); 
/* USER CODE END 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 */
#include <string.h>
/* USER CODE END Includes */
   参考:​C言語strlen関数の使い方
 

3.関連記事

組み込みC言語