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?
STC8H4K64TL有RTC
32位8051-STCAI 发表于 2023-6-29 14:10
STC8H4K64TL有RTC
感谢大侠的及时回复,非常感谢!
页:
[1]