找回密码
 立即注册
查看: 643|回复: 12

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

[复制链接]

该用户从未签到

2

主题

8

回帖

48

积分

新手上路

积分
48
发表于 2023-6-13 10:41:52 | 显示全部楼层 |阅读模式
本帖最后由 MaDaHua 于 2023-6-13 10:56 编辑

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

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

下面是中断函数
2.png

回复 送花

使用道具 举报

该用户从未签到

2

主题

8

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2023-6-13 10:46:25 | 显示全部楼层
是没进中断 红圈那部分那部分程序。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

8

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2023-6-13 11:38:03 | 显示全部楼层
刚才试了,在程序中把  UR3TOSR |= 0x01;  可以进入中断(红圈那部分)。  
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    26

    主题

    1325

    回帖

    4127

    积分

    论坛元老

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

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

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    回帖

    48

    积分

    新手上路

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

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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    回帖

    48

    积分

    新手上路

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

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

    点评

    zhp
    STC32G8K64系列的串口3超时功能是没问题的 测试代码如下: 你的代码问题应该是出在这里 正确代码或许应该是 "UR3TOCR &= ~SCALE_1us;"  详情 回复 发表于 2023-6-15 10:16
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    719

    回帖

    2558

    积分

    超级版主

    积分
    2558
    发表于 2023-6-15 10:16:15 | 显示全部楼层
    本帖最后由 zhp 于 2023-6-15 10:23 编辑
    MaDaHua 发表于 2023-6-13 21:22
    刚才按照你的说法试了,  把EAXRAM(); 删了,留下第一个EAXSFR();还是不行。

    STC32G8K64系列的串口3超时功能是没问题的

    测试代码如下:
    1. #include "stc32g.h"
    2. #define FOSC    11059200UL
    3. #define BRT     (65536 - FOSC / 115200 / 4)
    4. sbit LED    =   P2^0;
    5. void uart3() interrupt UART3_VECTOR
    6. {
    7.     if (S3TI)               //串口3发送中断
    8.     {
    9.         S3TI = 0;
    10.     }
    11.    
    12.     if (S3RI)               //串口3接收中断
    13.     {
    14.         S3RI = 0;
    15.         S3BUF = S3BUF;
    16.     }
    17.    
    18.     if (UR3TOSR & 0x01)     //串口3超时中断
    19.     {
    20.         UR3TOSR = 0x00;
    21.         
    22.         LED = ~LED;         //超时指示LED
    23.     }
    24. }
    25. int main()
    26. {
    27.     EAXFR = 1;
    28.     WTST = 0x00;
    29.    
    30.     P0M0 = 0x00; P0M1 = 0x00;
    31.     P1M0 = 0x00; P1M1 = 0x00;
    32.     P2M0 = 0x00; P2M1 = 0x00;
    33.     P3M0 = 0x00; P3M1 = 0x00;
    34.     P4M0 = 0x00; P4M1 = 0x00;
    35.     P5M0 = 0x00; P5M1 = 0x00;
    36.     P6M0 = 0x00; P6M1 = 0x00;
    37.     P7M0 = 0x00; P7M1 = 0x00;
    38.    
    39.     IAP_TPS = 11;
    40.    
    41.     S3CON = 0x10;           //串口3使用定时器2作为波特率发生器
    42.     T2L = BRT;              //设置串口2波特率
    43.     T2H = BRT >> 8;
    44.     AUXR = 0x14;            //设置定时器2为1T模式并启动定时器2
    45.    
    46.     UR3TOCR = 0xc0;         //使能串口3接收超时功能
    47.     UR3TOSR = 0x00;         //清超时状态
    48.     UR3TOTH = 0x00;         //设置超时时间为100us
    49.     UR3TOTL = 100;
    50.    
    51.     ES3 = 1;               
    52.     EA = 1;
    53.    
    54.     while (1);
    55. }
    复制代码


    你的代码问题应该是出在这里
    1.png
    正确代码或许应该是 "UR3TOCR &= ~SCALE_1us;"


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

    串口3超时功能测试代码.zip

    16.42 KB, 下载次数: 32

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    回帖

    48

    积分

    新手上路

    积分
    48
     楼主| 发表于 2023-6-15 11:16:56 | 显示全部楼层
    zhp 发表于 2023-6-15 10:16
    STC32G8K64系列的串口3超时功能是没问题的

    测试代码如下:

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

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

    点评

    zhp
    这里的定义有错,不知问题是否由这里引起的  详情 回复 发表于 2023-6-15 11:34
    zhp
    超时计时器 是在这个语句是工作的吗?UR3TOCR = 0xc0; 是的 还有超时计数器,到达指定的计数是停止,还是重复工作?重复工作  详情 回复 发表于 2023-6-15 11:26
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    719

    回帖

    2558

    积分

    超级版主

    积分
    2558
    发表于 2023-6-15 11:26:51 | 显示全部楼层
    本帖最后由 zhp 于 2023-6-15 11:32 编辑
    MaDaHua 发表于 2023-6-15 11:16
    SCAL_1us  没问题。因为我是这样定义的

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

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    719

    回帖

    2558

    积分

    超级版主

    积分
    2558
    发表于 2023-6-15 11:34:33 | 显示全部楼层
    MaDaHua 发表于 2023-6-15 11:16
    SCAL_1us  没问题。因为我是这样定义的

    1.png

    这里的定义有错,不知问题是否由这里引起的
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-13 01:17 , Processed in 0.070728 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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