关于串口DMA等待传输完成卡死的问题
型号AT32F407,在USART2DMA发送数据时,接包已经接到了要发送的数据,但是程序还是处于等待传输完成的标识判断中,卡死了。请教一下是什么造成的?关于串口DMA等待传输完成卡死的问题
usart_dma_transmitter_enable(USART2,TRUE); //开启USART1 DMA 发送dma_channel_enable(DMA1_CHANNEL1, TRUE); /* usart2 tx begin dma transmitting */
while(dma_flag_get(DMA1_FDT1_FLAG)==RESET); //等待传输完成 //************卡在在这里**********//
dma_flag_clear(DMA1_FDT1_FLAG); //清标志
dma_channel_enable(DMA1_CHANNEL1, FALSE); //关闭通道4
usart_dma_transmitter_enable(USART2,FALSE); //关闭USART1 DMA 发送
可参考bsp中example进行配置
https://gitee.com/arterytek/AT32F403A_407_Firmware_Library/blob/master/project/at_start_f407/examples/usart/transfer_by_dma_interrupt/src/main.c 一般直接通过非中断,非DMA发送 有可能USART2 DMA硬件本身存在问题,例如硬件故障或与DMA相关的配置错误。 可能没有正确地配置DMA,或者在数据传输完成之前尝试读取或写入数据。 可能是中断处理问题 可能是这个标识的判断逻辑存在问题 是因为我配置了DMA1_FDT1_FLAG中断,并在中断中清除了一下标识并且关闭了通道,就不可以使用。在程序中等待并清除就可以使用 宋先森 发表于 2023-11-14 15:40
usart_dma_transmitter_enable(USART2,TRUE); //开启USART1 DMA 发送
dma_channel_enable(DMA1_ ...
搞得更小女人一样,露个小手还得悬丝搭脉诊断。程序代码太少了。 是不是DMA通道不对,我看你的注释写得是开启USART1 DMA 发送,可以通过调试看看DMA寄存器值 DMA的配置不正确可能会导致传输失败或者卡死。 调整DMA缓冲区大小 优化DMA通道的使用,避免同时使用多个DMA通道。 及时清除DMA传输完成的标志位并关闭DMA通道。 可以设置一个超时时间 为DMA传输设置一个超时时间,如果在规定时间内没有完成传输,则认为传输失败 DMA的源地址、目标地址、传输长度等参数设置不正确,或者DMA的触发方式选择不正确等。 DMA传输速度过快可能导致系统无法及时响应 检查DMA和串口的配置是否正确