ねころこの備忘録

僕の開発の手順とか実験結果とか感想とかをつらつら書き込んでいくお墓.僕の魂を成仏させるためのお墓です.お経(いいね・ブクマ・コメント)待ってます

STM導入-HALでUARTまで-

前回の導入記事の続き
www.nekorokomemordm.info


今回はHALを使ったUARTについてです.

UART

STM32CubeMXを確認してみると,UART2(俗にいうPCSerial的な)が既に宣言されているのがわかる.なので,UART2を使ってPCと通信をする.
while文を下記のように書き換える.

  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
	  ButtonStatus = HAL_GPIO_ReadPin(B1_Blue_GPIO_Port, B1_Blue_Pin);
	  HAL_GPIO_WritePin(GreenLED_GPIO_Port, GreenLED_Pin, !ButtonStatus);
	  char transmitData[16];
	  sprintf(transmitData, "data is %d\r\n", !ButtonStatus);
	  HAL_UART_Transmit(&huart2, (uint8_t *)transmitData, sizeof(transmitData), 0x10);
  }
  /* USER CODE END 3 */

次にTeratermを起動して,接続をする.

BaudrateはCubeMXのConfigrationの中で,UART2をダブルクリックすると,下記画面が出てくるので確認をする.もしくは,uart.cの中のvoid MX_USART2_UART_Init(void)でも宣言されている.

f:id:ryuga13tk:20190122184118p:plain
これで,Build実行する.
f:id:ryuga13tk:20190122184127p:plain

UARTもこれで実行が確認できる.

受信完了割り込み

UARTでは受信完了割り込みや送信完了割り込みも用意されているのでそれを書いてく.
まず,STM32CubeMXでUART2を以下のようにUSART2 global interruptにチェックを入れる.
f:id:ryuga13tk:20190122184230p:plain

プログラムを以下のように変更する.
main関数の外に,割り込み完了用の関数を再定義しておく.この関数は,weakで既に宣言してあるので,mainで宣言する必要がある.

int ButtonStatus;
char RxData;
int warikomi_led;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  warikomi_led = !warikomi_led;
  HAL_UART_Receive_IT(&huart2, &RxData, 1);
  //-->割り込みの設定
  HAL_GPIO_WritePin(GreenLED_GPIO_Port, GreenLED_Pin, warikomi_led);
}

次にmain関数で

warikomi_led = 0;
  while (1)
  {
	  HAL_UART_Receive_IT(&huart2, &RxData, 1);
	  //-->割り込みの設定
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

	  char transmitData[16];
	  sprintf(transmitData, "data is %c\r\n", RxData);
	  HAL_UART_Transmit(&huart2, (uint8_t *)transmitData, sizeof(transmitData), 0x10);
	  //-->受信データを返している
  }

これで,Teretermでキーボードを押すと,押した後にLEDが点滅して,押した英字が返ってくる.

f:id:ryuga13tk:20190122184403p:plain

送信完了割り込みは,ほとんど同じなので割愛._ITを付ければ,使える.

次回はベーシックタイマーペリフェラルの話.