[其他ST产品] STM32---UART使用DMA数据传输

[复制链接]
1271|31
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
图片上使用的缩写
R: 下次读取数据的位置
W: DMA 将在内存中保存下一个字节位置
HT: 由 DMA 触发的半传输事件
TC: 由 DMA 触发的传输完成事件
IDLE: UART是否空间
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
DMA
DAM采用循环模式(Circular mode)
20字节的数据缓存,HT事件表示已接收10个数据
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
会出现的情况
A:程序由 HT 中断通知,可以读取/处理数据,由 UART 接收

 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
B:DMA 传输接下来的 10 个字节。 在这种情况下,读取/处理到最后一个数据后,因为是Circular mode所以会自动回到开始的位置。
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
C:DMA接收了10个字节,但不是对齐的,无法触发HT/TC事件。 .

当剩余6个数据接收完成后,才会触发TC事件
使用UART的IDLE检测,来接收剩余的4个字节,当IDLE中断后说明已经没有数据传输了,来完成数据接收,或者使用数据超时也可以
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
D:DMA接收了10个字节数据,不是对齐的缓存读位置在下,写位置在上。

通过TC事件可以接收4个字节
使用UART的IDLE检测,来接收剩余的6个字节,当IDLE中断后说明已经没有数据传输了,来完成数据接收,或者使用数据超时也可以
 楼主| 尽快回复过 发表于 2023-9-30 23:30 | 显示全部楼层
E:如果我们只依赖 IDLE检测。 如果在突发中接收到的字节数超过了 DMA 所能容纳的字节数,会发生什么? 在这种情况下,可以容纳 20 个字节,但是我们在突发中收到了 30 个字节如何处理呢

IDLE事件说明已经接收完最后一帧数据。
数据的红色部分表示溢出前一个数据的最后一个数据 = 我们丢失了 10 个字节
避免采用轮询 DMA,而是 更改比接收突发数据可能发生的更快,或者通过使用 HT/TC 事件
 楼主| 尽快回复过 发表于 2023-9-30 23:31 | 显示全部楼层
UART IDLE 线路检测 + DMA HT&TC 中断
应用程序通过 IDLE 线路检测或 DMA TC/HT 事件获得通知
应用程序只有在收到 3 个中断中的任何一个时才必须处理数据
P:应用程序不需要轮询新的变化
P:应用程序接收事件中断
P:应用程序可能会进入低功耗模式以延长电池寿命(如果使用电池)
C:在中断中读取(处理)数据。 我们努力尽快执行中断程序
C:长时间中断执行可能会破坏应用程序中的其他兼容性
传入数据的处理来自 2 个中断向量,因此重要的是它们不会相互抢占。 将两者设置为相同的抢占优先级!
Henryko 发表于 2023-10-10 13:24 | 显示全部楼层
用DMA后有什么优势啊
AloneKaven 发表于 2023-10-10 17:31 | 显示全部楼层
轮询效率太低了
Stahan 发表于 2023-10-11 20:39 | 显示全部楼层
轮询是怎么保证在第一时间接收到数据的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部