打印
[技术问答]

发现一个中断奇怪的现象,一起研究研究

[复制链接]
749|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangcunxiake|  楼主 | 2020-8-2 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include "ML51.h"
unsigned char c;

void UART0_ISR(void) interrupt 4
{
        if((SCON&SET_BIT0)==SET_BIT0)
        {
                c = SBUF;
                SBUF = c;
                clr_SCON_RI;
        }
                P03 ^= 1;       
}


void main (void)
{



        MFP_P03_GPIO;
        P03_PUSHPULL_MODE;
        /**
        For UART0 P0.5 asTXD output setting
        * include uart.c in Common Setting for UART0
        */
        MFP_P31_UART0_TXD;                              /* set P3.1 and P3.0 as Quasi mode for UART0 trasnfer */
        MFP_P30_UART0_RXD;
        P31_QUASI_MODE;                                 
        P30_QUASI_MODE;
        UART_Open(24000000,UART0_Timer1,115200);      // Open UART0 use timer1 as baudrate generate and baud rate = 115200

        UART_Interrupt_Enable(UART0,Enable);
        ENABLE_GLOBAL_INTERRUPT;

        while(1)
        {
        }

}
注意中断函数,P03 ^= 1; 只能被执行一次,不知道为何。而把P03 ^= 1;放到前面判断的大括号里就可以运行到了,否则,只能被运行到一次就不再到这个位置了。这说明一个问题

使用特权

评论回复
沙发
huangcunxiake|  楼主 | 2020-8-2 16:36 | 只看该作者
什么问题呢,当中断连续发生的时候,如果你还没执行完,可能就二次进入中断了

使用特权

评论回复
板凳
huangcunxiake|  楼主 | 2020-8-2 16:36 | 只看该作者
因为你前面已经清理掉了中断标识,所以就可以二次响应中断信号。

使用特权

评论回复
地板
huangcunxiake|  楼主 | 2020-8-2 16:39 | 只看该作者
经过测试还是不行的,那么怎么做可以解决这个问题呢

使用特权

评论回复
5
huangcunxiake|  楼主 | 2020-8-2 16:44 | 只看该作者
经过试验,只有全部放到判断里,才能正常运行,好奇怪啊,有人知道为何吗
void UART0_ISR(void) interrupt 4
{

        if((SCON&SET_BIT0)==SET_BIT0)
        {

                c = SBUF;
                SBUF = c;
                P03 ^= 1;
                clr_SCON_RI;
        }
}

使用特权

评论回复
6
huangcunxiake|  楼主 | 2020-8-2 16:45 | 只看该作者


#include "ML51.h"
unsigned char c;

void UART0_ISR(void) interrupt 4
{

        if((SCON&SET_BIT0)==SET_BIT0)
        {

                c = SBUF;
                SBUF = c;
                P03 ^= 1;
                clr_SCON_RI;
        }
}

void main (void)
{
        //LED端口初始化为数字输出推挽模式
        MFP_P03_GPIO;
        P03_PUSHPULL_MODE;
        /**
        For UART0 P0.5 asTXD output setting
        * include uart.c in Common Setting for UART0
        */
        MFP_P31_UART0_TXD;                              /* set P3.1 and P3.0 as Quasi mode for UART0 trasnfer */
        MFP_P30_UART0_RXD;
        P31_QUASI_MODE;                                 
        P30_QUASI_MODE;
        UART_Open(24000000,UART0_Timer1,115200);      // Open UART0 use timer1 as baudrate generate and baud rate = 115200
//启用串口0中断,并开启全局中断
        UART_Interrupt_Enable(UART0,Enable);
        ENABLE_GLOBAL_INTERRUPT;

        while(1)
        {
        }

}

使用特权

评论回复
7
小灵通2018| | 2020-8-2 17:07 | 只看该作者
多谢分享。

使用特权

评论回复
8
小灵通2018| | 2020-8-2 17:18 | 只看该作者
试了一下,刚开始以为是楼主没处理发送中断。。结果不是 啊,好奇怪。


#include "ML51.h"
unsigned char c;

void UART0_ISR(void) interrupt 4
{

        if((SCON&SET_BIT0)==SET_BIT0)
        {
                c = SBUF;
                SBUF = c;
                clr_SCON_RI;
        }
        else if((SCON&SET_BIT1)==SET_BIT1)
        {
                clr_SCON_TI;
                P03 ^= 1;
        }
}

void main (void)
{
        //LED端口初始化为数字输出推挽模式
        MFP_P03_GPIO;
        P03_PUSHPULL_MODE;
        /**
        For UART0 P0.5 asTXD output setting
        * include uart.c in Common Setting for UART0
        */
        MFP_P31_UART0_TXD;                              /* set P3.1 and P3.0 as Quasi mode for UART0 trasnfer */
        MFP_P30_UART0_RXD;
        P31_QUASI_MODE;                                 
        P30_QUASI_MODE;
        UART_Open(24000000,UART0_Timer1,115200);      // Open UART0 use timer1 as baudrate generate and baud rate = 115200
//启用串口0中断,并开启全局中断
        UART_Interrupt_Enable(UART0,Enable);
        ENABLE_GLOBAL_INTERRUPT;

        while(1)
        {
        }

}

使用特权

评论回复
9
jasontu| | 2020-8-3 09:03 | 只看该作者
8051有ti 中斷及ri中斷。
傳送後也要清ti flag.
void Uart0_SendChar(unsigned char Udat)
{
        DISABLE_UART0_INTERRUPT;
        SBUF=Udat;                //蔚猁楷冞腔杅擂溫揹諳杅擂遣喳
        while(!TI);                //脹渾楷冞俇傖
  TI=0;         //錨TI楷冞俇傖梓暮               
  ENABLE_UART0_INTERRUPT;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

3522

帖子

11

粉丝