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;
// }
}
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=10920&pid=108832
写1清零,读永远是0 本帖最后由 邮箱 于 2024-11-13 23:57 编辑
DebugLab 发表于 2024-11-13 23:38
写1清零,读永远是0
可以读的
TOIF:串口 1 超时中断请求标志位。(只读)
CTOIF:写“1”清除串口 1 超时中断标志位 TOIF。(只写)
不使能接收超时中断,查询不到超时中断标志位 TOIF 置“1” DebugLab 发表于 2024-11-13 23:38
写1清零,读永远是0
我遇到了类似的问题,
如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?
我希望不开中断但标志位能置1,通过查询方式处理
bhx 发表于 2025-6-6 18:30
我遇到了类似的问题,
如果使能超时功能且关超时中断的话,超时标记TOIF不会置1,这正常吗?
我希望不开中 ...
可以
ercircle 发表于 2025-6-6 20:19
可以
这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了中断会打断主函数。
如果关掉超时中断,也就是UR1TOCR = 0x80;就不行了,串口没有回复。你改一下试试效果。
我希望是关掉中断,不进中断,不打断主函数,在主函数查询标志位进行操作。
如果UR1TOCR = 0xc0会打开中断,如果开了中断但不写中断函数,是不太合理的操作,结果可能是不确定的
bhx 发表于 2025-6-7 11:29
这个我试了,直接运行你的程序是正常的,但是你程序里是打开了超时中断的,这样虽然是查询方式但还是进了 ...
是的测了下,这个超时功能不开中断产生不了标识位
页:
[1]