1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

STM32 HAL UARTを受信割り込みでOREする場合の対処法

Posted at

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);
}

どんだけ調べてもわからなかったが,フラグを触るには一度割り込みを停止させるのが必要,とわかった.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?