windman 发表于 2023-6-27 22:07:22

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

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

void Uart2Isr() interrupt 8
{
    if (S2CON & 0x02)
    {
      S2CON &= ~0x02;
      busy = 0;
    }
    if (S2CON & 0x01)
    {
      S2CON &= ~0x01;
      buffer = 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运行,输出就会变成这样


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

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

32位8051-AI 发表于 2023-6-29 14:10:53

STC8H4K64TL有RTC


windman 发表于 2023-6-29 15:39:30

32位8051-STCAI 发表于 2023-6-29 14:10
STC8H4K64TL有RTC

感谢大侠的及时回复,非常感谢!
页: [1]
查看完整版本: STC8H4k64TL串口2在线仿真的BUG,请问如何解决?