STM32L010 USARTの使い方


USART2とPCで通信するプログラムを作成します。
PCから受信したデータをPCへ返送します。

1. デバイスの設定

1.1. USART2の設定

Connectivity内USART2を選択。ModeをAsynchronousに設定。




Parameter Settingsを以下の様に設定します。




1.2. 割込みの設定


NVIC Interrupt Tableを選択しEnabledにチェックを入れます。
その後、Code Generateを実行。




2. 受信割込み処理のコーディング

2.1. 受信割込み処理

USER CODE PV BEGINの下に外部変数を追加します。
ここでは uint8_t g_ubBufferとします。
この外部変数は受信割込みでデータを受け取るバッファとして使用されます。
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
static uint8_t	g_ubBuffer;

/* USER CODE END PV */
				
USER CODE BEGIN 2の下に。HAL_UART_Receive_ITを記述します。
これで受信割込み許可となります。
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2, &g_ubBuffer, 1);

  /* USER CODE END 2 */
				
USER CODE BEGIN 4の下に割込み処理関数を記述します。
関数名はHAL_UART_RxCpltCallback固定です。
HAL_UART_Transmit_IT関数でg_ubBufferを送信します。
HAL_UART_Receive_IT関数で受信割込みを再許可します。
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart2, &g_ubBuffer, 1);
	HAL_UART_Receive_IT(&huart2, &g_ubBuffer, 1);
}

/* USER CODE END 4 */
				
コーディングはここまでです。



2.2 受信バッファとHAL_UART_Receive_IT関数

受信バッファg_ubBufferを配列にした場合、受信バッファフルとなった時に
HAL_UART_RxCpltCallbackが呼び出されます。
この例であれば、8バイト受信したときに呼び出されます。
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
static uint8_t	g_ubBuffer[8];

/* USER CODE END PV */
				
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2, g_ubBuffer, 8);

  /* USER CODE END 2 */
				
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart2, g_ubBuffer, 8);
	HAL_UART_Receive_IT(&huart2, g_ubBuffer, 8);
}

/* USER CODE END 4 */
				

3. USART割込みの仕組み

受信割込み処理がどのような流れになっているか解説します。
赤枠の部分がUSART2で、USART2割込みが発生するとUSART2_IRQHandlerが呼び出されます。
以下は、startup_stm32l010f4px.sからの抜粋で、ベクタテーブルです。




1バイト受信すると、受信割込みが発生しUSART2_IRQHandlerが呼び出されます。




USART2_IRQHandlerからHAL_UART_IRQHandlerが呼び出されます。




ステップオーバーで進めるとhuart->RxISRが呼び出されます。


huart->RxISRHAL_UART_Receive_ITUART_RxISR_8BITが設定されます。






huart->RxISRでステップインすると、UART_RxISR_8BITが呼び出されます。


ステップオーバーで進めていくと、HAL_UART_RxCpltCallbackが呼び出されます。




回路図は以下の通りです。