STM32的USART的RXNE不能置位或无法置位的原因

最近刚接触STM32的USART,发现问题还真是不少,本来觉得没什么,却是耽误了好久,这次遇到的问题是:STM32的USART的RXNE不能置位或无法置位。

是仿真的时候发现这个问题的,我用自发自收,发现发送的太快了,接收数据的数目就不对了,延迟200ms啊,再慢也应该发出去了,就查原因到一直进入发送中断,接收中断进不去,但是DR接收的数据正常,就是RXNE不置位。

自己解决无果,求助网络:

1.http://www.wisearm.com/articles/201305652.html

《《原文:今天我用IARv5.5和自写固件库对STM32进行调试,通过串口助手发送数据0x55,0xAA。查看了寄存器状态USART1_DR已经为正确,但是USART1_SR中的RXNE没有被置位。USART1_SR仍为初始化时的0XC0。为什么USART1_SR中的RXNE没有置位?我一直在找原因,在搜索了好多篇文档之后,我终於在参考手册中找到了以下答案。

ORE:过载错误

当RXNE还是1的时候,当前被接收在移位寄存器中的数据要往RDR寄存器中传送时,硬件将该位置位。如果USART_CR1中的RXNEIE为1的话,则产生中断。由软件序列将其清零(先读USART_SR,然后读USART_CR)。

0:没有过载错误;

1:检测到过载错误。

注意:该位被置位时,RDR寄存器中的值不会丢失,但是移位寄存器中的数据会被覆盖。如果EIE位被设置,在多缓冲器通信模式下,ORE标志置位会产生中断的。》》

应该不是此文提到的情况,因为ORE没有置位,所以应该不是产生溢出,但是如果以后又出问题可以借鉴。

2.http://bbs.21ic.com/icview-359588-1-1.html

《《原文:“打开Peripherals下的USART窗口” 就有可能把标志位清0了。按理,关闭USART窗口 应该就行了。》》

结果出乎预料,竟是USART监视窗口出的问题,关闭此窗口后,仿真正常!

 

转载于:https://www.cnblogs.com/Lifescoding/p/4224114.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32的RXNE中断是串口接收寄存器非空中断。当接收寄存器中有数据时,RXNE标志位被位,如果使能了该中断,那么中断服务程序将会被执行。 以下是一个简单的使用USART1的RXNE中断的示例代码: ```c #include "stm32f10x.h" #include <stdio.h> void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // RXNE中断 { char data = USART_ReceiveData(USART1); // 读取接收到的数据 // 处理接收到的数据 } } int main(void) { USART_InitTypeDef usart_init_struct; NVIC_InitTypeDef nvic_init_struct; // 使能USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 配USART1 USART_StructInit(&usart_init_struct); usart_init_struct.USART_BaudRate = 115200; USART_Init(USART1, &usart_init_struct); // 使能USART1 RXNE中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 配USART1中断 nvic_init_struct.NVIC_IRQChannel = USART1_IRQn; nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 0; nvic_init_struct.NVIC_IRQChannelSubPriority = 0; nvic_init_struct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic_init_struct); // 启动USART1 USART_Cmd(USART1, ENABLE); while (1) { // 主循环 } } ``` 在上面的代码中,我们首先使能了USART1的时钟,并使用USART_StructInit()函数进行了USART1的基本配。然后我们使能了USART1的RXNE中断,并配USART1的中断服务程序。最后启动了USART1。 在USART1中有一个接收寄存器,当它非空时,RXNE标志位被位。如果使能了RXNE中断,那么当RXNE标志位被位时,中断服务程序将会被执行。在中断服务程序中,我们使用USART_ReceiveData()函数读取接收到的数据,并进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值