STM32マイコンのシリアルUART受信の割込みについて少し紹介します。
STM32マイコンのHALライブラリを使用してUART受信をする場合は割込みHAL_UART_Receive_ITか、DMA受信転送HAL_UART_Receive_DMAのどちらかを多く使用します。
HAL_UART_Receiveを使用しない理由として、ブロッキング処理のためUART受信するまで他の処理が停止してしまいます。
一方、HAL_UART_Receive_IT、HAL_UART_Receive_DMAはノンブロッキング処理のため、他の処理をさせて、受信したときor受信後にのみ処理を走らせることができます。ノンブロッキング処理のUART受信処理をする場合は事前にHAL_UART_Receive_IT、HAL_UART_Receive_DMAを実行し、割込みを有効化する必要があります。受信するとHAL_UART_RxCpltCallback関数が呼び出されます。
ここで事前にHAL_UART_Receive_IT、HAL_UART_Receive_DMAを実行する際に注意すべきポイントがあります。別の処理で既に実行されていて、割込みが有効化されている場合に再度、実行するとエラーが発生します。エラーを避けるためにはUART割込み有効か確認して無効の場合にのみ実行するような処理が必要です。今回はその割込み有効確認の関数を紹介します。
■割込みHAL_UART_Receive_ITの場合
uint32_t UART_IsEnabledIT_RX(UART_HandleTypeDef *huart){
#if defined(USART_CR1_FIFOEN)
return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE) == (USART_CR1_RXNEIE_RXFNEIE)) ? 1U : 0U);
#else
return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)) ? 1U : 0U);
#endif
}
return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE) == (USART_CR1_RXNEIE_RXFNEIE)) ? 1U : 0U);
#else
return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)) ? 1U : 0U);
#endif
}
■DMA転送の場合
uint32_t UART_IsEnabledDMA_RX(UART_HandleTypeDef *huart){
return (READ_BIT(huart->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR));
}
uint32_t UART_IsEnabledDMA_RX(UART_HandleTypeDef *huart){
return (READ_BIT(huart->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR));
}
上記の事前に確認して、すでに有効な場合は割込み有効化処理をしないといったことができるようになります。