金牌会员
 
- 积分
- 1109
- 金钱
- 1109
- 注册时间
- 2022-4-20
- 在线时间
- 380 小时
|
10金钱
我上个月遇到一个DMA的问题,电脑上串口重复发送短数据,比如200个字节一条数据的时候,DMA能正常接收,后续的处理也能正常处理,但是我把这个数据量翻了一倍之后,DMA能正常搬运一会儿,然后就没有后续的数据处理,进入调试发现前面几次都是正常的,后面每发送一条数据,DMA都只把第一个字节搬到了数组里,其余的数据全部遗失了。这是DMA配置的代码,感觉不到异常呢?
- UART1RxDMA_Handler.Instance=DMA2_Stream3; //数据流选择
- UART1RxDMA_Handler.Init.Request=DMA_REQUEST_USART1_RX; //USART1接收DMA
- UART1RxDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY; //外设到存储器
- UART1RxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
- UART1RxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
- UART1RxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
- UART1RxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
- UART1RxDMA_Handler.Init.Mode=DMA_NORMAL; //外设流控模式
- UART1RxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
- UART1RxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
- UART1RxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
- UART1RxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
- UART1RxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
- HAL_DMA_DeInit(&UART1RxDMA_Handler);
- HAL_DMA_Init(&UART1RxDMA_Handler);
- __HAL_LINKDMA(&Uart1_Handle,hdmarx,UART1RxDMA_Handler); //将DMA与USART1联系起来(接收DMA)
复制代码
这是空闲中断的处理
- if(__HAL_UART_GET_FLAG(&Uart1_Handle,UART_FLAG_IDLE) != RESET)//idle标志被置位
- {
- HAL_UART_AbortReceive(&Uart1_Handle); //先停止DMA,暂停接收
- __HAL_UART_CLEAR_IDLEFLAG(&Uart1_Handle); //清除标志位
- if(firstflag == 1)
- {
- Usart1RecCnt = UDP_RX_SIZE-__HAL_DMA_GET_COUNTER(&UART1RxDMA_Handler);
- USART1_IRQ_RevEnable = true;
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11, GPIO_PIN_SET);//RXD灯亮
- RXD=120;//灯亮时长
- memcpy(USARTA_DMA_RX_BUF,TXBUF_t.rx_buffer,UDP_RX_SIZE);
- }
- firstflag = 1;
- }
- HAL_UART_Receive_DMA(&Uart1_Handle,TXBUF_t.rx_buffer,UDP_RX_SIZE);//重新打开DMA接收
- HAL_UART_IRQHandler(&Uart1_Handle);
复制代码
|
|