はじめに
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
ここで 説明している ソースコードの修正も必要です。(以下には、触れていません)
上記の設定で 生成されたソースコードを修正する
修正するコードは、main.c のみ!!
※STM32が受け取った文字列を Tera Term に出力不要な 場合には、printf() を削除して下さい。
/* 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) 作成