STM32 F4 CUBEMX USART可变长度接收
CUBEMX配置
使能USART中断
;
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
中断函数处理
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 /
uint32_t tmp_flag = 0;
uint32_t temp;
/ USER CODE END USART2_IRQn 0 /
HAL_UART_IRQHandler(&huart2);
/ USER CODE BEGIN USART2_IRQn 1 */
if(USART2 == huart2.Instance){
tmp_flag =__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//idle标志被置位
{
recv_end_flag = 1; // 接受完成标志位置1
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除标志位
HAL_UART_DMAStop(&huart2); //
temp = huart2.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
temp = huart2.Instance->DR; //读取数据寄存器中的数据
temp = __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);// 获取DMA中未传输的数据个数
rx_len = BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
HAL_UART_Receive_DMA(&huart2,rx_buffer,BUFFER_SIZE);//重新打开DMA接收
}
}
/* USER CODE END USART2_IRQn 1 */
}