STC8H系列单片机通过串口实现不停电下载的IAP功能

1.前言

在使用串口往STC单片机烧录程序时,需要冷启动,先点击下载再上电。这样做有一定的缺点。首先,一些特殊的外围电路要求一直保持有电状态,有些客户需求我们能远程操控设备就可以升级程序,而不需要去现场断电设备。其次,频繁的断电上电操作也比较麻烦。

2. 实现原理

STC 单片机在硬件设计时,增加了一个软复位寄存器 (IAP CONTR),让用户可以通过设置此寄存器来决定 CPU 复位后重新执行用户代码还是复位到ISP 区执行ISP 系统代码。当向IAP CONTR 寄存器号入 0x20 时,CPU 复位后重新执行用户代码: 当向IAP CONTR 寄存器写入0x60 时,CPU 复位后复位到 ISP 区执行 ISP 系统代码。
要实现不停电进行 ISP 下载,我们可以在接收中断中加入等待一个特殊的串口命令,例如默认的“@STCISP#”。当我们发送命令,单片机接收检测到满足下载条件时,就通过软件触发软复位寄存器复位到 ISP区执行ISP 系统代码,从而实现不停电JSP 下载。

我使用的是STC8H8K64U单片机,可以在STC官网查询自己的型号是否具有IAP功能。

3. STC-ISP设置

有几点注意:(1)串口模式的波特率应该与程序中的保持一致
(2)“下次使用STC-HID接口进行ISP下载”不需要勾选
(3)“目标文件变化时自动装载并发送下载命令”可选可不选,如果选了的话你每编译一次它会自动发送命令帮你下载

4. 中断接收程序

最开始我参考了另外一位博主写的中断接收程序,可以成功运行,链接附上!
STC8H8K64U单片机-免冷启动下载程序
但是后来在运用到别的程序上时出现了一些小问题。就是这一块代码部分:

这段代码的含义是:检查接收计数器 COM1.RX_Cnt 的值是否大于等于8,即检查是否接收到了指定长度的数据。如果是,将接收计数器 COM1.RX_Cnt 的值重置为0,准备接收下一帧数据。这就导致了如果接收到的数据字节大于8,就会被重置,数据会丢失。
我当时想了一个修改方法是修改自定义命令的长度,例如设为“@STCISPHH”就可以修改接收10个字节的长度了,但是这个方法并不好用。因此我根据官方手册中的代码进行修改,在接收中断中加入一串命令函数,即使换到别的实验程序中也只需要拷贝过去即可,非常方便。
以官方例程《06-串口1中断模式与电脑收发测试》为例。

主函数

void main(void)
{
	u8	i;
  char index;
	
	EAXSFR();		/* 扩展寄存器访问使能 */
	GPIO_config();
	UART_config();
	EA = 1;
  index=0;
	
	PrintString1("STC8H8K64U UART1-UART3 Test Programme!\r\n");  //UART1发送一个字符串

	while (1)
    {
            delay_ms(1);
            if(COM3.RX_TimeOut > 0)		//超时计数
		        {
			        if(--COM3.RX_TimeOut == 0)
			        {
			         	if(COM3.RX_Cnt > 0)
				       {
				          for(i=0; i<COM3.RX_Cnt; i++)	TX1_write2buff(RX3_Buffer[i]);	//把收到的数据通过串口1转发
							 }
				              COM3.RX_Cnt = 0;
			         }
		      }
    } 
}

UART1中断函数

#ifdef UART1

char code*STCISPCMD="@STCISP#";
char index;


void UART1_ISR_Handler (void) interrupt UART1_VECTOR
{
	char dat;

	if(RI)
	{
		RI = 0;
		dat =SBUF;
		
		if(dat==STCISPCMD[index])
		{
			index++;
			if(STCISPCMD[index]=='\0')
				IAP_CONTR=0x60;
		}
		else
		{
		   index=0;
			 if(dat==STCISPCMD[index])
				index++;
		}
		if(COM1.RX_Cnt >= COM_RX1_Lenth)	COM1.RX_Cnt = 0;
    RX1_Buffer[COM1.RX_Cnt++] = SBUF;
    COM1.RX_TimeOut = TimeOutSet1;
	}

	if(TI)
	{
		TI = 0;
		
        #if(UART_QUEUE_MODE == 1)   //判断是否使用队列模式
		if(COM1.TX_send != COM1.TX_write)
		{
		 	SBUF = TX1_Buffer[COM1.TX_send];
			if(++COM1.TX_send >= COM_TX1_Lenth)		COM1.TX_send = 0;
		}
		else	COM1.B_TX_busy = 0;
        #else
        COM1.B_TX_busy = 0;     //使用阻塞方式发送直接清除繁忙标志
        #endif
	}
}
#endif

这样就可以实现不断电IAP下载啦,可以使程序更新更加便捷,无需断电冷启动就能实现程序的更新。

5.方法总结

对于STC8H8K64U单片机,可以使用以下方法来实现在不需要断电冷启动的情况下更新程序:

(1)使用IAP功能:STC8H8K64U单片机内置了IAP(In-Application Programming)功能,可以通过IAP指令和相关函数来进行程序更新。可以使用IAP提供的函数,通过串口或其他通信方式将新的程序代码加载到单片机的存储器中,实现程序的更新。

(2)使用ISP接口:STC8H8K64U单片机提供了ISP(In-System Programming)接口,可以通过该接口连接到外部编程器或开发板上,实现对单片机的编程。通过连接编程器或开发板,可以直接更新单片机的程序,无需断电冷启动。

(3)使用Bootloader:可以在STC8H8K64U单片机的Flash中预留一部分空间作为Bootloader。Bootloader是一个特殊的程序,它用来接收和处理新程序的更新请求,并将新程序加载到单片机的存储器中。通过Bootloader,可以在不需要断电冷启动的情况下更新程序。

(4)使用USB-CDC虚拟串口。通过这个串口实现通信,代码里面定义了不停电自动ISP下载的命令,在STC-ISP里面就可以不断电自动ISP下载。

物联沃分享整理
物联沃-IOTWORD物联网 » STC8H系列单片机通过串口实现不停电下载的IAP功能

发表评论