邮箱 发表于 2024-11-13 19:45:31

8051U 32BIT 串口 1 接收超时的问题

使能串口 1 接收超时中断没问题


禁止串口 1 接收超时中断,查询不到串口 1 超时中断请求标志



#include "../../comm/AI8051U.h"
#include "stdio.h"
#include "intrins.h"

typedef         unsigned char      u8;
typedef         unsigned int      u16;
typedef         unsigned long      u32;

#define MAIN_Fosc      24000000UL

void Uart1_Init(void);      //9600bps@24.000MHz
      
void main(void)
{
      u32 Count = 1000;
      
    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      Uart1_Init();
      REN = 1;
      
      UR1TOTL = Count;
      UR1TOTH = Count >> 8;
      UR1TOTE = Count >> 16;
      
      UR1TOCR = 0X80;
//      UR1TOCR = 0XC0;
//      EA = 1;
      
    while(1)
    {
                if(UR1TOSR & 0X01)
                {
                        UR1TOSR |= 0X80; //清除串口1超时中断请求
                        P52 = !P52;
                }
    }
}

void Uart1_Init(void)      //9600bps@24.000MHz
{
      SCON = 0x50;                //8位数据,可变波特率
      AUXR |= 0x40;                //定时器时钟1T模式
      AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
      TMOD &= 0x0F;                //设置定时器模式
      TL1 = 0x8F;                        //设置定时初始值
      TH1 = 0xFD;                        //设置定时初始值
      ET1 = 0;                        //禁止定时器中断
      TR1 = 1;                        //定时器1开始计时
}

void Uart1_Isr(void) interrupt 4
{
//      if (TI)                              //检测串口1发送中断
//      {
//                TI = 0;                        //清除串口1发送中断请求位
//      }
//      if (RI)                              //检测串口1接收中断
//      {
//                RI = 0;                        //清除串口1接收中断请求位
//      }
//      if(UR1TOSR & 0X01)
//      {
//                UR1TOSR |= 0X80; //清除串口1超时中断请求
//                P52 = !P52;
//      }
}

邮箱 发表于 2024-11-13 20:05:33


神农鼎 发表于 2024-11-13 21:58:42



https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=10920&pid=108832

DebugLab 发表于 2024-11-13 23:38:58

写1清零,读永远是0

邮箱 发表于 2024-11-13 23:55:24

本帖最后由 邮箱 于 2024-11-13 23:57 编辑

DebugLab 发表于 2024-11-13 23:38
写1清零,读永远是0
可以读的
TOIF:串口 1 超时中断请求标志位。(只读)
CTOIF:写“1”清除串口 1 超时中断标志位 TOIF。(只写)

不使能接收超时中断,查询不到超时中断标志位 TOIF 置“1”

bhx 发表于 2025-6-6 18:30:08

DebugLab 发表于 2024-11-13 23:38
写1清零,读永远是0
我遇到了类似的问题,
如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?
我希望不开中断但标志位能置1,通过查询方式处理

ercircle 发表于 2025-6-6 20:19:08

bhx 发表于 2025-6-6 18:30
我遇到了类似的问题,
如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?
我希望不开中 ...


可以



bhx 发表于 2025-6-7 11:29:10

ercircle 发表于 2025-6-6 20:19
可以
这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了中断会打断主函数。

如果关掉超时中断,也就是UR1TOCR = 0x80;就不行了,串口没有回复。你改一下试试效果。

我希望是关掉中断,不进中断,不打断主函数,在主函数查询标志位进行操作。


如果UR1TOCR = 0xc0会打开中断,如果开了中断但不写中断函数,是不太合理的操作,结果可能是不确定的

ercircle 发表于 2025-6-7 12:05:36

bhx 发表于 2025-6-7 11:29
这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了 ...

是的测了下,这个超时功能不开中断产生不了标识位
页: [1]
查看完整版本: 8051U 32BIT 串口 1 接收超时的问题