程序实现过程: 1.IAP程序 IAP程序仍然占用0x8000000~0x8003000的FLASH空间,IAP的作用,是在满足IAP控制要求的情况下启动IAP功能,否则,直接跳转并执行用户程序。启动IAP功能,可以使用3个方式: 1.1.当用户程序为空时,自动启动IAP功能,做写程序准备。 1.2.当用户程序正常,但启动时按下了特定的IAP按键时,启动IAP功能。 1.3.用户程序运行中,在某个特殊位置做了IAP升级标志,判读标志后,启动IAP功能。 现在的IAP程序,仅仅实现简单的将内部FLASH虚拟为U盘功能即可。参见《5分钟用STM32的内置Flash做一个超小U盘》。当然,这个小U盘缺少了文件系统,需要重新格式化才行。 格式化后,我们的超小U盘OK了,接下来就该进行下一步了,用户程序。 2.用户程序 2.1.配置 常规的用户程序,对于我们的STM32F103C8系列,有64KFLASH,因此可供IAP程序使用的为0x8003000~0x800FFFF的FLASH空间。但我们这次的用户程序,必须要保留下文件系统,因此修改为仅使用0x8008000~0x800FFFF。这其中的0X8003000~0X8008000空间,就是格式化时保存的文件系统。 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.jpg 为何修改为0x8008000而不是其它位置?因为系统告诉我们了,U盘容量=32K,因此反推:(0x800ffff+1)-32K=0x8008000(STM32F103C8系列)。 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.jpg 2.2.编译用户程序 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.jpg 主程序中不要忘记偏移。编译完,赶紧试试吧。可是,我们该将哪个文件存入U盘啊?file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.jpg 这样就会编译结束后自动生成对应的***.BIN文件,这个BIN文件,就是我们需要的升级文件。 2.3.复制文件,升级了。复制文件后复位,用户程序自动运行了。 file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.jpg 这时,我们可以再次回到U盘状态,删除文件,甚至是格式化这个U盘,只要没有新的文件进行覆盖,我们的程序会始终正常运行的。这是FAT表文件系统的缺陷造成的,也是数据恢复的理论基础。 |