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

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

092404_Adk2_2252538.png

当一字符被接收到时,
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读访问之间)接收到新的数据,
此种情况也可能发生。

转载于:https://my.oschina.net/u/2252538/blog/479129

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值