使用DMA+USART接收无固定长度的串行数据

[复制链接]
18474|52
 楼主| ST_ARM 发表于 2009-8-3 17:32 | 显示全部楼层 |阅读模式
本帖最后由 ST_ARM 于 2009-8-3 17:36 编辑

在一些应用中MCU接收串行数据时,会出现接收到多个不同长度的数据流,由于STM32没有串行接收超时功能,这使得STM32的用户觉得不是很方便。为此我使用STM32的定时器实现接收无固定长度的串行数据,希望对STM32的用户有所帮助。

一、方案说明:
1、在使用DMA+USART接收数据时,将接收引脚(RX)的外部中断打开,当接收第一个数据的起始位时产生外部中断,在外部中断处理程序中,关闭外部中断功能,同时使能定时器(本例程中使用SysTick),开始接收数据的计时;
2、在DMA接收到最长的数据流时,在DMA中断处理程序中,清除中断标志,设置接收结束标志和长度。
3、在定时器中断中,计数器加一,当计数器达到延时计数值时,表明DMA接收到的数据没有到达最大值。此时停止定时器,计算已经接收数据的长度,设置接收结束标志。
4、在主程序中,对接收的数据进行处理后,重新初始化DMA,并打开接收引脚(RX)的外部中断功能。
二、代码使用说明:
1、用户需根据自己的应用,设置DMA接收的最长数据长度,根据数据长度和串口传输的波特率计算出需定时的时间长度,设置延时计数值用以定时比较。
#define  Rx_Buffer_Size 64
#define  DELAY_TIME 7
unsigned char RX_Buffer[Rx_Buffer_Size];
STM32.zip (230.25 KB, 下载次数: 1771)

STM32.zip

230.25 KB, 下载次数: 722

评分

参与人数 1威望 +1 收起 理由
啦啦啦007 + 1 还有什么好说的,必须顶

查看全部评分

john_light 发表于 2009-8-3 17:40 | 显示全部楼层
很明显,这个要顶。
zhuhai2004 发表于 2009-8-3 21:00 | 显示全部楼层
不错啊,DMA是提高效率的利剑。
leebai_001 发表于 2009-8-4 08:39 | 显示全部楼层
非常明显,这个必须得定。
cambrain 发表于 2009-12-15 17:38 | 显示全部楼层
刚好要用到。呵呵。不错。
lovestm32 发表于 2010-3-25 10:04 | 显示全部楼层
呵呵~~及时雨啊
fengyan81 发表于 2010-3-25 16:32 | 显示全部楼层
顶一下
sunxflower 发表于 2010-3-26 22:32 | 显示全部楼层
我用第一个数据当作长度,开启DMA。然后给一个信号到任务,该任务就等待DMA接收完毕的信号,若超时未等到,那就当错误处理。
wangjckj 发表于 2010-3-27 13:34 | 显示全部楼层
非常好
Swd21ic 发表于 2010-3-27 19:24 | 显示全部楼层
楼主英明
essencezj 发表于 2010-3-28 11:58 | 显示全部楼层
非常好
pkat 发表于 2010-3-28 20:51 | 显示全部楼层
这个方案比较好
cwei85 发表于 2010-3-29 12:41 | 显示全部楼层
本帖最后由 cwei85 于 2010-3-29 12:55 编辑

不错的想法,正愁接收数据不能够用DMA呢。
不过用这种方式接收数据比用中断接收数据要延时 (最大接收个数—接收个数)* 每个字节发送时间+设置超时时间。
响应速度变慢了点。
kgsz 发表于 2011-6-13 15:38 | 显示全部楼层
:) 学习下
无冕之王 发表于 2011-6-13 16:36 | 显示全部楼层
楼主的这个想法不错,值得学习
hsbjb 发表于 2011-6-13 19:38 | 显示全部楼层
值得借鉴的代码
kavieen 发表于 2011-7-2 10:10 | 显示全部楼层
gaobq 发表于 2011-7-2 10:36 | 显示全部楼层
好,谢谢!
teet 发表于 2011-7-3 11:21 | 显示全部楼层
很酷的资料
teet 发表于 2011-7-3 11:21 | 显示全部楼层
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

844

帖子

1

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