分享

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

 心不留意外尘 2016-04-29
 
http://no001.blog.51cto.com/1142339/902138
2012.06

在一些应用中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];

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约