DMA不产生传输完成中断

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。
查阅参考手册,找到其对对缓冲区限制的描述:必须 4 字节对齐,且不能跨 64kbyte边界;而用户的缓冲区地址 0x2001 fff0(32 字节)刚好跨了 64kbyte 边界。链接器分配的地址范围是 0x2001 fff0 ~ 0x2002 0010,而 gpdma 实际访问的数据区间是0x2001 fff0 ~ 0x2001 ffff 和 0x20010000 ~ 0x2001000f,把 2001 0000 对应的数据加载到了 dar 中,随即引发了 dte 错误。
4、处理
处由于增减全局变量、修改变量初值为零或非零,都会影响最终链接结果,故通过设置预编译选项对所有 dma 链表数据结构变量的地址作出限制,来满足 4 字节对齐且不跨64k byte 边界这个约束条件,再次编译链接后进行测试,spi dma 功能恢复正常。
5、小结
对这种看似怪异的问题,需要仔细观察并记录整个数据传输过程,各个关键操作前后相关寄存器的变化来获取第一手资料,对比正常情况并结合参考手册寻找具体原因。
来源:stm32单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


新加坡金融管理局在央行数字货币领域的探索与实践介绍
一个5G宏基站与4G宏基站对比通常包括哪些组成部分?
KA5Q1265RF/KA5Q1565RF各引脚功能及电压
采用ZigBee技术实现ARM控制器与家庭智能的远程控制系统设计
NEC开发高电压、寿命长的次世代锰系锂离子充电电池
DMA不产生传输完成中断
德国计划在2020年花费89亿欧元来用在军备上
音响术语
折叠屏产业热度不断:全球首款折叠屏PC即将在国内上市
斯坦德机器人完成数亿元人民币C轮融资
智能家居布线系统
【今晚开播】社区说|画龙点睛: 应用出海超实用技巧分享
大数据时代 智能交通如何发展
小米6即将发布:小米6买得到吗?告别“耍猴”,5大攻略让你买到小米6!
高德和整车厂合作,拿下国内首个高精地图订单
蒸汽拖把好用吗?无需任何清洁剂就能让居家生活更健康
封闭煤场盘煤
瑞萨电子RA产品家族新增超低功耗RA2L1 MCU产品群
基于Zen3架构的AMD锐龙5000处理器即将上市
数字化电厂的设计与应用 数字化电厂的发展前景