本帖最后由 wyyyy 于 2019-9-27 11:05 编辑
一、原理: IAP(In Applicating Programing)在应用编程,即通过用户程序对用户程序进行升级,这样就可实现用户自由升级而不影响应用。比如一款支持IAP的单片机,这里以目前正在使用的CH559单片机举例,我们可以人为的将其内分成三个程序区,1作引导程序区即BOOT区域,2作为运行程序区即用户程序区域,3作为下载区。芯片通过满足触发条件(用户自己设定)进入引导区运行引导程序,在BOOT程序下将目标程序下载到下载区,下载完成并校验通过后再将下载区内容复制到用户程序区,运行复位程序,IAP完成。 二、应用: 方式1:跳转BOOT,通过ISP下载工具完成下载 查看CH559DS1芯片手册可知,CH559芯片出厂内置BOOT,且Boot Loader Code Flash起始地址为0XF400,如下图所示: 这个地址也就是我们IAP跳转的起始地址,定义一个函数指针类型的变量,将该函数指针指向BOOT Loader的起始地址。我们设置的触发条件是检测P1^6引脚低电平,满足条件后实现地址跳转,跳转BOOT后再使用官方提供的ISP工具,实现在线下载。
上述是借助官方提供的ISP工具跳转BOOT区实现目标程序下载,下面介绍一下通过IAP实现定制“BOOT”,然后通过任意接口下载。 方式2:定制“BOOT”,任意接口完成下载 上述是通过CH559单片机自带的BOOT程序完成下载,下面介绍一下通过IAP实现定制“BOOT”,然后通过任意接口实现程序升级。真正达到接口自由、触发方式自由、协议自由。 首先编译目标程序,根据编译生产的hex文件大小,具体大小如图2.1.1所示,设置IAP在FLASH中存储的位置 file:/// 设置如下图2.1.2所示,“Start”起始地址到0xF000之间的存储空间不能小于图2.1.1中的code大小,为了便于操作起始地址最好设置成1K的整数倍,“Size”可以不设置,Keil会自动设置文件大小。如IAP的Code大小是1861B,所以设置IAP程序空间最小为(2+N)KB(N=0,1…..)。所以由0xF000地址(Data Flash起始地址)递减(2+N)KB(N=0,1……),即 0xF000-0x400*(1+N)(N=0,1..)=0xE800, 因为 BIN文件开头需要预留一个至少 4 字节空间给跳转指令,所以 IAP 程序设置地址为(0xE800+4); IAP 程序里面定义的起始存放地址依然是 0xE800,如: 地址设置如图所示: 编写用户程序时,我们需要在用户程序中实现跳转升级,同样需要定义函数指针类型变量,将改指针指向设置的起始地址。
下载 IAP 的程序的时候需要指定下载地址,下载地址跟程序中的跳转地址一致,如本例子用0xE800。第一次下载还是需要通过ISP工具,这里需要勾选启用IAP功能,设置起始地址。注意,设置的起始地址与 2.2 中描述相同,这里设置的是0xE804,与 IAP 工程设置的地址相同。在下面两个程序文件栏分别选择 IAP 程序 CH55IAP 和用户程序CH559User,点击下载。如图 所示: 打开 CH559IAPDemo 程序包,双击运行 WCHMCUIAP_WinAPP.exe。选择 USB 下载,选择程序文件CH559User。本例程中是用 Demo 板上按键 K4 进入 IAP 程序(按下 K4 键相当于 P1.3 接地),用户可根据需要自己修改别的方式。按下按键 K4 松开,LED5 熄灭,LED6 闪烁,并且频率较快,表示进入IAP 程序,应用程序 CH559WINUser 的设备列表中出现设备,如图 2.4.1 所示,点击下载,下载完成后自动复位执行用户程序。
3、程序源码
|