STC51单片机实现IAP远程升级过程分享

STC51单片机实现IAP远程升级过程分享

    • 1.STC内部ISP更新机制
    • 2.了解51单片机IAP分区
    • 3.IAP分区的调用流程与IAP部分源码:
    • 4.IAP步骤总结
    • 5.源码下载

关于STC单片机IAP远程更新相关信息非常少,因工作项目需要,研究了一番IAP远程更新的操作,特写下经验分享。第一次写博客,有错误的地方欢迎大家指出哈,谢谢。

1.STC内部ISP更新机制

ISP(In System Program)在系统编程,当前已成为单片机烧录程序的主流方式,其原理是由厂商在单片机内部固化一段ISP代码,STC单片机是在上电时检测是否有连续的‘d’字符,如果检测到,则认为进入ISP准备阶段。如果超时没有收到’d’,则执行用户代码区。若进入ISP准备阶段,根据STC定义的协议接收数据帧,最后完成程序的擦除、写入。在ISP准备阶段若未收到数据帧,则超时退出ISP,执行用户代码区。ISP的固有缺点便是需要线刷。但其原理在接下来的IAP远程更新中需要用到。

2.了解51单片机IAP分区

表1-1.STC典型ISP分区

分区地址 分区名称
0000H 应用分区起始
FFFFH 应用分区结束
未知 ISP固化分区

图1-1.典型用户程序FLASH分配截取
STC51单片机实现IAP远程升级过程分享_第1张图片
IAP(In Application Program)在应用编程允许用户直接在应用程序中直接对程序进行编程。因此我们可以利用IAP功能实现程序的远程更新。STC采用的方式则是对单片机进行IAP分区。在此需要了解STC如何对整个单片机的FLASH进行分区的,

我们看一下图1-1。以STC8A8K64S4A12为例,在典型的ISP分区中,用户使用的代码区从0000H到FFFFH。这段地址单片机的FLASH写入的第1、2、3个字节总是以02开头,以不固定的另外两个字节ECFEH或其他地址,作为第2、3个字节。这三个字节正是单片机的启动码。在汇编语言中,02表示LJMP。后面两个字节ECFE这个位置会随着IAP程序的大小而变化,这个LJMP跳转到的位置我猜想可能是厂商固化的ISP程序。因为这两个字节的地址始终大于我们实际编写的代码的大小。这也符合ISP最后跳转到代码区中的猜想。

表1-2.STC单片机IAP分区

分区地址 分区名称
0000H IAP启动码+应用分区起始
E3FFH 应用分区结束+应用启动码(3Byte)
E400H- F400H IAP分区
未知 ISP固化分区

图1-2.IAP启动代码FLASH分配截取
STC51单片机实现IAP远程升级过程分享_第2张图片
图1-3.用户程序启动代码FLASH分配截取
应用区启动代码
图1-4.keil指定IAP代码启动位置工程配置指定从0XE400到0XF3FF
STC51单片机实现IAP远程升级过程分享_第3张图片
图1-5.keil指定IAP代码启动位置工程配置大小限制为0x1000
STC51单片机实现IAP远程升级过程分享_第4张图片
图1-6.利用STC-ISP软件保存BIN格式烧写文件
STC51单片机实现IAP远程升级过程分享_第5张图片
图1-2中,程序是通过IAP实现更新的,我截取了通过IAP更新后的部分代码,可以看到,0000H地址依旧LJMP到ECFEH,这里就当是固化的ISP位置(会随我们的IAP程序大小而变化)。ISP会自动跳转到我们编写的IAP程序中,也就是E400H,因此在编写IAP程序工程时,我们需要指定工程代码生成的位置,详见配置方式图1-4、图1-5。指定了工程代码生成位置后,生成我们的IAP程序,IAP程序可以根据自己定的协议来修改,这里我们引用STC官方给的方式进行说明。IAP程序编写好了即可像烧录普通单片机一样使用ISP的方式烧录到单片机中。这样我们的单片机就具备了IAP功能。接下来就可以等待应用代码的接收了。官方的IAP程序采用Ymodem协议接收更新程序,Ymodem可以下载超级终端进行Bin文件的下发,我们新建一个工程,用来实现自己的应用代码,代码需改为从0000H开始,大小不得超过0XE3FD。bin文件可通过STC的ISP软件由HEX格式打开后,直接保存为bin格式,详见图1-6。

图1-3则是截取了E400H的前三个字节,那么这三个字节的作用是什么呢?这三个字节实际上是存储了应用区的启动代码,我们简称该地址为地址A,当单片机上电后,首先跳转到厂商固化的ISP,由ISP自动跳转到我们写好的IAP代码执行,IAP获取了地址A,并通过函数指针跳转到地址A,这样就成功的从IAP启动了应用代码。

3.IAP分区的调用流程与IAP部分源码:

分区名称:START->ISP->IAP->APP;
分区地址:0000H->未知ISP地址->E400H->地址A;

	while(1)//IAP主循环体,完整代码DEMO可在我的资源中下载。
	{
	//	TX1_write2buff('A');
		HandCnt = 0;

		for(WaitTime = 0; WaitTime < 300; WaitTime++)		//5秒超时, 等待接收u	
		{
			UART1_RxPackage();
			if((RxCnt == 1) && (RxBuff[0] == 'd'))//收到‘d’
			{
				if(++HandCnt >= 10)//连续超过10个‘d’
				{
					i = UART_Download();//调用解析函数,返回解析结果
					WaitTime = 250;     
					if(i == 1)			PrintString1("\r\n User abort!\r\n");
					else if(i == 2)		PrintString1("\r\n PC Cancel!\r\n");
					else if(i == 4)		PrintString1("\r\n Programming Error!\r\n");
					else if(i == 0)
					{
						PrintString1("\r\n\r\n Programming Completed Successfully!\r\n");
						ReturnNameAndLength();
					}
				}
			}
		//	else	HandCnt = 0;
		}

		if(ISP_ReadByte(ISP_ADDRESS-3) == 0x02)//判断E400H的前面三个字节,即地址A,第一个字节为02,LJMP。
		{
            SCON = 0;
			AUXR = 0;
            TMOD = 0;
            TL0 = 0;
            TH0 = 0;
            TH1 = 0;
            TL1 = 0;
            TCON = 0;
			IAP_CMD = 0;

			JumpAddress = ISP_ReadByte(ISP_ADDRESS-2);
			JumpAddress = (JumpAddress << 8) | ISP_ReadByte(ISP_ADDRESS-1);	//Jump to user application
			Jump_To_Application = (pFunction) JumpAddress;
			Jump_To_Application();//函数指针直接指向地址A,运行应用区代码,完成了跳转。
		}
		PrintString1(" No AP\r\n");
	}

4.IAP步骤总结

1.超级终端IAP等待更新信息
STC51单片机实现IAP远程升级过程分享_第6张图片
2.超级终端Ymodem协议选择
STC51单片机实现IAP远程升级过程分享_第7张图片
2.IAP程序更新成功信息
STC51单片机实现IAP远程升级过程分享_第8张图片
1.编写IAP程序、并进行IAP分区,IAP程序工程起始地址为E400H~F400H。编译IAP工程并通过STC-ISP下载到单片机中,下载时可选EEPROM的空间为64K。

2.新建一个APP工程,APP起始地址设为0000H~E3FCH;剩余的E3FDH、E3FEH、E3FFH是IAP程序用来存储APP启动地址的。在APP工程里编写逻辑代码,即需要实现的功能,与平时写代码无异。编译完毕后,生成HEX文件,使用STC-ISP打开,打开窗口有一个保存数据,保存下来的正是bin文件。

3.打开超级终端,新建一个串口连接,按下‘d’键,使IAP进入准备阶段。选择Ymodem协议,发送bin文件,官方IAP程序将完成更新。

4.官方采用的Ymodem协议,我们可以通过修改官方IAP程序更改为其他协议。

5.源码下载

完整IAP源码工程与超级终端已上传到我的资源,有需要的朋友可以下载。

本文内容主观性较强,文中如有错误,还望指出,共同进步,谢谢。

你可能感兴趣的:(单片机)