打印

STM32 高性能UART驱动程序

[复制链接]
4304|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ploto|  楼主 | 2011-8-5 17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST固件库给出的UART驱动程序,发送UART是一个死循环,这种代码只能在UART收发不频繁时使用,否则非常影响效率,很久没有发点像模像样的东西了,发一个自己使用的UART驱动程序。
此驱动输出实现了一个发送循环队列,通过UART的发送完成中断实现。客户代码请求发送数据时,先放到发送队列中,每个字节发送完后,通过TC中断发送下一个字节。
使用者可以自己定义发送队列大小,当发送队列满时,新请求放入的数据会丢失。

driver_uart.rar

1.98 KB

沙发
qqdgc| | 2011-8-10 23:06 | 只看该作者
用DMA发送更节省mcu资源,效率更高

使用特权

评论回复
板凳
heuyck| | 2011-8-11 08:14 | 只看该作者
呵呵,发送也要看情况的。比如一些通信中,发送只能用阻塞式发送。

使用特权

评论回复
地板
火箭球迷| | 2011-8-11 10:36 | 只看该作者
先看看,多谢共享

使用特权

评论回复
5
xsgy123| | 2011-8-11 15:21 | 只看该作者
需要进一步完善,可以参考一下

使用特权

评论回复
6
ploto|  楼主 | 2011-8-11 16:29 | 只看该作者
DMA发送也有问题,正在发送过程中,客户代码又要发送了怎么办,是把正在发送的停止还是怎么办,都有点麻烦,用循环队列的好处就是如果数据发送不均衡,一会儿密集发送,一会儿很长时间不需要发送的情况下,能够尽最大可能发送所有的数据。
接收没有使用队列,一般我们都是使用状态机实现,在状态机中需要时存储数据。 关键是状态机最后处理队列时,不要占用CPU太长时间,否则会导致下一帧第一字节丢失。更好的策略是在状态机上再添加超时恢复功能。这个不在驱动层里,所以就没有贴上。

使用特权

评论回复
7
靠双手奋斗| | 2011-8-11 16:32 | 只看该作者
可以发送数组!!

使用特权

评论回复
8
qqlvjh| | 2011-8-16 17:34 | 只看该作者
恕我直言,2楼正解。

使用特权

评论回复
9
mxh0506| | 2011-8-16 23:11 | 只看该作者
过去用ATMEL的ARM, 串口收/发都用DMA实现, 基本上一帧数据只要处理一次中断.

使用特权

评论回复
10
gxgclg| | 2011-8-17 09:35 | 只看该作者
可以借鉴,收藏了

使用特权

评论回复
11
ploto|  楼主 | 2011-8-17 16:25 | 只看该作者
接收,很难用DMA实现啊。如果想用DMA发送,那就循环队列的项不是一个字节,而是一个数组,效率更高些。

使用特权

评论回复
12
yanhuaili| | 2013-10-19 14:08 | 只看该作者
问下,我把你的程序挂上去后,发送一串字符,为啥第一个字节的会丢失(例如AA55会接收到A55)

使用特权

评论回复
13
trumpxp| | 2013-10-19 19:44 | 只看该作者
先看看  过几天   试用一下   看看效果如何   应该是不错的

使用特权

评论回复
14
STM32NULI| | 2013-10-19 22:00 | 只看该作者
学习学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

99

帖子

0

粉丝