0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DMA不产生传输完成中断

jf_pJlTbmA9 来源:STM32单片机 作者:STM32单片机 2023-10-18 16:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、前言

某客户发现修改代码后,STM32U59 SPI DMA 发送未产生传输完成中断,但修改的代码跟 SPI 以及 DMA 毫无关联。

2、调研

回退代码修改后问题消失,可以确认硬件正常。检查 SPI 发送对应的 DMA 句柄的

ErrorCode,发现 HAL_DMA_ERROR_DTE(Date Transfer Error)置位。尝试修改软件,发现调整下某个全局变量初值,或屏蔽某些变量,都能解决问题。

为屏蔽 RTOS 及应用代码可能带来的影响,调整客户 SPI 和 DMA 初始化代码位置到紧跟 MCU 复位后配置时钟,初始化全局变量,并在初始化完成后立即发送一包数据,测试下来问题仍存在,说明问题和后续 RTOS 及应用代码代码无关。

为澄清全局变量初始化对 SPI 和 DMA 的影响,在全局变量初始化完成、初始化 SPI

和 DMA 前、后,分别检查 RCC、SPI 和 DMA 寄存器,和正常时对比无差异。

3、分析

客户使用的是 GPDMA 的 Linked List 模式,此模式下 DMA 传输相关的 8 个寄存器不通过软件直接设置,而是需要软件把待设定的寄存器参数先放入缓冲区,再将缓冲区地址赋到 DMA 寄存器 CxLBAR(高 16 位)和 CxLLR(低 16 位),使能 DMA 时硬件自动将这些参数加载到 DMA 通道对应的寄存器中。

跟踪代码执行,在 DMA 使能前,查看参数缓冲区(地址:0x2001 FFF0)。确认

DMA 参数缓冲区中源地址寄存器参数 0x200 e0618、目标地址寄存器参数 0x4001 3020都是正确的;使能 DMA 后,发现 DMA CxDAR 寄存器数据异常 0x1382 932e。

wKgZomUD3n2AA8jVAACmM_ZjdoI923.png

wKgZomUD3n6ARAAwAADs0dY7D2o512.png

查阅参考手册,找到其对对缓冲区限制的描述:必须 4 字节对齐,且不能跨 64Kbyte边界;而用户的缓冲区地址 0x2001 FFF0(32 字节)刚好跨了 64Kbyte 边界。链接器分配的地址范围是 0x2001 FFF0 ~ 0x2002 0010,而 GPDMA 实际访问的数据区间是0x2001 FFF0 ~ 0x2001 FFFF 和 0x20010000 ~ 0x2001000F,把 2001 0000 对应的数据加载到了 DAR 中,随即引发了 DTE 错误。

wKgaomUD3oKABUnsAAHWBCIVSzE190.png

4、处理

处由于增减全局变量、修改变量初值为零或非零,都会影响最终链接结果,故通过设置预编译选项对所有 DMA 链表数据结构变量的地址作出限制,来满足 4 字节对齐且不跨64K Byte 边界这个约束条件,再次编译链接后进行测试,SPI DMA 功能恢复正常。

5、小结

对这种看似怪异的问题,需要仔细观察并记录整个数据传输过程,各个关键操作前后相关寄存器的变化来获取第一手资料,对比正常情况并结合参考手册寻找具体原因。

来源:STM32单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 测试
    +关注

    关注

    8

    文章

    6027

    浏览量

    130709
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1866

    浏览量

    99793
  • dma
    dma
    +关注

    关注

    3

    文章

    577

    浏览量

    105345
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    利用DMA如何降低MCU功耗?

    ↔内存),CPU无需轮询或参与传输过程。 CPU可在DMA传输期间进入Sleep模式(关闭时钟)或Stop模式(关闭核心电压),显著降低动态功耗。 传输完成后,
    发表于 11-18 07:34

    CW32的ADC视线,DMA扩展采样思路

    ; 5.DMA 的 CH1 传输完成后,ADC 的 6 路转换也完成了,并且转换结果也被传输到 RAM,可通过 CH1 的传输完成
    发表于 11-13 08:09

    AG32 内置的CPLD 的DMA功能如何实现?

    内部数据准备就绪后,主动触发DMA请求信号 •检测到DMA请求后,MCU的DMA控制器自动将CPLD中的数据搬运至MCU指定的RAM地址 4、完成确认机制 •每次数据
    发表于 10-31 15:42

    RVMCU课堂「18」: 手把手教你玩转RVSTAR—DMA数据传输

    数据从一个地址空间复制到另外一个地址空间。传输动作的初始化由CPU完成,而传输动作本身由DMA控制器来实行。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。
    发表于 10-30 08:29

    基于蜂鸟E203处理器的DMA模块设计

    来发起命令操作 CTR[6]:中断使能 可读可写 0’h0e SR 状态寄存器 SR[0]:中断标志 SR[1]:1表示正在传输数据,0表示传输完成 SR[2]:1表示
    发表于 10-29 07:31

    基于E203的DMA ip的使用

    ;amp;amp;AXiDma,XAXIDMA_DEVICE_TO_DMA)) 判断是否传输完毕 3.测试 1)先通过S00_AXI和M00_AXI向DDR中写入数据。 2)再
    发表于 10-22 06:00

    串口DMA接收方式打开,为什么在开启IDLE中断的情况下还需要开启DMA中断呢?

    如图,在以 RT_DEVICE_FLAG_DMA_RX 方式打开串口时,底层会配置串口IDLE中断,同时也会打开DMA中断DMA
    发表于 09-29 08:30

    M483SIDAE SD控制器,无法使用DMA读取从SDHC获取正确的数据,怎么解决?

    当我触发 DMA 传输时,它总是在等待 DMA 传输完成中断时停止,所以我必须添加超时 USB DMA
    发表于 08-28 06:21

    STM32F405RGT6 ADC2+TIM4触发+DMA(DMA2_Stream2_CH1)+DMA中断会死机,怎么解决?

    2_Stream2,DMA_FLAG_TCIF1))//清除传输完成中断{DMA_ClearITPendingBit(DMA2_Stream
    发表于 08-04 07:16

    CYT2B93CAE如何构建产生中断的FIFO?

    你好,我正在使用 CYT2B93CAE 使用设备配置器 5.3,我选择将不匹配的 ID 存储在 FIFO 0 中,问题是它正在生成中断,而对于匹配的 ID,我不想中断 CPU,只是将它们传递给
    发表于 07-15 06:29

    NVMe IP高速传输却不依赖XDMA设计之五:DMA 控制单元设计

    DMA 控制单元负责控制 DMA 传输事务, 该单元承担了 DMA 事务到 NVMe 事务的转换任务, 使用户对数据传输事务的控制更加简单快
    的头像 发表于 07-02 19:47 1892次阅读
    NVMe IP高速<b class='flag-5'>传输</b>却不依赖XDMA设计之五:<b class='flag-5'>DMA</b> 控制单元设计

    为什么无法设置DMA传输大小?

    我学会了将HSADC和DMA结合起来进行数据传输,我尝试修改DMA传输数据的大小,但一直没有成功,传输的数据已经是4095了,这就是为什么,
    发表于 03-17 07:08

    STM32G030F6 ADC+DMA多通道非连续采样无法正常工作怎么解决?

    配置:使用STM32G030F6 ADC外设时,ADC使用两个通道。DMA配置为循环模式,ADC扫描模式+非连续采样。 问题:初始化阶段能进一次DMA传输完成中断,在main函数中再次
    发表于 03-12 07:10

    DLPC3479速度与图片大小传输,需要多久能传输完毕?

    ), 通过并口传输,在RGB888模式下,图片大小为1920*1080*24bit, 如果时钟频率是100MHz,需要多久能传输完毕?和速度1440 Hz (1-bit) and 180 Hz (8-bit)有何关系?多谢
    发表于 02-18 07:21

    AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?

    型号AT32F407,在USART2DMA发送数据时,接包已经接到了要发送的数据,但是程序还是处于等待传输完成的标识判断中,卡死了。请教一下是什么造成的?
    发表于 12-19 06:48