本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:58 编辑
【芯圣SDK-HC89F0541测评】BOOT和APP程序切换
作者:超级火龙果 听芯圣的名字已有一段时间了,一直没有机会用上,这次活动有幸获得了一个开发板,遂分享一下使用心得。 下图是我收到的开发板的样子,配烧录器和核心板连在一起,使用起来很方便。 使用的是Micro USB连接电脑,时过境迁,我已很久没用过这个接口了,手里都是TypeC的数据线,好不容易在同事那借了条连电脑,开发工具安装什么的我就不介绍了,论坛上其他坛友还有官方的资料都写得很清楚,按步就班的做就可以调通,这里主要介绍一下在HC89F0541上进行BOOT设计相关的分享。 Bootloader是一段用于芯片升级的代码,传统烧录工具烧录方式是ICP,需要借助专用的烧录工具向IO口灌入特定的烧录时序实现程序的烧入,具有Bootloader程序后芯片可摆脱烧录工具的依赖,通过Bootloader程序实现对芯片程序的修改,通常将这种方式称为ISP,这种方式可以使得开发的产品使用普通的USB转串口工具就实现烧录,减少了产品对烧录工具的苛刻要求。除此之外如远端升级方面都需要用到这方面的技术。 熟悉单片机BootLoader功能开发的工程师都知道,单片机只要具有IAP功能其实就具备了实现Bootloader升级功能实现的条件,具备IAP功能的单片机市面上不在少数,几乎现存市面上所有的常用8位机都支持IAP,然而并非所有具备IAP功能的单片机都适合开发Boot更新程序,因为它们缺乏了将单片机Flash空间划分的硬件设计支持。 具备Boot功能的单片机通常都将程序存储分为两个部分:Boot和App。对于普通的具有IAP功能的单片机虽然可以对编译工具设置使得Boot代码和App代码分别编译到FLASH空间的两个连续区域,但首先摆在开发者面前的第一个难题出现了,那就是中断向量表通常是固定的,以51单片机举例,中断向量表通常固定在0x03地址开始,如果FLASH的地址区域分给Boot,如下图,那就会出现中断被BOOT独用。 实际情况是App是不可能不用中断的,因次你就会想把APP和调换下位置,变成如下的结构: 此时我们是让App享用到了中断,但是我们看到程序是从APP启动的,这其实是违背Boot|App程序结构的原则的,就像Boot它的名字一样,启动原则上应该由Boot程序开始,因为APP程序实际应用时是有被更改的情况的,一旦APP程序异常整个系统将可能彻底崩溃无法复原,只能通过ICP方式重烧,Boot功能可靠性大大降低。而程序从Boot启动,系统总是可以通过复位使得芯片总有一段时间可以运行在一个正常的程序中从而有机会通过Boot修复系统,即通过Boot重新烧入正确的程序实现系统的恢复。 然而很遗憾普通的51单片机总是从0地址开始运行程序,也就是说程序入口被定死了,也就是说Boot只能被当到地址区域,那APP要用中断怎么办呢?聪明的你想到了在中断向量表中嵌入跳转指令做二次跳转让中断跳到App不就好了,得到如下的结构: OK,这个方案实现了从Boot启动,也使得APP可以享用中断向量,实际上这样的方案也是不少芯片厂商提供的Boot功能的实现方案,但是你会发现原来的中断向量表已经被固化用于跳转到APP的中断向量中,Boot程序将不能使用中断资源,虽然Boot通常功能都较为纯粹,不使用中断通常也可以实现功能,但终究是苦了开发的程序员,对于一些复杂的通讯结构没有中断软件实现将非常麻烦。 重新审视一下上面的这个方案,其实导致开发繁琐的两个主要是以下两个问题导致的: 1、 程序入口固定,51单片机总是从0地址启动。 2、 中断向量固定,中断不支持重映射功能。 HC89F0541芯片很好地争对这两个问题在51单片机的基础下设计第二复位向量功能,这个功能打破了传统51单片机必须从0地址启动运行及中断向量表固定在0x03地址开始的固定结构,允许对它们的位置进行更改。其相关的寄存器介绍如下: 芯圣的烧录上位机已经做了配套的设置设计,复位地址的选择的设置是相当方便,只需要通过烧录的Option选择对应的第二复位地址即可,如下图: 官方文档主要还是强调复位后启动地址的变化,但是并没有提及中断向量也同步重映射到对应位置,实际上这样的信息是非常重要的,建议在相关的说明中加入这部分的说明。 这样一来,假如我们选择第二复位向量为0x7000,那我们的程序存储器结构就可以很完美得划分为如下的结构: 当然以上只是打好了硬件结构的基础,具体在编程时软件方面还是需要进行相应的设置来让编译器按照我们设计好的结构对程序进行编译,芯圣使用的KEIL开发环境对于此部分的设置说明在官方提供的《AN0101_Flash系列MCU使用第二复位向量IAP升级_Ver1.00_cn》内附有详细说明,但是文档主要告知怎么操作,但其具体操作下的原理基础并没有太详细阐述的,通过以上的分析再结合官方的资料**大家对于当中的运作方式的理解会有更清晰的认识。 整体用下来在Boot应用设计方面芯圣的芯片设计还是比较巧妙的,从硬件设计上出发为程序开发带来了不小的便捷,在当前物联网的大趋势下,Boot|App的结构几乎将会成为标配,这样的设计结构对于BootLoader的应用开发场景是非常好的设计结构。 以下是我写的Boot和App不断相互切换运行的程序运行效果,程序很简单,旨在让大家更直观得感受到这样的设计为程序设计带来的便捷。附上了代码欢迎各位指导交流。
|