你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】+为USART建立一个FIFO  

[复制链接]
lovelydonkey-40 发布时间:2014-4-18 00:52
        每次使用串口通信的时候,碰到设置串口通信的波特率时就在想,USART通信速度太慢,占用了太多的CPU时间。如设置波特率为9600时,发送一个字节,8位需要的时间将近1ms,如果采用等待的方式,CPU非常浪费,尤其是在连续发送一段数据的时候,CPU就完全停滞不能干任何其他的东西。于是就萌生了为USART建立一个FIFO缓存区,当缓存区非空时,自动调用串口发送中断将数据发送出去。这样CPU就能从等待中解放出来做其他事情。
1 U. @$ E+ o3 w  S, w$ |        算法思路:模仿ST官方例程USB建立缓存区的方法,分配一个缓存区,大小由USART_Tx_DATA_SIZE定义,具体值由应用决定。* h; M- |0 a, k  }5 P
下面给出几个主要参数的说明: 4 O% B5 d- Y/ T. N1 \2 ^5 G5 f5 t+ G* U
uint8_t  USART_Tx_Buffer[USART_Tx_DATA_SIZE];//分配缓存区; S' Z2 l- c* Q6 i
uint8_t  USART_Tx_flag = 0;//标记缓存区是否有数据
+ V! ~1 N: X3 Zuint32_t USART_Tx_ptr_in  = 0;//发送队列尾指针
) S6 e, E- q; q0 ~  Quint32_t USART_Tx_ptr_out = 0;//发送队列头指针,即将被发送的数据地址+ }7 j' \! i, J& d& a* @( c
uint32_t USART_Tx_length  = 0;//发送区为发送的数据长度6 c! a, k3 H2 I7 L0 p
         经过这样分配之后,通过串口发送数据变成了向缓存区队列写入数据,中断函数完成数据的发送。除执行中断函数外,其他时间,CPU可以干任何其他事情。这就解决了发送串口数据占用时间过长的问题。
1 N% s/ h( Y0 I% |( R         源代码在附件中,使用的MCU是stm32f103vct6。实际使用过程中,其稳定性还是挺高的,只是会频繁的产生中断。其中的不足是,当工程中有USB bulk通信和串口一起通信时,USB中断会干扰串口,导致串口乱码,具体是怎么导致的未研究。有兴趣的大虾可以研究下。+ c/ L- q2 V; p& d2 p
         本人学生一枚,经济实力有限,又非常想学f4,望斑斑沐紫大姐垂青。$ O, D( \" q( w
         $ L3 R8 J; U# l2 n  j. |
 
9 N# i; J0 R/ T8 W. f0 d- o 

STM32VC_USART_FIFO.rar

下载

270.23 KB, 下载次数: 1352

收藏 3 评论41 发布时间:2014-4-18 00:52

举报

41个回答
Nothing008 回答时间:2017-7-17 21:34:40
其实一般的程序都会有一个主中断控制程序,你可以在主中断函数查询是否有串口数据需要发送数据,而不必额外再产生中断,一般几百us的中断,对于发送发送串口数据,应该是够了的,这样哪里都不耽误,当然fifo还是需要的) E7 i% I8 r! m' t: z( u& p7 _
wdshuang09 回答时间:2016-10-27 22:31:16
                  
peter001 回答时间:2016-11-17 08:21:19
循环队列发送是个好办法,占用cpu时间少,避免阻塞,编程时注意中断标志位清除。
weixuan58-30589 回答时间:2014-4-18 10:11:12

RE:【MCU实战经验】+为USART建立一个FIFO

很好的办法!!!
Volcanoscar 回答时间:2014-4-19 18:30:55

回复:【MCU实战经验】+为USART建立一个FIFO

 
dsdsadsa 回答时间:2014-4-19 18:34:03

RE:【MCU实战经验】+为USART建立一个FIFO

十分有同感的啊,谢谢楼主分享
xiaoyzi 回答时间:2014-6-3 16:03:36

RE:【MCU实战经验】+为USART建立一个FIFO

确实很有想法,看看
bjybjy 回答时间:2014-6-18 17:19:29

RE:【MCU实战经验】+为USART建立一个FIFO

aming992 回答时间:2014-6-23 09:29:04

RE:【MCU实战经验】+为USART建立一个FIFO

好东西啊,谢谢分享了 啊
STwqq 回答时间:2014-8-14 13:32:39

RE:【MCU实战经验】+为USART建立一个FIFO

学习下FIFO,的用法
自由飞 回答时间:2014-8-17 10:33:55

回复:【MCU实战经验】+为USART建立一个FIFO

好想法啊
liu568chen 回答时间:2014-8-17 18:27:32

RE:【MCU实战经验】+为USART建立一个FIFO

看看!!!!!!!!!!!!!!!
小龙虾0129 回答时间:2014-8-22 14:50:44

回复:【MCU实战经验】+为USART建立一个FIFO

 很好的办法!!!
cbs96 回答时间:2014-8-22 21:10:21

RE:【MCU实战经验】+为USART建立一个FIFO

确实很有想法,看看
cangbai 回答时间:2014-8-24 18:48:14

RE:【MCU实战经验】+为USART建立一个FIFO

确实很有想法,看看
ftcsgh 回答时间:2014-8-24 23:36:05

RE:【MCU实战经验】+为USART建立一个FIFO

好东西啊,谢谢分享
10-软件设计 回答时间:2014-9-6 22:54:10

RE:【MCU实战经验】+为USART建立一个FIFO

【Nucleo板开发日志】+开发板入门程序(Keil_v5)---USART中断模式收发
123下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版