STM8S类型单片机UART一直进入接收中断问题解决方案

原创 2017年01月03日 17:55:19

问题描述:

在一个项目中,下位机使用的是STM8S003F3为主芯片。在使用RS485进行与上位机通信时,会一直进入接收中断,根本未接收到上位机的正确数据。

解决过程:

一开始以为是485芯片R0引脚未上拉的缘故导致这个问题,经过将此引脚通过MCU内部上拉,问题得到缓解。程序工作也稳定了,运行了一周也没问题,所以一直以为问题解决了,结果在实地安装后,没过多久又出现了这个问题,按理说,如果是外部电磁干扰,应该是偶发,也不应该出现了就不会好起来,干扰源不可能一直都在。然后又是一个头疼的事啊。。继续找答案解决。

这时又跑去官网下载了stm8s类芯片的应用手册,重点就是它了。

原来stm8s类型芯片的UART使用时在接收中断时要注意一个过载问题,下面呢就是手册原文

过载错误
如果RXNE还没有被复,又接收到一个字符,则发生溢出错误。数据只有当RXNE位被清零后
才能从移位寄存器转移到RDR寄存器。
当溢出错误产生时:
● OR位被置位。
● RDR内容将不会丢失。读UART_DR寄存器仍能得到先前的数据。
● 移位寄存器中以前的内容将被覆盖。随后接收到的数据都将丢失。
● 如果RIEN位被置1,则产生中断。
顺序执行对UART_SR和UART_DR寄存器的读操作,可复位OR位

首先STM8的UART接收中断的使能位是RIEN,而当RIEN为1的时候就会进入接收中断,而能让RIEN为1的时候是有两种情况的。

1,一个就是在接收寄存器不为空的时候。(对应的中断请求标志RXNE)

2,另一个就是上面说的过载错误了,在RXNE标志位还没有复位,又接收到一个字符,这时也会触发接收                   中断。(对应的中断标志位OR


那么我们的问题就是出现在这里了,我们在每次接收中断都会清除RXNE标志位,但是并没有清除OR标志位,故当出现一次RXNE还没有被复,又接收到一个字符的情况也就出现了OR一直没被清除,所以就一直进入接收中断了。所以解决问题就是只要每次接收中断都需要清除RXEN和OR这两个标志位就可以解决问题了。


解决方法:

对于RXNE清零有两种方法:直接手动清零或读UART_DR寄存器就可以让RXNE清零。

  对于OR清零就不能直接手动写0了,这时为了同时能清除RXNE和OR标志位,我们就使用手册上最后一句给的方案。顺序读取这两个寄存器,这样即清除了OR同时又清除了RXNE标志位。

代码:(用的stm8s lib库)

 INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
    /* Read one byte from the receive data register */
if( UART1_GetITStatus(UART1_IT_RXNE) == SET)
{
    Rx
data = UART1_ReceiveData8();
}
}

if( UART1_GetITStatus(UART1_IT_RXNE) == SET)

这句就是读取UART_SR寄存器,函数是库函数

Rxdata = UART1_ReceiveData8();

                这句就是读取UART_DR寄存器,Rxdata就是自己定义接收数据的一个变量(缓存区)。函数是库函数,读                 取八位数据。

至此,无限进入接收中断的问题就解决了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

STM8 UART中断发,中断收

STM8 UART 初始化配置STM8 UART的几个常用寄存器分别为: UART1_CR1:控制寄存器1 UART1_CR3:控制寄存器3 UART1_BRR2:波特率寄存器2 UART1_...

stm8s中UART的用法(四种UART中断)

一、应用实例 1.1系统功能  使用STM8的USART进行自发自收(将发送引脚RXD短接到接收引脚TXD),发出数据:0,1,2。。。数据,能接收到自己发出的数据:0,1,2。。。使用LED作出简单...

STM8S103之串口中断接收

本篇博文最后修改时间:2017年08月4日 17:23。 一、简介 本文以STM8S103F3P6编程为例,介绍STM8S103F3P6串口中断接收。 二、实验平台 电脑平...

解决stm8会卡在串口中断的问题

原因串口进入了OR(过载错误)中断解决方法必须添加if(UART1_GetITStatus(UART1_IT_RXNE )!= RESET),若不添加,会导致UART1->DR被异常读取,不断进入中断...

STM8S处理串口中断注意

//溢出处理-如果发生溢出需要先清除ORE,再读DR寄存器 则可清除不断入中断的问题 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET) { ...

STM8S_004_UART基本收发数据

Ⅰ、写在前面 做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,关于UART相关的知识就比较重要。 ...

stm8s开发(三) UART的使用:串口通信!

串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)