串口中断的处理
1、查看是否是空闲中断
2、清除中断标志
3、关DMA,计算接收长度
4、开DMA接收
void USART1_IRQHandler(void)
{
rt_interrupt_enter(); //在中断中一定要调用这对函数,进入中断
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RT_FALSE) //获取IDLE标志位 被置1
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清除串口1的IDLE标志位
HAL_UART_DMAStop(&huart1); // 停止DMA传输
temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); // 获取DMA中未传输的数据个数
DMA_USART1.COUNT = RX_SIZE - temp; // 总计数减去未传输的数据个数,得到已经接收的数据个数
rt_sem_release(usart1_sem); //释放信号量,代表串口1接收到数据
}
HAL_UART_Receive_DMA(&huart1, (rt_uint8_t *)DMA_USART1.RX_Buffer, RX_SIZE); //重新打开DMA接收
HAL_UART_IRQHandler(&huart1);
rt_interrupt_leave(); //在中断中一定要调用这对函数,离开中断
}
初始化时
1、初始化UART,DMA,打开nvic
2、uart_init最后打开空闲中断,打开DMA接收
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能空闲中断
HAL_UART_Receive_DMA(&huart1, (rt_uint8_t *)DMA_USART1.RX_Buffer, RX_SIZE); //开启DMA接收中断,指定接收的数组和数组大小