本帖最后由 zhp 于 2023-6-15 10:23 编辑
STC32G8K64系列的串口3超时功能是没问题的
测试代码如下:
- #include "stc32g.h"
-
- #define FOSC 11059200UL
- #define BRT (65536 - FOSC / 115200 / 4)
-
- sbit LED = P2^0;
-
- void uart3() interrupt UART3_VECTOR
- {
- if (S3TI) //串口3发送中断
- {
- S3TI = 0;
- }
-
- if (S3RI) //串口3接收中断
- {
- S3RI = 0;
- S3BUF = S3BUF;
- }
-
- if (UR3TOSR & 0x01) //串口3超时中断
- {
- UR3TOSR = 0x00;
-
- LED = ~LED; //超时指示LED
- }
- }
-
- int main()
- {
- EAXFR = 1;
- WTST = 0x00;
-
- P0M0 = 0x00; P0M1 = 0x00;
- P1M0 = 0x00; P1M1 = 0x00;
- P2M0 = 0x00; P2M1 = 0x00;
- P3M0 = 0x00; P3M1 = 0x00;
- P4M0 = 0x00; P4M1 = 0x00;
- P5M0 = 0x00; P5M1 = 0x00;
- P6M0 = 0x00; P6M1 = 0x00;
- P7M0 = 0x00; P7M1 = 0x00;
-
- IAP_TPS = 11;
-
- S3CON = 0x10; //串口3使用定时器2作为波特率发生器
- T2L = BRT; //设置串口2波特率
- T2H = BRT >> 8;
- AUXR = 0x14; //设置定时器2为1T模式并启动定时器2
-
- UR3TOCR = 0xc0; //使能串口3接收超时功能
- UR3TOSR = 0x00; //清超时状态
- UR3TOTH = 0x00; //设置超时时间为100us
- UR3TOTL = 100;
-
- ES3 = 1;
- EA = 1;
-
- while (1);
- }
复制代码
你的代码问题应该是出在这里
正确代码或许应该是 "UR3TOCR &= ~SCALE_1us;"
代码中建议使用乘风飞扬的访问方式:初始化时打开,之后都不要再关闭了
|