LoginSignup
1
0

More than 1 year has passed since last update.

STM32 と Raspberry Pi間で UART 通信

Last updated at Posted at 2021-11-09

はじめに
STM32L432 上で UART通信を行う場合の手順です。
ここでは、相手側から "GetVersion" という文字列(コマンド)が 送られて来た場合、
"Ver 1.10" と送り返します。

相手側は、UART通信を行えるデバイスであれば良いかと思います。
これに対応デバイスを Raspberry Pi とした時のサンプルコードは、下記を参考。
https://qiita.com/ytetsuo/items/502ddcb0430a41dcaed4

こちらも参考:https://qiita.com/ytetsuo/items/7b1086391b6ba0d35fe4


STM32CubeMXでの設定
UART1_TX を PA9 / UART1_RX を PA10 に割り付ける。
この時、NVIC Setting(割込み) にチェックを入れておくこと。

尚、UART2 は STM32で受信したデータを Tera Term に表示させるために使用している。
https://qiita.com/ytetsuo/items/f5697418961d8a909dd3
ここで 説明している ソースコードの修正も必要です。(以下には、触れていません)

image.png

上記の設定で 生成されたソースコードを修正する
修正するコードは、main.c のみ!!
※STM32が受け取った文字列を Tera Term に出力不要な 場合には、printf() を削除して下さい。

mainc.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************

~ 省略 ~

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
/* USER CODE END Includes */

 省略 

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
__IO uint8_t uart_status;
uint8_t uartbuff[30];
uint8_t version[18]="Ver 1.10\r\n\r\n";
/* USER CODE END 0 */

 省略 

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    uart_status = 0;
    memset( uartbuff, 0x00, sizeof(uartbuff) );
    if( HAL_UART_Receive_IT( &huart1, uartbuff, 11 ) == HAL_OK )
    {
      while( uart_status != 4 )
      {
        switch( uart_status )
        {
          case 0:
            break; /* recive complete wait */

          case 1: /* recive complete.*/
//          printf("Command:%s\r\n", (uint8_t *)uartbuff);
            if(strcmp((uint8_t *)uartbuff, "GetVersion\r")==0)
            {
              uart_status = 3; /* get command (request Version*/
//            printf("Command:%s\r\n", (uint8_t *)uartbuff);
            }
            else
            {
              uart_status = 4; /* Reset */
              printf("Command Error!!\r\n");
            }
            break;

          case 2:
            break; /* transmit complete wait */

          case 3: /* send response */
            if(HAL_UART_Transmit_IT( &huart1, version, strlen((char const *)version)) == HAL_OK)
            {
              printf("Response:%s", (uint8_t *)version);
            }
            break; /* end */

          case 4:
            break; /* end */

        } /* end of switch */
     } /* end of while */
   } /* end of if */
  }
  /* USER CODE END 3 */
}

 省略 

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if( &huart1 == huart )
  {
    uart_status = 1;
  }
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  if( &huart1 == huart )
  {
    uart_status = 4;
  }
}/* USER CODE END 4 */


☆2021年11月 9日(火) 午後3時30分 初版(Ver1.00) 作成


1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0