STM32マイコンでUART通信を行った。任意のタイミングで都度、受信できるよう割り込みによる処理を行った。
使用しているマイコンボードはSTM32のテストボードNUCLEO-F446RE。
PCからrealtermでマイコンにデータを送信。マイコンで受信したデータをPCに送信しOLEDディスプレイに表示させた。
realtermでマイコンと通信する方法とOLEDの動かし方については以前の記事参照。
realtermでマイコンとUART通信
OLEDディスプレイの動かし方
マイコンのピン設定は以下のようにした。
PCとの通信はCubeMxでUSART1(ピンPA10,PA9)を使用。
割り込み処理を行う為、NVIC settimgのglobal interruptをEnable。
コード生成後、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を選択。
<前の記事
次の記事>