初始化阶段:
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE); //使能IDLE中断
__HAL_UART_CLEAR_IDLEFLAG(&huart3); // 必须要用不然会没有发任何数据会进入一次空闲中断
HAL_UART_Receive_DMA(&huart3, (u8 *)&rx_buffer[0].rx_buffer, 255); //重新启动接收
主循环
if (recv_end_flag == 1)
{
HAL_UART_Receive_DMA(&huart3, (u8 *)&rx_buffer[rx_buffer_writer].rx_buffer, 255); //重启DMA传输 每次255字节数据
recv_end_flag = 0;
}
中断处理函数:
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
uint32_t tmp_flag = 0;
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */
tmp_flag = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE); //获取IDLE标志
if ((tmp_flag != RESET)) //idle标志被置
{
HAL_UART_DMAStop(&huart3); // 必须停止不然 没法设置 重启 接受
__HAL_UART_CLEAR_IDLEFLAG(&huart3); //清除标志
rx_buffer[rx_buffer_writer].rx_len = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx); //计算接收到的数据长
rx_buffer_writer++;
recv_end_flag = 1; // 接受完成标志位置1
}
/* USER CODE END USART3_IRQn 1 */
}