最近在做有关N76E003的项目,使用到双串口。串口的配置没有特殊要求,最基本的配置

void Uart0_Init(void)
{
//—————————串口0引脚初始化————————
set_P06;
set_P07;
set_ES; //enable uart0 interrupt
InitialUART0_Timer1(); //UART0 Baudrate initial,T1M=0,SMOD=0
} void Uart1_Init(void)
{
//—————————串口1引脚初始化————————
set_P02;
set_P16;
set_ES_1; //enable uart1 interrupt
InitialUART1_Timer3();
}

并配置了中断函数

void SerialPort0_ISR(void) interrupt
{
if(RI)
{ /* if reception occur */
clr_RI; /* clear reception flag for next reception */
uart_receive_input(SBUF);
}
} void SerialPort1_ISR(void) interrupt
{
if(RI_1)
{
clr_RI_1;
uart1_receive_input(SBUF);
}
}

运行程序发现无法进入串口1中断,在使用串口1又没办法debug的情况下(UART1的TX_1/RX_1脚也分别是ICP的SDA/LCK脚),只能在网上找资料调试。

发现了两篇博客非常有用,附上两篇博客的原文链接。

博客1:https://blog.csdn.net/u014798590/article/details/82560796

博客2:https://blog.csdn.net/a1031238455/article/details/85382595

第一篇提出是中断优先级的原因,并提供了源代码。在测试之后发现并不是这样。第二篇是在第一篇的基础上找出了问题的根本原因。

N76E003的中断机制是中断产生之后对应的中断标志位都会被置1。

所以问题出在了发送中断标志位未清零,导致串口0一直处于中断状态,而串口0的中断优先级是高于串口1的,所以根本无法进入串口1中断。

因此,在中断函数中加上清发送标志位程序

void SerialPort0_ISR(void) interrupt
{
if(RI)
{ /* if reception occur */
clr_RI; /* clear reception flag for next reception */
uart_receive_input(SBUF);
}
if(TI)
{
clr_TI; /* if emission occur */
}
} void SerialPort1_ISR(void) interrupt
{
if(RI_1)
{
clr_RI_1;
uart1_receive_input(SBUF);
}
if(TI_1)
{
clr_TI_1; /* if emission occur */
}
}

问题解决!

N76E003双串口无法进UART1中断问题解决办法的更多相关文章

  1. (转载)FT232RL通信中断问题解决办法总结

    原文地址:http://cuiweidabing.blog.163.com/blog/static/66631928201101514021658/ FT232RL是FTDI(www.ftdichip ...

  2. STC12C5A60S2 双串口通信

    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同:特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, ...

  3. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  4. MM32F0020 UART1中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1中断接收函数 4.编写MM32F0020 UART1发送字节和ASCI ...

  5. MM32F0020 UART1中断接收和UART1中断发送

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1使能中断发送函数 4.编写MM32F0020 UART1中断接收和中断 ...

  6. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  7. PHP mkdir()无写权限的问题解决方法

    这篇文章主要介绍了PHP mkdir()无写权限的问题解决方法,对umask做了详细解释以及mkdir()后没写权限的解决方法,需要的朋友可以参考下   使用mkdir创建文件夹时,发现这个函数有两个 ...

  8. Qt组件中的双缓冲无闪烁绘图

      双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...

  9. Word2016“此功能看似已中断 并需要修复”问题解决办法

    Word2016"此功能看似已中断 并需要修复"问题解决办法 修复步骤: 1. 按Windows 键+R键,输入"regedit"打开注册表. 2.找到以下键值 ...

随机推荐

  1. WDigest

    WDigest 是windows在XP系统中应用的,其作用主要是与超文本传输协议(HTTP)和简单的身份验证安全层(SASL)一起交换使用.而Digest与NTLM协议类似,也是挑战认证协议. 简单说 ...

  2. 6.集成算法boosting----AdaBoost算法

    1.提升算法 提升算法实为将一系列单一算法(如决策树,SVM等)单一算法组合在一起使得模型的准确率更高.这里先介绍两种Bagging(代表算法随机森林),Boosting(代表算法AdaBoost-即 ...

  3. HDU 3507 [Print Article]DP斜率优化

    题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...

  4. 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors

    Message dispatch高级特性之 Message cursors概述            ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...

  5. C++入门经典-例6.11-使用指针变量遍历二维数组

    1:代码如下: // 6.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #inc ...

  6. 【学习】mysql 时间戳与日期格式的相互转换

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Sel ...

  7. Java NIO学习

    Java NIO(转自:http://www.iteye.com/magazines/132-Java-NIO#585) Java NIO提供了与标准IO不同的IO工作方式: Channels,Buf ...

  8. 2019Java第十四周课程总结

    关于记事本代码上周已经写过了,这次把他粘过来了,如下: 记事本 package jishiben; import java.awt.event.ActionEvent; import java.awt ...

  9. LeetCode 40. 组合总和 II(Combination Sum II)

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能 ...

  10. 阿里镜像源配置yum

    通过more /etc/*release* 查看系统版本 (需要下载对应的系统版本) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...