Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_8(UART通信:キーボード)

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でプログラム作成
  (a) AtricTrueStdioから開く場合(上記(g)をした場合は不要)
    ・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];

   ・UARTの送受信用バッファ
   ・キーボードから、文字を受け取ると、このバッファに一時的に格納される。
   ・その受け取った文字を、mbedに、送信している。
   ・バッファとは、データを送受信する際に、処理速度や転送速度の差、
      タイミングのズレなどを補うために、
    データを一時的に蓄えておく記憶装置や記憶領域のこと。
 
 (c) memset(uartbuff,0x00,sizeof(uartbuff));
   ・uartbuffの全ての値を0にしている。(初期化)
 
 (d)動作:
  ・1:キーからUART通信で文字が送られてくる。
  ・2:HAL_UART_Receive_IT(&huart2,uartbuff,1)== HAL_OKで
     UARTの受信確認及び送られてきた文字をuartbuffに格納。
  ・3:HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart)で
     UARTの受信完了時に、ステータスを1に変更
     受信完了までは、ステータスが0なので、 while(uart_status != 3)で
     ループ
  ・4:ステータスを2に変更
     HAL_UART_Transmit_IT(&huart2,uartbuff,strlen*1;
     でテラタームにuartbuffを送信
  ・5:HAL_UART_TxCpltCallback(UART_HandleTypeDef*huart)で
     UARTの送信完了時に、ステータスを3に変更
     送信完了までは、ステータスが2なので、while(uart_status != 3)で
     ループ
  ・6:送信完了により、ステータスが3のためwhile(uart_status != 3)で
     ループから抜ける。
  ・7:while(1){ でキーの受信待ちループ


詳しくは、youtubeで解説しているので、そちらをご覧ください。
 

3.関連記事

組み込みC言語
 

*1:char const*)uartbuff