新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2020-4-22
- 在线时间
- 3 小时
|
1金钱
请问各位;串口DMA发送和接收都打开的情况下,DMA空闲中断 接收数据的时候回调用 HAL_UART_DMAStop,此时DMA关闭了,程序此时其他位置有DMA发送,导致发送失败,请问如何避免,网上找到网友提供 HAL_UART_DMA_StopRX ,但是貌似没有此函数;谢谢解答!
void Usart3Receive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp;
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除标志位
HAL_UART_DMAStop(&huart3);//这里不用Stop,不然会把发送一起停掉了
// HAL_UART_DMA_StopRX(huart);//改为用StopRX,这样就不影响DMA发送了
// temp = huart1.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
// temp = huart1.Instance->DR; //读取数据寄存器中的数据
temp = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);// 获取DMA中未传输的数据个数
usart3_recv.rx_len = MAXRECV_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
usart3_recv.recv_end_flag = 1; // 接受完成标志位置1
//==================================================================
//printf("<%d> %02x\n",usart2_recv.rx_len,usart2_recv.rx_buffer[0]);
for(int i=0; i<usart3_recv.rx_len; i++)
{
//写数据到队列
RingBuf_write(usart3_recv.rx_buffer[i],pfifo_com3);//复制数据到队列中 DMA直接接收
}
//////==================================================
HAL_UART_Receive_DMA(&huart3,usart3_recv.rx_buffer,MAXRECV_SIZE);//重新打开DMA接收
}
}
|
|