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就是自己定义接收数据的一个变量(缓存区)。函数是库函数,读                 取八位数据。

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

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

STM8S103之串口中断接收

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

STM8 UART中断发,中断收

STM8 UART 初始化配置STM8 UART的几个常用寄存器分别为: UART1_CR1:控制寄存器1 UART1_CR3:控制寄存器3 UART1_BRR2:波特率寄存器2 UART1_...
  • yuanquanzheng
  • yuanquanzheng
  • 2017年01月23日 16:46
  • 2288

STM8学习笔记-----uart1串口中断

uart1串口发送、接收中断。 目标:串口接收1,点亮led1,接收2点亮led2,接收到其他字符关闭led1和led2。 步骤如下: 1、编写led.h和led.c文件。略 2、编写...
  • lwenqu
  • lwenqu
  • 2017年08月30日 20:58
  • 722

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

串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。 ...
  • DevinTT
  • DevinTT
  • 2016年09月12日 13:05
  • 13340

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

原因串口进入了OR(过载错误)中断解决方法必须添加if(UART1_GetITStatus(UART1_IT_RXNE )!= RESET),若不添加,会导致UART1->DR被异常读取,不断进入中断...
  • peyogoat
  • peyogoat
  • 2017年05月15日 11:46
  • 820

STM8S处理串口中断注意

//溢出处理-如果发生溢出需要先清除ORE,再读DR寄存器 则可清除不断入中断的问题 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET) { ...
  • lan120576664
  • lan120576664
  • 2014年02月07日 11:06
  • 6322

STM8S 115200bps 串口中断连续接收出错问题

内部16M晶振误差太大,导致波特率不准,9600bps可以。要想使用115200,就用外部晶振吧。...
  • binchel
  • binchel
  • 2013年12月17日 22:47
  • 2561

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

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

STM32 UART常用的3种中断接收

#include "sys.h" #include "usart.h"   #include "main.h" //如果使用ucos,则包括下面的头文件即可. #if SYSTEM_S...
  • li_qcxy
  • li_qcxy
  • 2017年01月08日 11:00
  • 3942

uart接收中断,带解释,可以拷贝直接用

main.c #include "LPC17xx.h" #include "uart.h" int main(void) { // CMSIS的启动代码里面已经调用了 Syst...
  • alangdangjia
  • alangdangjia
  • 2013年03月11日 18:19
  • 6211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM8S类型单片机UART一直进入接收中断问题解决方案
举报原因:
原因补充:

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