4002|2

147

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

老话题,新讨论。STM32的奇葩UART设计和DMA方式如何收发 [复制链接]

STM32的UART没有FIFO,但是有DMA。
UART的中断标志,有4个非常重要的标志,TXE,TC,RXNE,IDLE。
本人做了一个改进的串口中断+环形缓存的方式,操作UART收发。
因为STM32的UART非常奇葩,我来说说有多么奇葩。
标志位TXE和TC,上电就是置位的,只要一开启TXEIE和TCIE,不用往DR里面写数据,就有TXE和TC中断。所以本人以前被这个奇葩的设置戏弄过。
而且这两个标志的清零方式更奇葩,往DR写数据就能清零。在F0和F4中TC标志可以清零,但是F1中,TC就没有清零的时候。
无论哪种STM32,TXE标志位永远没有清零的时候。
所以发送的时候,有种很好的方法了。把数据写入写入环形缓存(以后都叫fifo)。写入叫push fifo,读出叫pop fifo.
MCU上电时,关闭TXEIE和TCIE。
发送串口帧时,先push fifo,有多少字节要发送,就push fifo多少次。psuh fifo完了后,就打开TXEIE。
然后就可以进入中断,在TXE中断下,pop fifo。如果pop fifo读到数据,就写入DR,直到没有数据为止,再关闭TXEIE。
数据接收,可以用IDLE中断。IDLE中断有点类似带FIFO UART的timeout中断,清空标志位需要读一下DR寄存器。
hal_uart.zip (3.33 KB, 下载次数: 30)
附加为优化后的文件。

有了这些思路,大家来想想怎么用DMA来做收发。







此帖出自stm32/stm8论坛

最新回复

很正常的中断方式吧,为什么说是奇葩?  详情 回复 发表于 2014-1-21 16:04
点赞 关注(2)
 

回复
举报

6040

帖子

204

TA的资源

版主

沙发
 
很正常的中断方式吧,为什么说是奇葩?
此帖出自stm32/stm8论坛

点评

中断发送标志位是一直置1的,和很多传统MCU不同。当然很多传统MCU在使用fifo的方式时,要在写入fifo后判断要不要发送第一个字节。  详情 回复 发表于 2014-1-21 16:16
 
 

回复

147

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
lcofjp 发表于 2014-1-21 16:04
很正常的中断方式吧,为什么说是奇葩?

中断发送标志位是一直置1的,和很多传统MCU不同。当然很多传统MCU在使用fifo的方式时,要在写入fifo后判断要不要发送第一个字节。
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表