关于IAP与APP互相跳转的实现
首先,在您动手做这个实验之前,先要弄清除咱俩的软硬件有什么不同:
1. 我的CPU是STM32F103ZET6,里面有512K的FLASH,您的CPU如果是其它类型,也不要紧,只是在程序里面,地址上限可能不一样。但是,个人觉得,最好能用256K以下的FLASH。
2. 我的外部存储介质是U盘,如果您的外部存储介质是SD卡,那也应该一样用,只是它们必须是FAT16,FAT32文件系统。如果您的板上没有外部存储介质,那也能做跳转实验,只是不能做加载APP实验。
3. 我的仿真器是JLINK7,如果您的仿真器是其它的,估计也没多大问题,只要您会用它就行了。什么?没有仿真器,那还是别做这个实验吧,出错了没法调试。
4. 我的开发环境是RVMDK 3。7,STM库是V2。03。使用其它开发环境的话,您要是能找到MDK中的设置对应到您那里怎么设置,估计也没问题。至于库嘛,您现在是用哪个就哪个吧,全部包在您的工程里,没问题的。
好了,开始啦。
先找个你以前调好的工程,当然,最好是非常可靠的,内容很精彩的,带液晶显示的,这样比较容易知道你后面有没有调好。这个工程还最好是在FLASH里面运行的,如果不是,要将它改回来。
至于什么开发文档,太麻烦了,不用看。我之前看了STM的IAP应用笔记AN2557,就觉得一个字“乱”,特别是心里还没谱的时候,更是越看越糊涂,这么大个工程,到最后对我有帮助的,就是一小段,就是如何擦除,如何编程那小段。当然,STM32的库还是非常有用的,如果不用库的话,学习、工作进度会慢很多。
说多啦,找好工程没有?找好工程咱就开工了。将这个工程复制两份,一份命名为IAP,一份命名为APP。
第一步:规划好你两个程序的存放位置。
IAP程序肯定是从0X08000000开始的,因为它是引导程序。将IAP程序放在0X08000000-0X0800FFFF的位置,给它64K空间,足够了。
APP程序从0X08010000-0X0807FFFF,给它448K空间。
如果您的CPU不同,那APP程序的空间小一点,也没问题。
第二步:制作你的APP程序。
1. 将程序定位在0X08010000开始的位置。
点魔术棒,打开目标选项设置。
选Target选项卡,IROM1改成从0X08010000开始,尺寸0X00070000; Debug选项卡,Load Application at Startup打上勾,Run to main()打上勾; Utilitiles选项卡,点settings按纽,弹出Flash download卡,Erase sectors打上勾,点你的编程算法,将底下的的起始地址改成0X08010000,尺寸
0X00070000。
2. 制作一个RunInFlashOffset.ini文件。文件内容为:
SP = _RDWORD(0x08010000); // Setup Stack Pointer
PC = _RDWORD(0x08010004); // Setup Program Counter
目的是在用JLINK调试的时候,引导程序运行。
点魔术棒,打开目标选项设置。
选Debug选项卡,Initialization File:项,选择上面的RunInFlashOffset.ini。
3. 为了从IAP程序跳来运行APP的时候正常开始,初始化时要恢复RCC为复位状态,恢复NVIC为复位状态。
在你的RCC初始化部分,第一句加上:
RCC_DeInit();
在你的NVIC初始化部分,第一句加上:
NVIC_DeInit ();
4. 重定位中断表到0X08010000位置。
在上面NVIC_DeInit ();后面加上:
NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x00010000);