本帖最后由 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)
|