菜只因C 2024-02-14 11:02 采纳率: 72.7%
浏览 6
已结题

DMA+空闲中断实现串口的不定长收发

想做DMA+空闲中断实现串口的不定长收发
我在USART1的中断服务函数里写有关空闲中断的处理
情况一:

img

串口打印的结果:每发一次数据,打回的就是0
但是我在printf行打上断点进行调试,却能显示正确的长度,但是仅仅是收发一次就卡死了

情况二:

img

串口打印的结果:没有任何显示
但是我在Transmit DMA行打上断点,却能显示正确的字符串,但是仅仅是收发一次就卡死了

情况三:

img

串口打印的结果:能正常收发

情况四:

img

串口打印的结果:能正常收发

情况五:

img

串口打印的结果:能正常收发

我想知道:
1.为什么打断点会影响结果
2.我不加上Receive DMA行的话我认为是只能收发一次,打断点是这个效果,但是正常运行就一直显示0,发一次字符串显示一次0。Receive DMA行对第一次输出的结果有影响嘛,这一行不是在最下面嘛,按理讲不会影响到第一次的收发吧。

  • 写回答

4条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-14 11:03
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    首先,DMA(Direct Memory Access)+空闲中断实现串口不定长收发的机制是:当USART接收到数据时,启动DMA接收数据到内存缓冲区;当USART检测到线路空闲(即发送完成或接收停止)时,触发空闲中断处理剩余数据或准备下一次传输。

    针对您描述的问题:

    1. 为什么打断点会影响结果: 在调试过程中加入断点会暂停程序执行,这可能会改变某些实时性要求较高的操作(如DMA传输和中断响应)的时间顺序。在串口中断服务例程中,如果由于断点导致处理时间延长,可能会影响到DMA接收或发送状态的更新,进而影响后续的数据处理流程。

    2. Receive DMA对第一次输出的影响: 不添加Receive DMA配置的情况下,确实可能只能进行单次数据收发,因为没有DMA自动加载新数据到USART接收缓冲区。而加上Receive DMA后,一旦DMA完成当前接收任务并更新相关标志位,理论上不会直接影响第一次的收发,但如果在初始化配置或中断服务函数中有条件判断这些标志位的地方,就可能影响到整个收发流程的逻辑。例如,如果在空闲中断服务函数中未正确处理DMA接收完成的状态,可能导致后续无法继续接收新的数据,从而出现“发一次字符串显示一次0”的现象。

    根据您的描述,问题可能出在DMA接收和空闲中断服务函数的配合处理上,建议仔细检查以下几点:

    • DMA接收通道的配置是否正确,包括缓冲区地址、长度、传输完成后是否正确清除标志等。
    • 空闲中断服务函数中对DMA状态的判断与处理逻辑,确保在接收完成后能正确重置DMA接收,并为下次接收准备好新的缓冲区。
    • 中断优先级设置,确保在多中断并行时,空闲中断能够得到及时响应。

    通过对比正常工作的情况三、四、五,分析差异,定位出现问题的具体代码段进行排查。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月26日
  • 创建了问题 2月14日

悬赏问题

  • ¥15 STM32F103上电短路问题
  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办