MaDaHua 发表于 2023-6-13 10:41:52

关于STC32G8K串口3的超时功能的问题。

本帖最后由 MaDaHua 于 2023-6-13 10:56 编辑

通讯程序是正常的。加入接收超时功能,超时功能没起作用。 求助一下,我程序问题出在哪?


这里我是按照手册的寄存器,一个一个写的。 但总觉得少个启动超时计数器。不知道我的想法对不对。

下面是中断函数


MaDaHua 发表于 2023-6-13 10:46:25

是没进中断 红圈那部分那部分程序。

MaDaHua 发表于 2023-6-13 11:38:03

刚才试了,在程序中把UR3TOSR |= 0x01;可以进入中断(红圈那部分)。

乘风飞扬 发表于 2023-6-13 19:08:21

MaDaHua 发表于 2023-6-13 11:38
刚才试了,在程序中把UR3TOSR |= 0x01;可以进入中断(红圈那部分)。

红圈里的 EAXRAM 建议删掉,扩展寄存器访问使能可以一直开着(初始化时打开,之后都不要再关闭了)
这里被你关闭了,那么进一次中断后,其它地方的扩展寄存器读写之前就必需重新开启,否则就不能正常访问。

MaDaHua 发表于 2023-6-13 21:21:43

乘风飞扬 发表于 2023-6-13 19:08
红圈里的 EAXRAM 建议删掉,扩展寄存器访问使能可以一直开着(初始化时打开,之后都不要再关闭了)
这里 ...

你好,我一般是开--使用--关闭。 ,这个过程。如下


MaDaHua 发表于 2023-6-13 21:22:47

乘风飞扬 发表于 2023-6-13 19:08
红圈里的 EAXRAM 建议删掉,扩展寄存器访问使能可以一直开着(初始化时打开,之后都不要再关闭了)
这里 ...

刚才按照你的说法试了,把EAXRAM(); 删了,留下第一个EAXSFR();还是不行。

zhp 发表于 2023-6-15 10:16:15

本帖最后由 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;"



代码中建议使用乘风飞扬的访问方式:初始化时打开,之后都不要再关闭了

MaDaHua 发表于 2023-6-15 11:16:56

zhp 发表于 2023-6-15 10:16
STC32G8K64系列的串口3超时功能是没问题的

测试代码如下:


SCAL_1us没问题。因为我是这样定义的


看了你给的代码。我想问下超时定时器的工作机制。
超时计时器 是在这个语句是工作的吗?UR3TOCR = 0xc0;。。
还有超时计数器,到达指定的计数是停止,还是重复工作?

zhp 发表于 2023-6-15 11:26:51

本帖最后由 zhp 于 2023-6-15 11:32 编辑

MaDaHua 发表于 2023-6-15 11:16
SCAL_1us没问题。因为我是这样定义的



你这种定义方法倒是很新奇,和一般的定义不一样
你的代码如果还是不正常,可将参考代码发出来我跑一下
就这个芯片来说,串口3的超时是没问题的

超时计时器 是在这个语句是工作的吗?UR3TOCR = 0xc0; 是的
还有超时计数器,到达指定的计数是停止,还是重复工作?重复工作

zhp 发表于 2023-6-15 11:34:33

MaDaHua 发表于 2023-6-15 11:16
SCAL_1us没问题。因为我是这样定义的






这里的定义有错,不知问题是否由这里引起的
页: [1] 2
查看完整版本: 关于STC32G8K串口3的超时功能的问题。