接收采用IDLE中断 + DMA方式
HAL_UART_Receive_DMA()添加使能IDLE中断
SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
DMA传输完成中断是默认初始化开启的,但中断回调函数未重新实现,串口中断开启,并对空闲中断做处理。
局限性:每次接收的数据不能超过DMA设定的接收值,避免触发DMA传输完成,否则无法开启下一次传输。
DMA 接收传输完成回调函数如下:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
串口中断处理函数HAL_UART_IRQHandler()添加空闲中断处理:
- 取消串口正在进行的接收操作
- 清空空闲标志
- 自己的回调函数处理(数据保存FIFO、重新开启下一次传输、释放信号量)
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
{
HAL_UART_AbortReceive(huart);
__HAL_UART_CLEAR_IDLEFLAG(huart);
HAL_UART_AbortReceiveCpltCallback(huart);
return;
}