找回密码
 立即注册
查看: 373|回复: 2

STC8H4k64TL串口2在线仿真的BUG,请问如何解决?

[复制链接]
  • TA的每日心情
    奋斗
    2024-1-23 18:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    9

    回帖

    205

    积分

    中级会员

    积分
    205
    发表于 2023-6-27 22:07:22 | 显示全部楼层 |阅读模式
    本帖最后由 windman 于 2023-6-27 22:08 编辑

    源程序如下:就是STC-ISP(V6.91V)"串口2使用Timer2"的例程,简单重定向了一下putchar()。MCU用STC8H4K64TL,主频22.1184;程序功能:UART2连续输出字符 ‘1‘ 给串口调试助手显示。本来是调试modbus遇到的问题,就是程序只能全速运行,不能在线仿真暂停,只要一暂停后再运行就出错。最后一直精简到最基本的putchar函数。。。
    #include "reg51.h"
    #include "intrins.h"
    #include <stdio.h>
    #include <stdlib.h>

    #define FOSC        22118400UL
    #define BRT         (65536 - FOSC / 115200 / 4)

    sfr     AUXR    =   0x8e;
    sfr     T2H     =   0xd6;
    sfr     T2L     =   0xd7;
    sfr     S2CON   =   0x9a;
    sfr     S2BUF   =   0x9b;
    sfr     IE2     =   0xaf;

    sfr     P0M1    =   0x93;
    sfr     P0M0    =   0x94;
    sfr     P1M1    =   0x91;
    sfr     P1M0    =   0x92;
    sfr     P2M1    =   0x95;
    sfr     P2M0    =   0x96;
    sfr     P3M1    =   0xb1;
    sfr     P3M0    =   0xb2;
    sfr     P4M1    =   0xb3;
    sfr     P4M0    =   0xb4;
    sfr     P5M1    =   0xc9;
    sfr     P5M0    =   0xca;

    bit busy;
    char wptr;
    char rptr;
    char buffer[16];

    void Uart2Isr() interrupt 8
    {
        if (S2CON & 0x02)
        {
            S2CON &= ~0x02;
            busy = 0;
        }
        if (S2CON & 0x01)
        {
            S2CON &= ~0x01;
            buffer[wptr++] = S2BUF;
            wptr &= 0x0f;
        }
    }

    void Uart2Init()
    {
        S2CON = 0x10;
        T2L = BRT;
        T2H = BRT >> 8;
        AUXR = 0x14;
        wptr = 0x00;
        rptr = 0x00;
        busy = 0;
    }

    char putchar(char dat)
    {
        while (busy);
        busy = 1;
        S2BUF = dat;
            return dat;
    }

    void main()
    {
        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        P4M0 = 0x00;
        P4M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;

        Uart2Init();
        IE2 = 0x01;
        EA = 1;
        puts("Uart Test !\r\n");

        while (1)
        {
                            putchar('1');
        }
    }

    进入Keil仿真,按F5全速运行,满窗口的‘1‘,无任何问题。于是点击“停止”,程序停止在putchar函数上。问题来了-------
    这时只要再按F5运行,输出就会变成这样
    STC8H4k64TL串口2在线仿真的BUG,请问如何解决?-1.png

    再停止,然后按F5全速运行,输出又正常了!
    仿真调试的“停止”按钮就像一个乒乓开关一样,决定着我程序的输出是否正确这在仿真调试modbus时可把我害惨了!
    隐隐感觉貌似应该是keil或仿真驱动的问题?keil C51早就躺平废弃多年无希望,但在姚叔还没更新这V1.15的Driver前,该用什么办法patch一下这个问题哪?这个putchar还有更好的重构代码?还请楼主及各位大侠给出出主意,指条明路,小弟感激不尽!!不能停止,不能设断点暂停,只能全速运行才结果正确的“仿真”已经与我直接烧录无异了。。。

    另外顺便请教一下版主,STC8H4K64TL型号内部有没有集成RTC?还是只有STC8H4K64TLR这个型号才有RTC?
    回复 送花

    使用道具 举报

    该用户从未签到

    9

    主题

    296

    回帖

    1730

    积分

    版主

    积分
    1730
    QQ
    发表于 2023-6-29 14:10:53 | 显示全部楼层
    STC8H4K64TL有RTC
    1.png

    QQ:1463035472,微信:19952583954
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-23 18:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    9

    回帖

    205

    积分

    中级会员

    积分
    205
     楼主| 发表于 2023-6-29 15:39:30 | 显示全部楼层

    感谢大侠的及时回复,非常感谢!
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-16 07:28 , Processed in 0.061164 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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