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

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-23 01:47:00

1

主题

13

回帖

319

积分

中级会员

积分
319
发表于 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?
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-04-28 14:10:14

19

主题

385

回帖

2508

积分

版主

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-23 01:47:00

1

主题

13

回帖

319

积分

中级会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:52 , Processed in 0.132627 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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