关于STC32G8K串口3的超时功能的问题。
本帖最后由 MaDaHua 于 2023-6-13 10:56 编辑通讯程序是正常的。加入接收超时功能,超时功能没起作用。 求助一下,我程序问题出在哪?
这里我是按照手册的寄存器,一个一个写的。 但总觉得少个启动超时计数器。不知道我的想法对不对。
下面是中断函数
是没进中断 红圈那部分那部分程序。 刚才试了,在程序中把UR3TOSR |= 0x01;可以进入中断(红圈那部分)。 MaDaHua 发表于 2023-6-13 11:38
刚才试了,在程序中把UR3TOSR |= 0x01;可以进入中断(红圈那部分)。
红圈里的 EAXRAM 建议删掉,扩展寄存器访问使能可以一直开着(初始化时打开,之后都不要再关闭了)
这里被你关闭了,那么进一次中断后,其它地方的扩展寄存器读写之前就必需重新开启,否则就不能正常访问。 乘风飞扬 发表于 2023-6-13 19:08
红圈里的 EAXRAM 建议删掉,扩展寄存器访问使能可以一直开着(初始化时打开,之后都不要再关闭了)
这里 ...
你好,我一般是开--使用--关闭。 ,这个过程。如下
乘风飞扬 发表于 2023-6-13 19:08
红圈里的 EAXRAM 建议删掉,扩展寄存器访问使能可以一直开着(初始化时打开,之后都不要再关闭了)
这里 ...
刚才按照你的说法试了,把EAXRAM(); 删了,留下第一个EAXSFR();还是不行。 本帖最后由 zhp 于 2023-6-15 10:23 编辑
MaDaHua 发表于 2023-6-13 21:22
刚才按照你的说法试了,把EAXRAM(); 删了,留下第一个EAXSFR();还是不行。
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;"
代码中建议使用乘风飞扬的访问方式:初始化时打开,之后都不要再关闭了
zhp 发表于 2023-6-15 10:16
STC32G8K64系列的串口3超时功能是没问题的
测试代码如下:
SCAL_1us没问题。因为我是这样定义的
看了你给的代码。我想问下超时定时器的工作机制。
超时计时器 是在这个语句是工作的吗?UR3TOCR = 0xc0;。。
还有超时计数器,到达指定的计数是停止,还是重复工作?
本帖最后由 zhp 于 2023-6-15 11:32 编辑
MaDaHua 发表于 2023-6-15 11:16
SCAL_1us没问题。因为我是这样定义的
你这种定义方法倒是很新奇,和一般的定义不一样
你的代码如果还是不正常,可将参考代码发出来我跑一下
就这个芯片来说,串口3的超时是没问题的
超时计时器 是在这个语句是工作的吗?UR3TOCR = 0xc0; 是的
还有超时计数器,到达指定的计数是停止,还是重复工作?重复工作
MaDaHua 发表于 2023-6-15 11:16
SCAL_1us没问题。因为我是这样定义的
这里的定义有错,不知问题是否由这里引起的
页:
[1]
2