找回密码
 立即注册
查看: 488|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2025-06-16 12:55:15

22

主题

282

回帖

1091

积分

金牌会员

积分
1091
发表于 2024-11-13 19:45:31 | 显示全部楼层 |阅读模式
使能串口 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;
//        }
}

REMOVEUNUSED
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2025-06-16 12:55:15

22

主题

282

回帖

1091

积分

金牌会员

积分
1091
发表于 2024-11-13 20:05:33 | 显示全部楼层
QQ浏览器截图20241113200143.png
REMOVEUNUSED
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16645
发表于 2024-11-13 21:58:42 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2024-11-13 23:38:58 | 显示全部楼层
写1清零,读永远是0

点评

我遇到了类似的问题,如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?我希望不开中断但标志位能置1,通过查询方式处理  详情 回复 发表于 2025-6-6 18:30
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:279
  • 最近打卡:2025-06-16 12:55:15

22

主题

282

回帖

1091

积分

金牌会员

积分
1091
发表于 2024-11-13 23:55:24 | 显示全部楼层
本帖最后由 邮箱 于 2024-11-13 23:57 编辑
Debu*** 发表于 2024-11-13 23:38
写1清零,读永远是0

可以读的
TOIF:串口 1 超时中断请求标志位。(只读)
CTOIF:写“1”清除串口 1 超时中断标志位 TOIF。(只写)

不使能接收超时中断,查询不到超时中断标志位 TOIF 置“1”
REMOVEUNUSED
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-06-15 00:11:09
已绑定手机

5

主题

7

回帖

166

积分

荣誉版主

积分
166
发表于 2025-6-6 18:30:08 | 显示全部楼层
Debu*** 发表于 2024-11-13 23:38
写1清零,读永远是0

我遇到了类似的问题,
如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?
我希望不开中断但标志位能置1,通过查询方式处理

点评

可以 [attachimg]102939[/attachimg] [attachimg]102938[/attachimg]  详情 回复 发表于 2025-6-6 20:19
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 2025-6-6 20:19:08 | 显示全部楼层
bh*** 发表于 2025-6-6 18:30
我遇到了类似的问题,
如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?
我希望不开中 ...


可以
截图202506062019051830.jpg
截图202506062018465072.jpg
串口1使用DMA中断模式与电脑收发测试 - 副本.zip (53.84 KB, 下载次数: 2)

点评

这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了中断会打断主函数。 [attachimg]102970[/attachimg] 如果关掉超时中断,也就是UR1TOCR = 0x80;就不行了,串口  详情 回复 发表于 2025-6-7 11:29
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-06-15 00:11:09
已绑定手机

5

主题

7

回帖

166

积分

荣誉版主

积分
166
发表于 2025-6-7 11:29:10 | 显示全部楼层

这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了中断会打断主函数。
微信截图_20250607112303.png
如果关掉超时中断,也就是UR1TOCR = 0x80;就不行了,串口没有回复。你改一下试试效果。
微信截图_20250607112437.png
我希望是关掉中断,不进中断,不打断主函数,在主函数查询标志位进行操作。

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

点评

是的测了下,这个超时功能不开中断产生不了标识位  详情 回复 发表于 2025-6-7 12:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 2025-6-7 12:05:36 | 显示全部楼层
bh*** 发表于 2025-6-7 11:29
这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了 ...

是的测了下,这个超时功能不开中断产生不了标识位
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 18:18 , Processed in 0.145139 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表