在一个特定的场合,很多应用或产品都需要升级固件,以修复 Bug 或提高性能。大多数人都不愿意使用专用的调试接口,而是使用 UART、USB、I2C 等通信接
口。这种情况下,就需要一个串行 Boot Loader 通过其中一个通信接口升级固件,而不需要调试器或特定的程序工具。
本文档将指导您如何使用 UART (通用异步接收器/ 发送器)接口在 Kinetis E 系列上设计 Boot Loader。本文档中列出的示例代码是在 IAR 6.50 中开发的。
1 简介
Boot Loader 是一种内置固件,用于通过通信接口将应用代码编程到片上非易失性存储器(Kinetis E 上的Flash )。本文档将介绍如何在 FRDM-KE02Z 板上设计
UART Boot Loader。该程序将使用 AN2295 PC 端主机 GUI 工具解码 s19 文件,然后通过 UART 接口将应用代码传输到目标MCU。然后写入到 Flash。
2 软件体系结构
可以从飞思卡尔网站上下载 win_hc08sprg.exe 软件,使用该工具解码 S19 文件并与目标 MCU 通信。该工具兼容 FC 协议。关于详细的信息,请参见 www.freescale.com 上提供的 AN2295。
内置 Flash 上的 Boot Loader 在通电后将开始运行,并确定握手是否成功。如果发生超时,将跳转到应用代码的入口地址。
2.1 Flash 操作
KE02 提供了 flash 操作的高级功能:闪存控制器 (FMC) 和 flash 访问控制,它们不仅能够加速对flash 的存取,避免在访问 flash 过程中等待,而且还能在 flash 繁忙时避免冲突。下面我们介绍两种 Flash 编程方法:
1. 通过 RAM 中运行的代码编程 Flash
2. 通过 Flash 中运行的代码编程 Flash
2.1.1 RAM 中运行的代码
将 Flash 启动命令的代码复制到 RAM 并禁用中断, 使代码可以在 RAM 中运行,不需要从 Flash中读取指令。此方法在传统的片上 Flash 设备中使用最为广泛。
用于启动 Flash 命令和检查 Flash 状态的代码片段如下:
__ramfunc void FTMRH_LaunchCMD(uint8_t bWaitComplete)
{
DisableInterrupts;
if(bWaitComplete)
{
// Wait till command is completed
FTMRH_FSTAT = 0x80;
while (!(FTMRH_FSTAT & FTMRH_FSTAT_CCIF_MASK));
}
EnableInterrupts;
}
2.1.2 Flash 中运行的代码
KE02 包含 FMC 功能,这是一个极其重要的外围设备,连接于 Flash 和 MCU 之间。KE02 还包含Flash 访问控制、预取缓冲器、单入口缓冲器和缓存,因此,在 Flash 中运行的代码能够编程和擦写 Flash。如果启用 Flash 访问控制功能,当 Flash 繁忙时,该控制器能够暂时阻止对 Flash 的存取,直到 Flash 变为空闲状态,才允许对 Flash 的访问。用这种方法不需要禁用中断, 从而可以提高代码的效率。
相应的程序片段如下:
void FTMRH_LaunchCMD(uint8_t bWaitComplete)
{
/* enable stalling flash controller when flash is busy */
MCM_PLACR |= MCM_PLACR_EFSC_MASK;
FTMRH_FSTAT = 0x80;
if(bWaitComplete)
{
// Wait till command is completed
while (!(FTMRH_FSTAT & FTMRH_FSTAT_CCIF_MASK));
}
}
|