stm32でUART通信

投稿者:

マイコン内での変数やらの値をPCで読むためによく使うUART通信の備忘録。

 

厳密にいうと違いますが、UART通信はシリアル通信の上位互換的なものなので、シリアル通信をしたいときもこれでいけます。

 

今回は、stm32のf303k8を使いました。

使用環境

  • OS:Windows10 Home
  • CPU:i5-6200U
  • IDE:System Workbench for STM32
  • STM32CubeMX(初期コード作成に使用)

 

初期コード作成

いつも通り、CubeMXで初期コードを作成していきます。

 

ボードを選択した後、PinoutのUSART1のModeをAnsynchronousに設定します。

 

するとPA9、PA10が緑色になり、それぞれUSART1_RX、USART1_TXになると思います。

 

ここまで来たら、ConfigurationでUSARTの設定をします。

ボーレートはあまり大きくし過ぎると通信エラーのもとになるようなのでほどほどにします。

 

このボーレートは送信側、受信側が合わせていないときちんと受信できません。

メイン関数

次はメイン関数の内容です。

 

といってもCubeMXにてペリフェラル周りのコードは作成してあるので、USRT用の送信バッファ、受信バッファを用意して、無限ループ内で受信、又は送信のコードを追加するだけです。

 

まずUAER CODE BEGIN 0辺りに、

char rxbuf[1];
char txbuf1[] = "'A' pressed\r\n";
char txbuf2[] = "'B' Pressed\r\n";
char txbuf3[] = "Other Pressed\r\n";

と記述して置きます。

 

次に、while文を

while (1)
  {
	  HAL_UART_Receive(&huart1, (uint8_t *)rxbuf, sizeof(rxbuf), 0xF);

	  if(rxbuf[0] != 0){
	      if(rxbuf[0] == '1'){
		HAL_UART_Transmit(&huart1, (uint8_t *)txbuf2, sizeof(txbuf2), 0xFFFF);
		rxbuf[0] = 0;
	      }else if(rxbuf[0] == '2'){
		HAL_UART_Transmit(&huart1, (uint8_t *)txbuf3, sizeof(txbuf3), 0xFFFF);
		rxbuf[0] = 0;
	      }else if (rxbuf[0] == '3'){
		HAL_UART_Transmit(&huart1, (uint8_t *)txbuf4, sizeof(txbuf4), 0xFFFF);
		rxbuf[0] = 0;
	      }else{
		HAL_UART_Transmit(&huart1, (uint8_t *)txbuf1, sizeof(txbuf1), 0xFFFF);
		rxbuf[0] = 0;
	      }
	}

 

これで、PCでTeratermとかを使って通信ができます。

 

文字化けしているときはボーレートが合っているかや、文字コードの設定を見直しましょう。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください