今回はSTM32でのUART受信処理について紹介します。
環境はこれまで同様、
・STM32F303K8
+SW4STM32(System Workbench for STM32)
+STM32CubeMX(F3_1.6.0)
です。
STM32F3系でなかなかUartの受信ができず、
DMAを使うしかないかなと諦めかけていましたが、
原因が分かったため、紹介します。
(This report is wrote about
not called HAL_UART_RxCpltCallback probrem)
CubeMXのUart設定でNVIC Settingの
USART Global InterruptをEnableにするとUART受信で
HAL_UART_RxCpltCallback
という関数が呼び出されます。
ただ、HALライブラリのバグで呼び出せないという不具合がありました。
不具合ではなく、最終的に関数の呼び出しが必要と判明しました。
対処方法#1で受信できるようになります。
対処方法#1は下記の通りです。
(The coping process #1 is following)
@HAL_UART_RxCpltCallbackを追加。
(ADD HAL_UART_RxCpltCallback func.)
char UART1_Data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance==USART1){
HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);
}
}
{
if(UartHandle->Instance==USART1){
HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);
}
}
Amain関数内の初期化後にUartの設定と割り込み有効化
(Set Uart variable and enable interrupt after init.)
HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);
while(1)
{
~~~
【参考 reference】
対処方法#2は下記の通りです。
(The coping process #2 is following)
@HAL_UART_RxCpltCallbackを追加。
(ADD HAL_UART_RxCpltCallback func.)
char UART1_Data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance==USART1){
HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);
}
}
{
if(UartHandle->Instance==USART1){
HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);
}
}
Amain関数内の初期化後にUartの設定と割り込み有効化
(Set Uart variable and enable interrupt after init.)
//Initially pointer is not set!
huart1.pRxBuffPtr=(uint8_t *)&UART1_Data; //IMPORTANT!!
huart1.RxXferCount=1; //IMPORTANT!!
huart1.Mask=255; //If not set, lost first string.
huart1.Mask=255; //If not set, lost first string.
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
while(1)
{
~~~
Bstm32f3xx_it.c内のUSART1_IRQHandler関数を修正
(Fix USART1_IRQHandler func in stm32f3xx_it.c)
void USART1_IRQHandler(void)
{
huart1.RxState=HAL_UART_STATE_BUSY_RX; //IMPORTANT!!
HAL_UART_IRQHandler(&huart1);
}
{
huart1.RxState=HAL_UART_STATE_BUSY_RX; //IMPORTANT!!
HAL_UART_IRQHandler(&huart1);
}