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

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

[复制链接]
lovelydonkey-40 发布时间:2014-4-18 00:52
        每次使用串口通信的时候,碰到设置串口通信的波特率时就在想,USART通信速度太慢,占用了太多的CPU时间。如设置波特率为9600时,发送一个字节,8位需要的时间将近1ms,如果采用等待的方式,CPU非常浪费,尤其是在连续发送一段数据的时候,CPU就完全停滞不能干任何其他的东西。于是就萌生了为USART建立一个FIFO缓存区,当缓存区非空时,自动调用串口发送中断将数据发送出去。这样CPU就能从等待中解放出来做其他事情。
) C/ }1 Q' s+ ~$ p        算法思路:模仿ST官方例程USB建立缓存区的方法,分配一个缓存区,大小由USART_Tx_DATA_SIZE定义,具体值由应用决定。
# S, M& h$ @1 W4 {$ r( O7 f下面给出几个主要参数的说明: 
8 v7 k1 K& e* L7 S" C+ F  ?; ^uint8_t  USART_Tx_Buffer[USART_Tx_DATA_SIZE];//分配缓存区4 N6 x, x& q* X  ]) S
uint8_t  USART_Tx_flag = 0;//标记缓存区是否有数据
8 L( k) A) b, Wuint32_t USART_Tx_ptr_in  = 0;//发送队列尾指针! a4 {& ]: Y" {0 T; M3 Z6 D' m
uint32_t USART_Tx_ptr_out = 0;//发送队列头指针,即将被发送的数据地址
" G. @8 D  E, `2 kuint32_t USART_Tx_length  = 0;//发送区为发送的数据长度
+ _8 C3 ]8 t) l! c8 e! g5 s         经过这样分配之后,通过串口发送数据变成了向缓存区队列写入数据,中断函数完成数据的发送。除执行中断函数外,其他时间,CPU可以干任何其他事情。这就解决了发送串口数据占用时间过长的问题。" A) a' L' F5 K( \/ N, i: G
         源代码在附件中,使用的MCU是stm32f103vct6。实际使用过程中,其稳定性还是挺高的,只是会频繁的产生中断。其中的不足是,当工程中有USB bulk通信和串口一起通信时,USB中断会干扰串口,导致串口乱码,具体是怎么导致的未研究。有兴趣的大虾可以研究下。
7 @$ G7 z  s2 d: h         本人学生一枚,经济实力有限,又非常想学f4,望斑斑沐紫大姐垂青。  K  _6 z# }3 s  l  K
         
& s# V- P; `" u$ U" e - x6 q& b2 B# O0 `5 s. r% }4 U
 

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还是需要的
: N* U$ X; ^4 B7 _3 C
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版