基于PSoC Creator Bootloader更新PSoC®3固件程序
1. 引言
本文引用地址:http://www.amcfsurvey.com/article/117492.htm许多电子产品允许出厂后更新固件程序,从而制造商可以发布新的固件版本增加功能或是修正错误。该功能一般有两种实现方式:在系统程序烧录和驻留更新程序。若将待更新的芯片看做从机,将执行更新操作的PC或是MCU看做主机,第一种方法通过芯片的烧录接口,由主机模拟生产时烧录器的时序,将固件数据烧录至Flash中;第二种方法在从机的运行代码中实现一段驻留程序,主机通过某种通讯接口与驻留程序通信,将固件数据先发送给驻留程序,然后由该程序更新至Flash。驻留程序在生产时被烧录,一般只能通过硬件烧录的方式更新。
这种驻留程序有很多种称呼,一个常见的名字是Bootloader,或者称为引导程序。不过,由于驻留程序涉及内容较广,实现稳定的更新功能需要较多的开发投入。Cypress PSoC3芯片族和PSoC Creator 1.0开发环境提供了一套完整的Bootloader开发框架,开发者无需编写代码,即可获得基于I2C和USB接口的Bootloader功能;或者仅做简单的二次开发,实现基于其他通讯接口或更新协议的Bootloader功能,从而缩短产品的研发周期。
2. 理解PSoC3 Bootloader
PSoC3芯片族是Cypress推出的基于8051核心的可配置片上系统(SoC),其主要特性包括
· 片内包含多达64K Flash和8K SRAM;
· 16~24个数字可编程逻辑器件(PLD),可以实现状态机等需求定制数字逻辑;
· 丰富的固定功能模块,包括1个使用内部晶振的Full-Speed USB2.0模块,多达4个16位可配置的Timer/PWM/Counter模块等
· 高性能模拟模块,如75ns响应时间的比较器,最高采样率192 ksps的12位 Delta-Sigma ADC等。
Cypress提供了与PSoC3配套的开发环境PSoC Creator 1.0,将其丰富的片内资源抽象成众多的可配置功能模块,开发者可以像设计电路板原理图一样,将所需模块拖放在设计图纸上,连接模块之间的输入输出,然后使用C语言实现产品需求即可。
PSoC3将所有代码存放在片内Flash中,程序执行也是基于Flash,因此,Bootloader与应用程序分别位于Flash空间的不同位置。图 1给出了PSoC3 Bootloader的Flash布局。在64K Flash空间中,低地址处存放的是Bootloader,较高地址处存放的是应用程序,二者中间有一个填充为零的隔离区,此外,在最高地址还存放着一些公共数据,包括应用程序的起始地址,Bootloader使用的Flash大小,应用程序校验和等。在产品的生命周期里,Bootloader只能在生产时通过硬件烧录的方式写入Flash,一旦产品出厂,除非意外情况,Bootloader不会被更新;应用程序也在生产时被写入,但是产品出厂后仍然可以通过Bootloader更新。
图 1 Bootloader与应用程序在PSoC3 Flash空间的布局
为了实现上述的Flash布局,开发者通常需要设置众多的编译、链接参数,这些参数控制编译工具链生成所需固件映像(Image),但其复杂性常常令许多开发者望而却步。PSoC Creator 1.0提供了一种简单的方法实现上述操作,将Bootloader与应用程序分成两种工程(Project):bootloader工程和bootoadable工程。前者维护Bootloader的实现,后者维护应用程序的实现,后者将前者作为编译依赖,即bootoadable工程需要bootloader工程的编译结果来完成自身的编译链接。此划分具有两个优点,一方面将所有编译工具链相关的参数设置与产品开发分离,完全由PSoC Creator自动处理,减少开发难度;另一方面易于Bootloader和应用程序的维护,如需添加新功能至应用程序,仅需改动bootloadable工程即可,避免错误修改Bootloader中内容。
在技术实现上,PSoC3 Bootloader可分为三个功能层次,如图 2所示。基本通讯层关注通讯接口原子级的数据收发,不同的通讯接口具有不同的原子级数据收发,如SPI和UART一次数据收发都是基于单个字节,而I2C的一次完整数据收发由多个字节组成的I2C协议数据包。在基本通讯之上,PSoC3 Bootloader已定义了一套与主机通讯的更新协议,以便接收主机发送的命令帧,并将处理结果以状态帧通知主机,此部分功能由协议处理层完成。核心功能层与具体的数据收发无关,此部分仅关注数据帧的解析,处理,Flash的读写等核心功能操作。
图 2 Bootloader功能层次图
通过此功能层划分,核心功能层作为公共代码模块,所有的Bootloader工程创建时都将其包含在内,基本通讯层与通讯协议处理层由实际使用的通讯接口独立维护。此设计可以在考虑不同通讯接口差异化的同时,尽量复用代码,减少开发时间与难度。
评论