HALでUARTするとOREしまくってツラい
RX <-> STM32でUART通信(115200,0.1秒おきとか,受信割り込み)してると,STM側が受信でORE(Over Run Error)して通信が止まる
OREフラグを折りに行っても折れず,ずっと止まってやがる
結論から言うと,OREしたら,割り込みを止めてクリアフラグ&初期化を行う.
もしかしたらフラグのクリアだけでもいいかも.
コード
main.cpp
// OREしたら
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE)) {
//まず割り込みをストップする.
HAL_NVIC_DisableIRQ(USART2_IRQn);
__disable_irq();
//一応フラグをクリアする
__HAL_UART_CLEAR_NEFLAG(&huart2);
__HAL_UART_CLEAR_OREFLAG(&huart2);
//UARTを初期化する.DeInitいらない説
HAL_UART_DeInit(&huart2);
MX_USART2_UART_Init();
//再開?
HAL_UART_Abort_IT(&huart2);
//割り込みの再開
__enable_irq();
HAL_NVIC_EnableIRQ(USART2_IRQn);
//最後に受信割り込みを有効化する
HAL_UART_Receive_IT(&huart2, UART2_buf, 4);
}
どんだけ調べてもわからなかったが,フラグを触るには一度割り込みを停止させるのが必要,とわかった.