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

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

[复制链接]
lovelydonkey-40 发布时间:2014-4-18 00:52
        每次使用串口通信的时候,碰到设置串口通信的波特率时就在想,USART通信速度太慢,占用了太多的CPU时间。如设置波特率为9600时,发送一个字节,8位需要的时间将近1ms,如果采用等待的方式,CPU非常浪费,尤其是在连续发送一段数据的时候,CPU就完全停滞不能干任何其他的东西。于是就萌生了为USART建立一个FIFO缓存区,当缓存区非空时,自动调用串口发送中断将数据发送出去。这样CPU就能从等待中解放出来做其他事情。3 H- G) o' o7 _! S* g
        算法思路:模仿ST官方例程USB建立缓存区的方法,分配一个缓存区,大小由USART_Tx_DATA_SIZE定义,具体值由应用决定。( F, {# V5 E: P( |  i/ p8 e9 M
下面给出几个主要参数的说明: 
  A3 `5 s: u( G. b( Zuint8_t  USART_Tx_Buffer[USART_Tx_DATA_SIZE];//分配缓存区
5 y3 a0 f& `7 {- G5 auint8_t  USART_Tx_flag = 0;//标记缓存区是否有数据# {8 l) y7 T" J. S% I+ Z) @8 e
uint32_t USART_Tx_ptr_in  = 0;//发送队列尾指针0 m6 k; e! o' V8 B8 H) Q% \6 h
uint32_t USART_Tx_ptr_out = 0;//发送队列头指针,即将被发送的数据地址5 ~+ f: u  F0 K- E
uint32_t USART_Tx_length  = 0;//发送区为发送的数据长度5 ]9 I: `) D) O# n: B5 _
         经过这样分配之后,通过串口发送数据变成了向缓存区队列写入数据,中断函数完成数据的发送。除执行中断函数外,其他时间,CPU可以干任何其他事情。这就解决了发送串口数据占用时间过长的问题。
8 u' _  @; h: T; c         源代码在附件中,使用的MCU是stm32f103vct6。实际使用过程中,其稳定性还是挺高的,只是会频繁的产生中断。其中的不足是,当工程中有USB bulk通信和串口一起通信时,USB中断会干扰串口,导致串口乱码,具体是怎么导致的未研究。有兴趣的大虾可以研究下。" o( @$ l8 P# X$ _
         本人学生一枚,经济实力有限,又非常想学f4,望斑斑沐紫大姐垂青。
" u' x* a, h0 h         . ]3 Q& Z3 g+ z  J' l
 
( a7 i% Z8 P$ w: T: m& _  D 

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还是需要的
5 g- N5 m; K# P2 M3 b' M5 g
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 手机版