金牌会员
 
- 积分
- 1042
- 金钱
- 1042
- 注册时间
- 2022-4-20
- 在线时间
- 373 小时
|
10金钱
本帖最后由 驭剑的秘密 于 2022-9-1 14:48 编辑
我在使用H7练习的时候,做到了串口空闲中断+DMA这一部分,遇到一个问题:串口数据发送一次,有时候数据能被DMA完整搬运到指定地点,有时候搬运的则是残缺的,然后我觉得可能是DMA还没搬完就被停止了接收,但是DMA又不占用CPU的时间,所以进入调试也看不出来是个什么情况,于是我就在停止接收之前加入了一个延时100毫秒,这时候数据都能被DMA完整搬运到指定地点了,当我撤销这个延时的时候,故障又再次出现了,然后我在中断内加入了一个变量,用来记录一次数据发送后进入空闲中断的次数,发现DMA搬运残缺的时候,连着进入了两次空闲中断,总的搬运数据个数与发送的数据个数相符,而正常完整搬运的时候则只进入一次。所以我想问一下,有没有大佬遇到过类似的情况,请教一下如何解决的,以下是我的空闲中断代码,DMA接收的初始化代码就不放了,是直接从例程拿过来的,数据流改的DMA2_Stream6- void USART1_IRQHandler(void)
- {
- if(__HAL_UART_GET_FLAG(&Uart1_Handle,UART_FLAG_IDLE) != RESET)//判断是否为空闲中断
- {
- //delay_ms(100); //此延时为测试用延时,当加上这条时,空闲中断只进入一次,且数据被DMA完整搬运
- HAL_UART_AbortReceive(&Uart1_Handle); //停止DMA接收,不停止发送,因为此时发送可能需要工作
- USART1->ICR|=1<<4; //清除idle标志位
- numbertimes++; //此为记录进入了几次空闲中断
- Usart1RecCnt = UDP_RX_SIZE-DMA2_Stream6->NDTR; //得到传输的个数
- USART1_IRQ_RevEnable = true;//主程序中使用的标志位
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11, GPIO_PIN_SET);//RXD点亮
- RXD=120;//RXD点亮时间设置ms
- memcpy(USARTA_DMA_RX_BUF,TXBUF_t.rx_buffer,Usart1RecCnt);//拷贝一份收到的数据
- }
- HAL_UART_Receive_DMA(&Uart1_Handle,TXBUF_t.rx_buffer,UDP_RX_SIZE);//重新打开DMA接收
- HAL_UART_IRQHandler(&Uart1_Handle);
- }
复制代码
|
|