Gorilla Wisdom


STM32マイコンでUART通信

STM32マイコンでUART通信を行った。任意のタイミングで都度、受信できるよう割り込みによる処理を行った。
使用しているマイコンボードはSTM32のテストボードNUCLEO-F446RE。
PCからrealtermでマイコンにデータを送信。マイコンで受信したデータをPCに送信しOLEDディスプレイに表示させた。
realtermでマイコンと通信する方法とOLEDの動かし方については以前の記事参照。


realtermでマイコンとUART通信


OLEDディスプレイの動かし方


マイコンのピン設定は以下のようにした。
PCとの通信はCubeMxでUSART1(ピンPA10,PA9)を使用。
割り込み処理を行う為、NVIC settimgのglobal interruptをEnable。

error error


コード生成後、main.cファイルを編集。受信用バッファを/* USER CODE BEGIN 0 */~/* USER CODE END 0 */の間に定義。
/* USER CODE BEGIN 0 */

uint8_t rxbuff[2];//UART受信用バッファ。用途にあわせてサイズを変更する。

/* USER CODE END 0 */


UARTペリフェラルをイネーブルにする。
/* USER CODE BEGIN 2 */~/* USER CODE END 2 */の間に記載。 __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);


stm32f4xx_it.cファイルを編集する。
/* USER CODE BEGIN 0 */~/* USER CODE END 0 */にmain.cで定義した受信用バッファをここでも定義。
/* USER CODE BEGIN 0 */

extern uint8_t rxbuff[2];

/* USER CODE END 0 */

USART1_IRQHandler関数内でUARTの受信をする。
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */

/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
HAL_UART_Receive_IT(&huart1,rxbuff,sizeof(rxbuff)); //ここで受けるとwhileの邪魔にならず繰り返し使える。rxbuffサイズ分受信したらmain.cのRxp...に移動
/* USER CODE END USART1_IRQn 1 */
}


最後にmain.cのHAL_UART_RxCpltCallback関数内でデータ受信後の処理を記載する。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
char strBuffer[17] = {0};
oled_cmd(0x02); //ReturnHome
sprintf(strBuffer, "CNT1=%c", rxbuff[0]);
oled_puts(strBuffer);
oled_move(0x20);
sprintf(strBuffer, "CNT2=%c", rxbuff[1]);
oled_puts(strBuffer);

HAL_UART_Transmit_IT(&huart1,rxbuff,sizeof(rxbuff));//割り込み送信

}


今回のUART設定ではバリティで1bit使っているのでrealtermのポート設定の[Data Bits]は7bitを選択。

error

<前の記事

次の記事>