文档章节

stm32 usart相关的问题及解决思路

青春无极限
 青春无极限
发布于 2015/07/16 09:30
字数 837
阅读 211
收藏 0

如果此时USART正在发送数据,对USART_DR寄存器的写操作把数据存进TDR寄存器,并
在当前传输结束时把该数据复制进移位寄存器。
如果此时USART没有在发送数据,处于空闲状态,对USART_DR寄存器的写操作直接把数
据放进移位寄存器, 数据传输开始, TXE位立即被置起。 当一帧发送完成时 (停止位发送后),
TC位被置起,并且如果USART_CR1寄存器中的TCIE位被置起时,中断产生。
先读一下USART_SR寄存器,再写一下USART_DR寄存器,可以完成对TC位的清零。
注意: TC位也可以通过对它软件写0来清除。此清零方式只在多缓冲器通信模式下推荐使用。

当一字符被接收到时,
z RXNE位被置位。它表明移位寄存器的内容被转移到RDR。换句话说,数据已经被接收
并且可以被读出(包括与之有关的错误标志)。
z 如果RXNEIE位被设置,产生中断。
z 在接收期间如果检测到帧错误,噪音或溢出错误,错误标志将被置起,
z 在多缓冲器通信时, RXNE在每个字节接收后被置起,并由DMA对数据寄存器的读操作
而清零。
z 在单缓冲器模式里,由软件读USART_DR寄存器完成对RXNE位清除。 RXNE标志也可
以通过对它写0来清除。 RXNE位必须在下一字符接收结束前被清零,以避免溢出错误。
注意: 在接收数据时, RE位不应该被复位。如果RE位在接收时被清零,当前字节的接收被丢失


溢出错误
如果RXNE还没有被复位,又接收到一个字符,则发生溢出错误。数据只有当RXNE位被清
零后才能从移位寄存器转移到RDR寄存器。 RXNE标记是接收到每个字节后被置位的。如果
下一个数据已被收到或先前DMA请求还没被服务时, RXNE标志仍是置起的, 溢出错误产生。
当溢出错误产生时:
z ORE位被置位。
z RDR内容将不会丢失。读USART_DR寄存器仍能得到先前的数据。
z 移位寄存器中以前的内容将被覆盖。随后接收到的数据都将丢失。
z 如果RXNEIE位被设置或EIEDMAR位都被设置,中断产生。
z 顺序执行对USART_SRUSART_DR寄存器的读操作,可复位ORE
注意: 当ORE位置位时,表明至少有1个数据已经丢失。有两种可能性:
如果RXNE=1,上一个有效数据还在接收寄存器RDR上,可以被读出。
如果RXNE=0,这意味着上一个有效数据已经被读走, RDR已经没有东西可读。当上一个有
效数据在RDR中被读取的同时又接收到新的(也就是丢失的)数据时,此种情况可能发生。
在读序列期间(在USART_SR寄存器读访问和USART_DR读访问之间)接收到新的数据,
此种情况也可能发生。

© 著作权归作者所有

青春无极限
粉丝 2
博文 127
码字总数 70524
作品 0
卢湾
程序员
私信 提问
关于 STM32 UART4 的一些小问题

不知为什么,STM32的中、小容量启动文件中没有发现UART4,UART5的中断处理函数,也就是在HD以下的版本中是没有UART4、UART5中断的喽?但查了下,中等容量的STM32F103RCT6是有UART4、UART5的,...

loue
2015/01/15
3.9K
2
STM32单片机的串口通信波特率应该这样计算~

不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以...

dp29sym41zygndvf
2017/12/31
0
0
死循环在BEAB BKPT 0xAB汇编的解决办法

今天调试STM32时发现一直停在 0x20002460 BEAB BKPT 0xAB(我用的是RAM调试),上网搜资料找到了解决办法。 原文: 以前使用printf 都很顺利,程序可以很自然地通过串口输出字符串,最近使用...

fcsong000833
2012/08/12
275
0
STM32 串口通信(库函数操作)

2018/4/5 1.说在前面: 清明三天小假期,放松一下无可厚非,但是,依旧要完成自己的学习任务 2.串口通信的简单介绍: 1.将串口作为一个沟通的渠道,可以和外界进行接收和发送信号 2.STM32和串...

lzinner
2018/04/05
0
0
STM32学习笔记(7)——USART串口的使用

1、 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用...

葫芦娃的后桌
2018/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
26分钟前
7
0
Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设...

木木匠
50分钟前
28
0
mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴。 下期我们将继续分享go语言的系...

IT干货栈
今天
10
0
OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
892
13
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部