经过昨天对热启动和冷启动分析,芯哥奇怪的发现冷启动是专为下载程序而设计,热启动一共有4种方式,这4种方式中有一项启动复位过程和冷启动一模一样。芯哥瞬间觉得如果复位启动过程一模一样,那是不是意味着可以使用热启动来实现下载程序。
既然这两种复位启动过程是一样的,只不过实现的方式不一样。那就来具体分析一下这个过程。热启动中是通过对ISP_CONTR寄存器操作为60H数据即可产生软复位,就实现和冷启动一样的过程。而冷启动是通过对单片机进行无电到有电的操作实现硬复位所以是不是只要在需要下载程序的时候,对ISP_CONTR寄存器操作为60H数据就会出现下载程序的可能呢?那么首先要清楚ISP_CONTR寄存器如何操作。这里就涉及到寄存器的操作方法,如果你是直接学习STM32的同学,我想这个过程你可能无法理解。这就是为什么要学好底层操作的原因之一。所以直接在官方手册中查找ISP_CONTR寄存器相关介绍。这里要关心几个信息是:1寄存器的地址:想对任何寄存器进行操作,必须知道寄存器的地址。2寄存器需要操作的数据:前面已经看到需要对ISP_CONTR寄存器写入60H。
接下来就是操作过程了。首先新建一个工程,这个操作就不演示了,很简单,不会的同学要先入门。在工程项目头文件reg52.h中会定义单片机相关的寄存器。但是发现并没有关于ISP_CONTR寄存器的定义,那就只能自己写了。
想要操作单片机寄存器,需要知道ISP_CONTR寄存器的地址。从数据手册中看到ISP_CONTR寄存器地址为E7H。
接下来在程序中,定义ISP_CONTR寄存器。sfr是用来定义寄存器的,这里可以看到将E7H地址对应的寄存器命名为ISP_CONTR。当前名称可以随便去起。
sfr ISP_CONTR=0xE7;
接下来设计一个按键,用于在需要下载程序时,通过按下按键后,控制ISP_CONTR寄存器为60H。
if(key1==0)
{ delay_ms(5); if(key1==0) { while(key1==0); ISP_CONTR=0x60; }}
接下来进行测试,烧写如代码后,单片机一致保持通电状态。
接下来点击ISP下载按钮,软件提示正在检测目标单片机。
这个时候不需要对系统进行冷启动,只需要按下按键即可实现下载。并且提示操作成功。
是不是可以通过这种方式研究一下OTA升级呢?