我记得STC单片机有个芯片可以单步仿真。没想到沁恒也可以,今天试了下,表示好用。
其实很简单 :
1.将ISD51.A51和ISD51.H加入项目工程;
2.初始化串口,配置合适的波特率,最后必须使能全局中断;
3.选择合适的ISD51初始化函数;
ISDinit():初始化并运行用户程序,如果KEIL与单片机通信成功,程序就会立即终止运行
ISDwait():初始化ISD51并一直等待KEIL连接上
ISDcheck():周期性检查ISD51连接
4.编译用户程序烧录到单片机内;
5.在KEIL -> option for target -> DEBUG 设置选择ISD51 In-system Debugger,在setup里设置与ISD51串口初始化相对应的串口波特率。
6.点击DEBUG按钮进入硬件调试模式。
ISD51接口函数可在KEIL帮助文档中查到。
那么果真如此么?
我在仿真例程上修改了一下读ID那个程序:
#include "CH554.H"
#include "debug.h"
#include "STDIO.H"
//#include <absacc.h> /* Direct access to memory areas. */
#include "ISD51.H" /* Find it at the location like 'C:\Keil\C51\ISD51' */
UINT8 str[] = "hello CH55X!\n";
UINT8 t = 0;
sbit LED = P1^0;
#define ROM_CHIP_ID_ADDR 0x20
/*******************************************************************************
* Function Name : GetChipID(void)
* Description : 获取ID号和ID号和校验
* Input : None
* Output : None
* Return : None
*******************************************************************************/
UINT32 GetChipID( void )
{
UINT8 d0, d1;
UINT16 xl, xh;
E_DIS = 1; //避免进入中断
d0 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 0 );
d1 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 1 ); //ID号低字
xl = ( d1 << 8 ) | d0;
d0 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 2 );
d1 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 3 ); //ID号高字
xh = ( d1 << 8 ) | d0;
d0 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 6 );
d1 = *(PUINT8C)( ROM_CHIP_ID_ADDR + 7 ); //ID校验和
E_DIS = 0;
if ( (UINT16)( xl + xh ) != (UINT16)( ( d1 << 8 ) | d0 ) ) return( 0xFFFFFFFF );//校验ID号
return( ( (UINT32)xh << 16 ) | xl );
}
/*******************************************************************************
* Function Name : CopyChipID(void)
* Description : 获取ID号,因为Flash双字节访问,低字节在前,使用时要注意
* Input : PUINT32X buf
* Output : None
* Return : None
*******************************************************************************/
void CopyChipID( PUINT32X buf )
{
E_DIS = 1;
*( (PUINT16X)buf + 0 ) = *(const unsigned short code *)( ROM_CHIP_ID_ADDR + 0 );
*( (PUINT16X)buf + 1 ) = *(const unsigned short code *)( ROM_CHIP_ID_ADDR + 2 );
E_DIS = 0;
}
void main( void )
{
UINT32 x;
CfgFsys();
mDelaymS(10);
mInitSTDIO(); /* Baudrate = 57600, 8, 1, N */
EA = 1;
printf("INIT OK!\n");
printf("%s",str);
ISDwait(); /* Wait until Debugger sends 0xA5, comment it if not nessery. */
while(1)
{
t++; /* Add t to watch windos, this can be changged by manual. */
ISDcheck(); /* Wait util Debugger send 0xA5, if ISD51 UART already initialized. */
LED ^= 1; /* Toggle P1^0 bit. */
mDelaymS(10);
CopyChipID(&x);
printf("ID:%lx\n",x);
}
}
结果仿真如下:
我觉得泌恒这个仿真比较好。不花任何费用。只是考两个程序。然后按排一下函数即可。
附仿真例程: