一、在底层中初始化DMA接收和串口中断
void MX_USART1_UART_Init(void)
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
二、在初始化完成之后,enable空闲中断,并启动DMA接收
三、在*it.c的中断c文件中增加空闲中断处理
void USART1_IRQHandler(void)
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
//空闲中断
if (((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);//清除标志
temp =huart->Instance->SR;//读SR可以实现清除状态寄存器
temp =huart->Instance->DR;
HAL_UART_DMAStop(huart);//在回调函数中通过HAL_UART_Receive_DMA重新启动
temp = huart->hdmarx->Instance->NDTR;//获取未传输数据个数
__HAL_DMA_DISABLE(huart->hdmarx);//关闭DMA接收
HAL_UART_RxIdleCallback(huart,temp);//把未接收字节数传过去
__HAL_DMA_ENABLE(huart->hdmarx);//开启DMA接收,在传未接收字节数时,先关DMA,防止又接收到数据,改变了未接收字节数
}
即读取SR寄存器和CR1寄存器,判断是否是空闲中断。如果是,原来设置DMA接收HLGI_NUM个字节,读NDTR看还剩多少个字节未接收。两者相减,就得到已接收的字节数
四、把接收到的字符通过回调函数HAL_UART_RxIdleCallback处理
可以把它发送到队列中,然后启动新一次DMA接收