注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
ddllxxrr的个人空间 https://home.eeworld.com.cn/space-uid-73808.html [收藏] [复制] [分享] [RSS]
日志

【沁恒试用】单步仿真

已有 369 次阅读2019-7-7 09:01 |个人分类:我发表的

我记得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);	
	}


}

结果仿真如下:

我觉得泌恒这个仿真比较好。不花任何费用。只是考两个程序。然后按排一下函数即可。

 

附仿真例程:




此内容由EEWORLD论坛网友ddllxxrr原创,如需转载或用于商业用途需征得作者同意并注明出处
 

 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章