找回密码
 立即注册
楼主: panxiaoyi

STC32G 的 USART2 或 SPI 的 DMA 发送完最后一个字节的中断请教

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:650
  • 最近打卡:2026-03-31 17:02:51

33

主题

2925

回帖

6591

积分

论坛元老

积分
6591
发表于 2026-3-2 09:58:15 | 显示全部楼层
王*** 发表于 2026-3-2 09:35
1.每次发送都会置位,但是如果没打开串口中断使能则不会进中断
2.自己不会清除,需要用户软件清零
3.等dma ...

可能他想知道的是 这个DMA的发送完成中断,是不是USART2或SPI的发送完成?。。。这个感觉还是有点儿区别。。。

DMA只是把数据搬运到这些外设中,,应该不会关心这些外设的工作情况把。。。

我们自己做串口的DMA发送时,再DMA发送完成的中断中还要在判断一下串口发送完成中断。保证这一次DMA的串口发送完整执行。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:696
  • 最近打卡:2026-03-30 09:54:25
已绑定手机
已实名认证

130

主题

3387

回帖

8829

积分

版主

积分
8829
发表于 2026-3-2 13:09:17 | 显示全部楼层
panxi*** 发表于 2026-2-28 19:28
另外一个问题:我本想把USART的同步模式的时钟降低一点,来验证上面的问题,结果发现有问题,如图,代码已 ...

可以尝试while判断前先清空一次标志位
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:696
  • 最近打卡:2026-03-30 09:54:25
已绑定手机
已实名认证

130

主题

3387

回帖

8829

积分

版主

积分
8829
发表于 2026-3-2 13:13:06 | 显示全部楼层
panxi*** 发表于 2026-3-2 09:54
我是想知道,DMA刚刚进入中断时,USART2有没有发送完最后的那个字节?
按照版主的指引,稍后我也会用示波 ...

DMA和串口是两个不同的模块,DMA只管把数据搬运到S2BUF的这个过程,类似代替你操作搬运数据
简单的做法是通过一个全局标志位,DMA完成的时候置1,让串口的中断一直打开,在串口中断中发现这个标志位置1的时候,再操作CS,就可以保证时序正确了。如果是堵塞方式执行,对时间不敏感的话,可以直接dma完成后延时一段时间再操作CS,也可以做到一样的效果
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2026-3-2 15:08:02 | 显示全部楼层
王*** 发表于 2026-3-2 13:09
可以尝试while判断前先清空一次标志位

不行,还是卡死在while里面
3.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2026-3-2 15:13:27 | 显示全部楼层
王*** 发表于 2026-3-2 13:13
DMA和串口是两个不同的模块,DMA只管把数据搬运到S2BUF的这个过程,类似代替你操作搬运数据
简单的做法是 ...

我的代码是正常运行的,就是采用你说的,在DMA中断里面,延时几十个nop指令,再操作TFT显示屏的其它动作,只是现在做第二个项目,想优化一下。
如果让UART发送完成中断一直打开,那么发送一个动画刷屏,这个中断数量是非常膨大的,不敢采用
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2026-03-31 08:56:02
已绑定手机

104

主题

4219

回帖

9371

积分

荣誉版主

无情的代码机器

积分
9371
发表于 2026-3-2 15:20:28 | 显示全部楼层
卡死问题请乘风版主帮分析,是需要:将spi使能放在最后就好了
截图202603021520124716.jpg

点评

是的,这个是我的问题,你们的逻辑是正确的,修改后就可以了,多谢  发表于 2026-3-2 15:51
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2026-3-2 15:24:02 | 显示全部楼层
如图:

程序流程:
1:初始化,UART波特率9600,使能中断,UART_DMA使能、中断使能
2:由UART_DMA启动发送8个数据
3:观察DMA搬运完8个数据、UART发送完8个数据的相互关系

这两个图更搞笑,波特率是9600,就是说,发送1个字节的时间是1ms,时间非常的充足。
由于DMA的中断优先级不同,出现的结果竟然也不同:
1:UART和DMA优先级都是0时,DMA中断竟然落后于UART发送最后一个字节的中断,不知道是为什么?
2:如果DMA的中断优先级比UART的中断优先级高,则结果正常




1.png
2.png

点评

UART和DMA优先级都是0时,按照中断号进行顺序优先,串口中断比dma中断号靠前,所以先执行串口的。  详情 回复 发表于 2026-3-2 23:18
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:696
  • 最近打卡:2026-03-30 09:54:25
已绑定手机
已实名认证

130

主题

3387

回帖

8829

积分

版主

积分
8829
发表于 2026-3-2 23:18:25 | 显示全部楼层
panxi*** 发表于 2026-3-2 15:24
如图:

程序流程:

UART和DMA优先级都是0时,按照中断号进行顺序优先,串口中断比dma中断号靠前,所以先执行串口的。
这个现象可以说明,DMA完成和串口完成是同时请求的响应
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2026-3-3 11:10:19 | 显示全部楼层
示波器图片,源代码,示意图
4.png
5.png
6.png

DJ_STC32G UART1 与 DMA 优先级测试.rar

589.32 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-03-03 11:10:19
已绑定手机

2

主题

16

回帖

60

积分

注册会员

积分
60
发表于 2026-3-3 11:23:18 | 显示全部楼层
王*** 发表于 2026-3-2 23:18
UART和DMA优先级都是0时,按照中断号进行顺序优先,串口中断比dma中断号靠前,所以先执行串口的。
这个现 ...

根据上面的图片和源代码,和再上面的仿真代码截图,我感觉 STC32G USART DMA 的时序是这样的:
1:目标是USART利用DMA发送8个数据
2:DMA搬运完成8个数据,这时候并不会产生中断标记
3:USART发送8个数据,并且每发送完成一个字节都会产生一个TI标记(发送完最后一个比特位之后,发送停止位之前,的时隙)
4:DMA在检测到蓝色的TI标记时,因为前面已经搬运完成了8个数据,已经没有数据需要搬运了,所以,在这个蓝色的TI时隙才产生中断标记
5:所以DMA产生的中断标记,与USART发送完成最后一个字节所产生的TI标记,是同时发生的

恳请大家有空看一下,是不是这样的
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-1 06:14 , Processed in 0.120217 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表