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

    文章

    5149

    浏览量

    126439
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1700

    浏览量

    91294
  • dma
    dma
    +关注

    关注

    3

    文章

    559

    浏览量

    100411
收藏 人收藏

    评论

    相关推荐

    求助,关于STM32G473 TIM8 DMA burst模式问题求解

    我在配置外部触发源定时触发TIM8_CH1输出PWM时,打算使用DMA1_Channel4在每次TIM8 UP时触发DMA传输来更新ARR、RCR、CCR1寄存器,在DMA
    发表于 07-23 06:39

    CAN发送中断工作是怎么回事?

    我正确配置了 CAN Tx 中断。 但中断没有发生。 1]我为 Tx 报文传输配置 CANFDx_CHy_TXBTIE 寄存器。 2]我还启用了传输完成寄存器。 Tx
    发表于 07-02 06:03

    STM32H743 DMA接收固定长度数据后,并未立即进入DMA传输完成中断,为什么?

    743 单工只接收SPI做从接收AD7768非标准SPI口数据时发现,DMA接收固定长度数据后,并未立即进入DMA传输完成中断,而是在SPI的CS拉高后才进入了
    发表于 05-30 08:21

    TC364如何在触发CPU中断的情况下实现QSPI+DMA发送信息?

    总是在传输完第二个有效载荷后停止,第三个有效载荷总是丢失,看起来 SPI 传输永远不会完成。 但一旦我更改了 isrProvider,比如 通过使用软件中断例程,我可以在一个卷中成
    发表于 05-20 06:19

    stm8L ADC+DMADMA产生中断的原因?

    如题,stm8L051单片机,多通道采样DMA传输DMA产生中断,没有采样到数据。初始化函数如下: volatileu16 ADC_Co
    发表于 05-07 07:21

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

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

    调试STM32的adc单通道DMA传输时,DMA传输后就出现值变了的原因?

    1_Channel1,DMA_IT_TC, ENABLE);//使能传输完成中断 从DR可以读到数据中ADC是没问题的。就是DMA传输到内
    发表于 04-22 06:03

    使用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 800次阅读
    Linux <b class='flag-5'>DMA</b>子系统驱动开发

    STM32L412KB DMA1与DMA2数据在传输时会存在串口数据不正确的情况,为什么?

    LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, ADC_DUAL_LENGTH/2); //关闭半传输,打开
    发表于 03-28 06:34

    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 2702次阅读
    STM32 <b class='flag-5'>DMA</b><b class='flag-5'>传输</b>的问题分析