完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F103CBT6 串口1 DMA 发送接收
void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ uint32_t tmp_flag = 0; uint32_t temp; tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位 if((tmp_flag != RESET))//idle标志被置位 { __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位 HAL_UART_DMAStop(&huart1); //进入空闲中断,表示数据接收完成,停止接收 // temp = huart1.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能 // temp = huart1.Instance->DR; //读取数据寄存器中的数据 //这两句和上面那句等效 temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数 // temp = hdma_usart1_rx.Instance->CNDTR;// 获取DMA中未传输的数据个数,CNDTR寄存器分析见下面 //这句和上面那句等效 rx_len = sizeof(rx_buffer) - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数 recv_end_flag = 1; // 接受完成标志位置1 } /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } main.c中的while循环内容 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ DMA_Usart1_Read(rx_buffer,BUFFER_SIZE); // HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//打开DMA接收,同上 // HAL_UART_Transmit_DMA (&huart1,rx_buffer,BUFFER_SIZE);//HAL库自带DMA发送函数 if(recv_end_flag == 1) //接收完成标志 { printf("接收到的数据:"); int i; for(i = 0;rx_buffer != ' |