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

    文章

    4453

    浏览量

    125126
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1615

    浏览量

    89602
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99025
收藏 人收藏

    评论

    相关推荐

    求助,STM32F030 ADC_CFGR1中DMACFG的使用问题求解

    DMA传输 30个数据后,触发DMA传输完成中断,通过DMA_CCR_EN 暂时关闭
    发表于 04-26 07:25

    使用dma的方式来传输定时器输入捕获的数据,是不是每隔100ms会触发dma传输完成中断?

    目前使用dma的方式来传输定时器输入捕获的数据,内存数据大小为2,使用normal模式,100ms打开dma模式,请问,这种情况下,是不是每隔100ms会触发dma
    发表于 04-18 07:47

    Linux DMA子系统驱动开发

    Streaming DMA在访问内存地址时经过cache,是non-coherence设备,通常采用streaming mapping的API进行内存申请,在单次DMA传输时进行map,在传输
    发表于 04-07 14:38 111次阅读
    Linux <b class='flag-5'>DMA</b>子系统驱动开发

    HAL_ADC_Start_DMA函数为什么无法进行第二次触发?

    我使用定时器触发adc采集 使用dma传输dma传输完成中断中更换HAL_ADC_Start_DMA
    发表于 03-26 07:31

    Stm32G474 DMA传输全部完毕后,需要产生中断并调运回调函数完成相关操作,如何处理?

    Stm32G474,DMA传输全部完毕后,需要产生中断并调运回调函数完成相关操作。请问我如何处理?没有看到常规的回调函数(例如这样的HAL_TIM_PeriodElapsedHalfC
    发表于 03-15 08:26

    pwm如何产生指定个数脉冲,而不占用cpu?

    的周期过长或者过短。2.使用dma来实现计数和周期调整。这个办法可以解决部分计数问题,但当一个周期需要多个脉冲时,会导致内存不足。同时,dma传输完成后,也是会产生中断,同样会导致脉冲
    发表于 03-14 06:34

    用PDMA接收串口数据时有没有超时中断

    我有一个疑问,在设置PDMA接收串口数据的时候,要设置传输数据的长度计数,只有当计数为零,产生DMA传输完成中断。 但是在实际应用中,比如
    发表于 01-17 06:14

    STM32 DMA传输的问题分析

    用户使用STM32G473RET6芯片,开发环境STM32CubeMX+Keil(LL库)。使用DMA1通道1,在半传输中断和完全传输中断
    的头像 发表于 12-01 09:19 1091次阅读
    STM32 <b class='flag-5'>DMA</b><b class='flag-5'>传输</b>的问题分析

    AT32F系列I2S DMA双缓冲替代实现方法

    AT32F系列 I2S DMA双缓冲替代实现方法演示AT32F系列I2S使用DMA传输传输完成中断来达到
    发表于 10-27 06:21

    modbus是通过什么方式来判断一帧数据已经传输完成

    modbus是通过什么方式来判断一帧数据已经传输完成
    发表于 10-12 07:11

    用PDMA接收串口数据时有没有超时中断

    我有一个疑问,在设置PDMA接收串口数据的时候,要设置传输数据的长度计数,只有当计数为零,产生DMA传输完成中断。 但是在实际应用中,比如
    发表于 08-29 06:42

    Stm32G474,DMA传输全部完毕后如何产生中断并调运回调函数?

    Stm32G474,DMA传输全部完毕后,需要产生中断并调运回调函数完成相关操作。请问我如何处理?没有看到常规的回调函数
    发表于 08-04 12:49

    用PDMA接收串口数据时有没有超时中断

    我有一个疑问,在设置PDMA接收串口数据的时候,要设置传输数据的长度计数,只有当计数为零,产生DMA传输完成中断。 但是在实际应用中,比如
    发表于 06-27 07:55

    iMXRT LPUART如何连接到DMA系统以强制完成传输

    空闲情况: DMA 系统可以支持线路活动中断,例如在线路空闲时生成 DMA 完成中断(具有接
    发表于 06-07 06:11

    CH32V103基础教程102-USART-DMA-TC中断

    DMA传输过半、传输完成传输错误时产生中断。为应用的灵活性考虑,可通过设置寄存器的不同位来打开这些中断
    发表于 05-15 16:41