H7系列单片机支持XIP模式,也就是可以运行单片机外部的SPI FLASH中的程序。也就是程序会分配在内部和外部FLASH中,那么这种情况下使用Bootloader会发生什么呢?接下来就来分析一下这其中发生了什么。
我们先研究串口IAP例程。
对于无需外部flash的单片机iap比较好理解,bootloader首先占据起始一段内存,留足空间并且一直存在,负责上电检测更新固件以及跳转执行,唯一注意的就是尽量精简bootloader占据的内存,保证APP有充足的空间,不要超过bootloader占据剩下的内存,也不要动用bootloader占据的内存里面的数据,即保证bootloader的完整性、安全性。
那么对于H7系列,大部分应用程序都是占据两部分内存的,即单片机内部FLASH(很小的一部分)和外置SPIFLASH,正是减小了内置FLASH才降低了价格,所以除非比较小的应用程序,否则内部FLASH根本装不下,所以应用程序都是占据两部分,而且不可以把程序全部放在外部FLASH,不然会导致无法运行的问题,所以内部很小的一块内存都是存放很重要的一些程序,比如初始化内核、时钟、中断调用等等这些需要初始化运行、快速响应的,那么我们写的bootloader也是占据着两部分的内存。
对于其他单片机来说,bootloader直接擦掉bootloader之后的N个整块,再把bin文件从串口、USB、CAN、485、SD卡、U盘什么的读取出来写到擦除好的地方,判断一下就可以跳过去执行了,但是750只有一块内存,一个扇区,而且现在不是跑着bootloader吗,把自己擦了,不知道什么时候就挂掉了。
所以这里bootloader就不能在flash里面跑了,比如我们把它弄到ITCM里面去跑,但是单片机上电肯定是从内部的flash开始跑的,所以要先把bootloader程序弄到ITCM里面,然后跳到那去跑bootloader,现在就有两个程序了,一个bootloader在ITCM里面跑的,擦FLASH不会影响它,一个用来把(在ITCM里面跑的)bootloader拷到ITCM里面去,因为停电了ITCM就没有数据了,所以想跑ITCM的bootloader每次都需要重新拷到ITCM里面去,要拷的这段ITCM bootloader程序可以放在拷它的程序里面,就是在这个程序里面放数组,数组里面是ITCM的程序。如下。
上电之后程序从内部FLASH运行,ITCM是空的,烧录好的淡蓝色程序1就负责把程序2从外部FLASH拷贝到ITCM,然后跳过那里去跑程序,这时bootloader才运行起来了,就可以接受外面发来的程序,或者它自己从其他地方读。
接着考虑其他问题,前面说的,750只有一块内存,一个扇区,即使现在在ITCM里面跑,不受擦除FLASH的影响,那么擦除掉FLASH之后是什么情况,APP程序占据了内部FLASH,也占据了外部FLASH
断电之后的情况
那么还要接着考虑怎么再把bootloader弄回来,总不能更新一次APP刷一次bootloader
还是这张图,执行判断擦除和跳转的都是程序2,所以一定要保证程序2的存在,而程序2的家在外部FLASH里面的程序1里边,所以外面FLASH的程序1要保住,而程序又每次从内部FLASH运行的,所以内部FLASH的程序1也要留住,擦除又不能擦除,不擦除又没法更新APP,所以这里就得用补救的办法了。
怎么做呢,首先是肯定要擦的,不然没法更新APP程序。那又要保证程序1存在,所以先把程序1备份,谁来备份,当然是程序2了,所以现在的做法是先把内部FLASH的程序1读出来放在数组缓存里面,然后等擦除完了之后,先把数组里面的程序1写进去,然后再把APP程序从程序1后面开始写到内部FLASH。
首先备份,并擦除
然后恢复回来FLASH里面的程序1,再接着写APP
程序重新上电之后,依旧先拷贝程序2到ITCM运行,这次有了APP,就直接跑去APP运行了
大的程序一共3个:
首先做的应该是第1个程序,因为第2个需要根据第1个来,需要把第1个的完整程序生成bin文件,转成数组放到程序2里面。
这里需要确定boot loader(程序1)实现的具体功能,生成数组之后然后定好代码段占用的地址以及大小。
程序从IROM1起始0x0,大小0x10000存储
Map文件信息
Memory Map of the image
Image Entry point : 0x00000299
Load Region LR_IROM1 (Base: 0x00000000, Size: 0x0000a7fc, Max: 0x00010000, ABSOLUTE)
Execution Region ER_IROM1 (Base: 0x00000000, Size: 0x0000a7d0, Max: 0x00010000, ABSOLUTE)
…
Execution Region RW_IRAM1 (Base: 0x, Size: 0x000040c0, Max: 0x00020000, ABSOLUTE)
…
Total RO Size (Code + RO Data) 42960 ( 41.95kB)
Total RW Size (RW Data + ZI Data) (2528.19kB)
Total ROM Size (Code + RO Data + RW Data) 43004 ( 42.00kB)
程序中断向量地址无需偏移。
确定好bootloader功能之后根据大小确定加载bootloader的FLASH程序占用内部FLASH以及外部FLASH空间,Bootloader根据加载程序大小决定备份区域大小,擦除及写入位置,APP程序根据Bootloader程序操作地址设置中断向量偏移量。
到此这篇单片机程序激活成功教程(单片机程序激活成功教程后再烧录的芯片还有密码吗?)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/31138.html