引导加载器支持产品固件的现场更新。引导加载器可使用 UART、I2C、SPI 或 USB 等常见通信接口更新固件,而引导加载器主机和目标之间通常采用有线连接方式。在蓝牙到串行适配器的帮助下,这个引导加载操作能通过无线方式实现。如果目标所处的位置难以物理地访问,或者目标位于密封设备内,那么这种无线连接功能就会特别有用。
使用引导加载器的第一步就是配置产品,让引导加载器(而不是应用)去执行。一旦引导加载器运行,主机就会通过通信通道发送“start bootload”命令。如果引导加载器发出“OK”回应,那么就会开始引导加载。在引导加载期间,主机读取新应用文件,将其解析为闪存写入命令,并发送命令到引导加载器。在整个文件发送后,引导加载器会确认文件完整性,并发送控制到新应用。
采用蓝牙到串行适配器的无线引导加载过程可在任何支持 UART 引导加载器的目标上进行,无需使用蓝牙串行端口配置文件(SPP)对运行在目标设备上的主机或引导加载器固件进行任何修改。蓝牙配置文件是指定蓝牙设备一般行为的蓝牙核心规范上额外的协议,可用于支持蓝牙设备与其它具有相同配置文件的设备进行通信。
SPP 基于仿真 RS-232 串行端口的射频通信(RFCOMM)协议,它定义了如何设置两个设备之间的虚拟串行端口,如何利用蓝牙互联。支持蓝牙功能的 PC 能连接到目标侧的蓝牙串行适配器,并进行引导加载操作。引导加载命令可通过发送串行命令到当前运行在目标器件上的应用而实现无线触发。
引导加载器
引导加载过程会通过标准通信接口更新嵌入式系统的固件。主机可以是带引导加载器主机应用工具的 PC,也可以是另一个微控制器。引导加载器是加电启动或系统重设后将要执行的第一行代码。引导加载器会预编程到微控制器中,与主机通信,并获得新的应用镜像,将其写入微控制器的内部闪存。在引导加载操作成功后,微控制器会开始执行新的应用固件。如果没有从主机接收到新的应用,那么引导加载器会执行微控制器中现有的应用。
应用固件镜像的格式取决于使用的微控制器。举例来说,PSoC 控制器使用 .cyacd(应用代码和数据)作为引导加载应用的格式。如果采用标准的蓝牙到串行适配器,那么我们可在支持 UART 引导加载器的目标器件上无线执行同样的引导加载操作。
在利用蓝牙到串行适配器进行无线引导加载的情况下,基本的引导加载操作保持不变。不过,我们需要在主机和目标器件之间建立虚拟串行连接,通过蓝牙无线发送应用镜像。SPP 定义了如何设置虚拟串行端口和两个蓝牙设备的互联,随后允许设备进行 RS232(或类似的)串行线缆仿真。这种配置文件涵盖的情境能支持传统应用,这里蓝牙作为线缆连接的替代,使用虚拟串行端口抽象。利用 SPP,互联设备发送和接收数据就像互联的 RX 和 TX 线路一样。
图 1 显示了 SPP 中使用的协议和实体。基带、LMP和 L2CAP 是 OSI 中的第 1 层和第 2 层蓝牙协议。RFCOMM 是蓝牙版 GSM TS 07.10 标准,GSM 手机用它在一个物理串行线缆上多路复用多个流,为串行端口仿真提供通信协议。SDP 是蓝牙服务发现协议,支持蓝牙设备发现其它蓝牙设备提供的服务和相关参数。
![e113c6f26463fc7a130663614140710c.png](https://i-blog.csdnimg.cn/blog_migrate/895f88a51dcc726ac4491ed28f3c9e18.jpeg)
图 1:配置文件协议栈包括 SPP 使用的不同协议和实体。
就使用 SPP 的无线引导加载而言,两侧运行的应用为 PC 上的引导加载器主机应用或主机微控制器上的 UART 接口以及目标系统上的 UART 引导加载器。
Bluefruit EZ-Link 模块或 JY-MCU 模块等标准蓝牙到串行适配器能配对具备蓝牙功能的计算机,并显示为串行 COM 端口。将蓝牙模块和 PC 配对后,设备管理器中会列出两个串行 COM 端口。之所以会出现这种情况,是因为蓝牙串行端口是基于 RFCOMM,与物理串行端口不同,它在建立蓝牙虚拟连接时同时需要服务器和客户端。
设备管理器中列出的一个端口是入站端口(服务器),另一个则是出站端口(客户端)。然而,用其中一个串行端口建立连接后,它就是双向的。如果 PC 发起与蓝牙模块的连接,则使用出站端口。如果蓝牙模块发起连接,则使用入站端口。对于目标系统的无线引导加载而言,必须使用出站端口,因为 PC 是主机,它必须发起与蓝牙模块的连接。
蓝牙模块必须连接到运行 UART 引导加载器的目标系统上的 UART 接口。举例来说,在关闭电路板的 USB 到串行部分以无线引导加载 PSoC 4 的情况下,蓝牙模块可连接到 CY8CKIT-049 PSoC 4 原型设计套件。PSoC 4 原型设计板易于使用,成本较低,能在主板兼容报头上提供 PSoC 4 微控制器的所有 I/O 引脚,从而支持快速原型设计,而且配套提供预编程的 UART 引导加载器。
蓝牙模块的波特率应匹配目标系统上引导加载器配置的波特率。大多数蓝牙模块支持 AT 命令来配置模块的波特率,这需要用到 USB-UART 桥接器或配备 UART 接口的微控制器。PSoC 4 原型设计板的 USB- 串行器件部分也可利用 AT 命令配置蓝牙模块的波特率。引导加载器主机应用工具则用蓝牙虚拟串行端口来无线执行引导加载操作。
![681fc497c26641bec57056c1af85e202.png](https://i-blog.csdnimg.cn/blog_migrate/ac4d2766894dcc3fb1424342854baa28.jpeg)
图 2:系统级方框图显示主机和目标系统的不同组件。
如果引导加载器主机是另一个微控制器,那么无线引导加载程序仍会在其它蓝牙到串行适配器(连接到主机微控制器 UART 接口)的帮助下进行。对于不支持蓝牙的 PC 而言,标准的 USB 蓝牙收发器可用来建立蓝牙模块连接。
成功引导加载后,目标系统会开始执行新的应用。如果需要引导加载另一个新应用,那么目标系统必须重启,以再次启动引导加载器。如果应用调用引导加载器,就能避免这一过程。引导加载的应用响应于某种外部事件,如按下按键或主机发出的具体数据命令,从而再次启动引导加载操作,在目标系统上载入新的应用。
此外,低功耗蓝牙(BLE)模块也可用于无线引导加载。与传统蓝牙不同的是,低功耗蓝牙不使用 SPP。不过,对于低功耗蓝牙而言,所有配置文件和服务支持全部位于应用空间内。产品开发人员能在通用属性配置文件(GATT)基础上开发自己的串行端口服务,满足 BLE 模块需求,并将其用于无线引导加载。
引导加载器的设计考虑因素:
稳健可靠的引导加载器应当能够检测、报告并有效处理无线引导加载过程中出现的错误,如传输过程中的数据包丢失、数据损坏和闪存写入错误等。通过存储应用的校验和或循环冗余码(CRC),可以执行闪存错误校验。在引导加载操作开始后,位会被清空。如果应用成功下载并安装,就会更新。举例来说,如果在引导加载时断电,那么在重启时引导加载器应检测无效的校验位,而且不会让部分加载的应用获得控制权,而是等待主机启动新的引导加载操作。
一旦新应用实现引导加载,那么引导加载器必须确认引导加载镜像是否有效,并让新应用获得控制权。引导加载器还应当能检查闪存中的自身镜像,判断其是否有效。另一个重要考虑因素是避免应用覆盖引导加载器本身。如果引导加载器损坏或被应用覆盖,那么系统就无法工作,需要对系统的引导加载器进行重新编程。为了避免这种情况,闪存的引导加载器区域必须进行保护,避免引导加载器代码被意外覆盖。
引导加载器设计的另一个重要考虑因素就是何时开始与主机通信。在确认应用有效后,引导加载器可等待一定时间让主机开始新的引导加载操作。如果等待时间过短,主机可能还无法可靠启动通信。如果等待时间过长,产品的整体启动时间就会太长。与引导加载新应用时避免设备重启的解决方案类似,这个时序问题可通过让应用调用引导加载器进行解决。
为了确保目标系统无错误,我们可用多应用引导加载器在闪存中存储多个应用镜像。如果引导加载器检测到某个应用镜像被损坏,那么引导加载器能跳到另一个应用镜像。能够保存的应用数量取决于目标系统的闪存大小。
此外,引导加载器中还可包含简单的调试功能,可用 UART 接口和 Tera Term 等终端仿真程序实现,从而在 PC 上显示调试信息。调试信息还能用相同的蓝牙到串行调试器无线发送。
定制引导加载器主机工具:
不同微控制器可直接使用标准的引导加载器主机工具应用,无需对 SPP 的无线引导加载进行任何修改。然而,引导加载器主机工具可以进行定制,从而更好地满足无线引导加载需求,并嵌入终端仿真器窗口,以查看调试信息,甚至能通过 SPP 无线发送具体数据来从应用中调用引导加载器。图 3 显示了具有嵌入式终端仿真器窗口的定制引导加载器主机工具应用实例。为充分利用终端仿真器,引导加载到目标系统的任何新应用都必须包含 UART 接口,并能在主机向目标系统发送具体数据时调用引导加载器。UART 接口可在引导加载器和应用之间共享。
![62d853edf21c85e6ee391b3ffa53beec.png](https://i-blog.csdnimg.cn/blog_migrate/27b54ca62a8d3c663be5889e0cb99167.jpeg)
图 3:具有嵌入式终端仿真器窗口的定制引导加载器主机工具应用实例。
如果采用稍微复杂的多应用引导加载器设计,我们也能利用 SPP 从主机向目标系统无线发送不同消息,从而在闪存中切换存储的多个应用,这就能节约新应用引导加载所需的时间。