上个星期,[url=https://www.freescale.co
m/webapp/sps/site/prod_summary.jsp?code=KBOOT&tid=vanKBOOT]KBOOT1.0.2[/url]版本终于release,着急等待的小伙伴可以去下载,而且在本届在深圳FTF研讨会上,就有FSL工程师对其进行了详细的介绍,大伙也可以去浏览一下。
而今天这个文档以FSL的AN2295—Developer’s Serial Boot loader应用手册为引子,跟大伙交流一下Bootloader的相关知识,不足之处,欢迎大家指正。好的闲话少叙,正式开整。
1. Boot loader
Ø Boot loader基本概念:
Boot loader是嵌入式系统上电启动时,执行的一小段引导加载程序,又称作固件。通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。其中Boot代码由MCU启动时执行的指令组成,而loader则指向MCU的Flash中新写入的应用程序。Boot loader是依赖于特定的硬件实现的,因此,在众多嵌入式产品中,目前还不可能实现通用的Boot loader。
Ø Boot loader优点:
Boot loader可以实现在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级,并且使得通过局域网或者Internet远程更新程序成为可能。由此可见,Boot loader功能对于嵌入式系统的广泛应用具有十分重要的意义。
Ø Boot loader代码特点:
1. 代码量尽可能小,尤其对于Flash空间很有限的MCU来说至关重要。
2. 应用代码更新通信接口所需引脚数要尽可能少。
3. Boot loader按照协定的接口接受、解析应用代码数据,然后写入到Flash中。
2. FC 协议
AN2295应用手册中的Boot loader程序运行流程如图1所示,Target与Host tool通信过程中以0xFC为应答信号,程序运行流程:首先,MCU根据开发者的预先设置,判断是进入Boot loader模式还是直接运行应用程序;当MCU进入Boot loader模式后,第一步要同步校准Target与Host tool两者的波特率,保证通信数据在两者之间能够正确的传输;接着Target接收Host tool传输过来的数据;然后按照预先协定好的IDENT(0x49)、ERASE(0x45)、WRITE(0x57)、READ(0x52)、Quit(0x51)指令操作,将应用程序写入到Flash对应地址内。
Ø 波特率同步校准
MCU作为Target上电复位后,开始初始化硬件模块,配置时钟模式和建立内存空间的映射图,串口的波特率配置也在此过程完成。但是实际波特率与期望值可能会有出入,所以为保证Target与Host tool之间实现准确无误的数据传输,需要进行波特率同步校准,同步校准步骤:首先,MCU按照配置完成的波特率发送ACK(0xFC),作为Host tool的PC按照预先协定的波特率,接受从MCU过来的“ACK”,PC可接收数据的波特率容差范围为:33%~300%;接着,只要PC接收到非零的字节数据,马上按照预先协定的波特率发送ACK(0xFC)到MCU,当然MCU可接收数据的波特率容差范围跟PC一样,也为:33%~300%,如果MCU实际波特率与期望值有出入的话,接收到“0XFC”会不等于0xFC,表1所列即为MCU真实波特率与协定波特率不匹配情况下所接收到数据。然后,当MCU发觉接收到的“0XFC”与实际不符时,就不向PC发送ACK(0xFC),PC由于在指定时间范围内未收到ACK,就会发送间断字节符,而间断字节符一般由10个连续周期的低电平组成,假设PC以波特率9600bps发送间断字节符,那么传输时间为10 x 104µs=1.04ms;最后,MCU检测接收间断字节符的时间,并与标准时间进行比较,跟着调整波特率的设置,直到MCU与PC两者的波特率同步校准成功,在此期间PC可能会多次发送间断字节符,波特率同步校准流程如图2所示。
表1 Target与Host tool波特率不同,导致数据接收不匹配
|