在上一节中,我们创建了自己的模板,从本节开始,都将在此模板上进行移植开发。
FIS格式化带来的问题
使用此模板生成redboot(ROM启动方式,其它配置暂不修改),并烧写到STM32内部flash中。烧写reboot后,在我的板子上,redboot下执行reset命令时有问题:执行后不能复位,卡死了;此外,复位键好像也有时不启作用。在这之前,没有出现这种情况是因为没执行fis init来格式化flash。这实际上是redboot的配置引起的,且往下看。
启动进入redboot命令行后,执行fis init命令,对可用的flash块进行格式化,即初始化FIS(fis init命令应在目标硬件上第一次安装redboot时执行一次,建立FIS信息)。
执行fis list和fis free命令,展示FIS信息和剩余flash块,如下图所示:
不知道大家注意到没有,上图中,Redboot居然位于外扩NOR FLASH中,但明明我把redboot烧写到了stm32内部flash中,这是怎么回事?另外,可用的flash块似乎也有问题,内部flash中已烧写了redboot,内部可用的flash空间至少不是从0x0800 0000开始的。
我用如下命令查看了内部和外扩flash的数据,如下:
从两个flash读取的数据一致,且与redboot.bin文件数据也一致,也就是说,执行fis init后,在外扩NOR FLASH处也建立一份redboot映像。我试着删除外扩NOR FLASH中的redboot,却不能删除,提示如下:
“’RedBoot’ is a reserved image and cannot be deleted”,这是个保留映像(我的理解是,相当于一个备份redboot)。这是哪带来的呢?
配置redboot
可以先看看这个链接:http://www.spinics.net/lists/ecos/msg39304.html。注意:要看完整个问题的链接哦(点击下面Follow-Ups处的链接地址,直到没有Follow-Ups了)。
实际上就是在redboot中禁止两个配置项:CYGOPT_REDBOOT_FIS_REDBOOT和CYGOPT_REDBOOT_FIS_REDBOOT_POST,如下图所示:
重新编译烧写,再执行fis init指令,则在外部flash中没有redboot了。而且通过这样配置后,上面所说的复位问题居然好了。当然还有点不能令人满意的就是:可用的flash中还有内部flash而且还是从0x0800 0000开始,以及FIS信息中没有redboot的分区信息。
根据上面的链接所述,如果不想可用的flash中包含内部flash,可通过设置redboot配置项:CYGNUM_REDBOOT_FLASH_RESERVED_DEVICES的值为0x0800 0000来禁止FIS对内部flash的管理。下面是关于这个选项的英文解释,使用时注意下:
This option lists the base addresses of any Flash devices that should not be managed by the flash image system. In particular, this means that these devices will not be considered when looking for free space in which to create new files. It should consist of a comma-separated list of (virtual) addresses.
引导启动flash中的srec格式hello程序
利用前面章节介绍的方法编译出hello应用程序。首先使用下面的命令通过串口把hello.srec文件下发到内存中:
再通过下面的命令,把内存中的hello程序烧写到内部或者外部flash并创建hello分区:
其中:
- -r 0x68008000 — 指明刚通过串口下载的hello程序所在的内存地址;
- -e 0x68008019 — 指明hello程序执行时的入口地址;
- -l 0x20000 — 指明写到flash中最大的数据长度,实际就是指明这个要创建的分区的大小;创建时会把内存中实际数据长度写到flash中;
- -f 0x08040000 — 指明flash地址;
执行后,将创建一个hello分区信息,如下图所示(图中的tmp分区是我用来测试用的,可不管哈):
然后按照下图所示,创建一个启动脚本,使得上电或复位后自动地引导启动运行flash中的hello程序:
重新上电或者复位板子,则可以看到直接运行hello程序了。
本节,介绍的是引导运行srec格式的程序,是否可以引导bin格式的程序呢?请关注下节的介绍。
推荐阅读相关文章:
- stm32移植ecos #13,redboot引导启动flash中的应用程序映像文件(下)
- stm32移植ecos系列文章归档
- stm32移植ecos #9,移植ecos并成功运行helloworld程序,使用redboot引导运行内存中的helloworld程序
- stm32移植ecos #6,redboot的疑问和问题,redboot是必需的吗?
- stm32移植ecos #5,移植redboot(ROM启动方式)下篇
- stm32移植ecos #4,移植redboot(ROM启动方式)上篇
- stm32移植ecos #21,触摸屏tsc2046驱动移植
- stm32移植ecos #11,使用自己的模板(Template)