本帖最后由 FSL_TICS_A 于 2014-10-21 15:43 编辑
AN2295 bootloader文档解析
上个星期,KBOOT1.0.2版本终于release,着急等待的小伙伴可以去下载,而且在本届在深圳FTF研讨会上,就有FSL工程师对其进行了详细的介绍,大伙也可以去浏览一下。
而今天这个文档以FSL的AN2295—Developer’s Serial Boot loader应用手册为引子,跟大伙交流一下Bootloader的相关知识,不足之处,欢迎大家指正。好的闲话少叙,正式开整。
1. Bootloader Ø Boot loader基本概念: Boot loader是嵌入式系统上电启动时,执行的一小段引导加载程序,又称作固件。通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。其中Boot代码由MCU启动时执行的指令组成,而loader则指向MCU的Flash中新写入的应用程序。Bootloader是依赖于特定的硬件实现的,因此,在众多嵌入式产品中,目前还不可能实现通用的Boot loader。 Ø Bootloader优点: Boot loader可以实现在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级,并且使得通过局域网或者Internet远程更新程序成为可能。由此可见,Boot loader功能对于嵌入式系统的广泛应用具有十分重要的意义。 Ø Bootloader代码特点: 1. 代码量尽可能小,尤其对于Flash空间很有限的MCU来说至关重要。 2. 应用代码更新通信接口所需引脚数要尽可能少。 3. Bootloader按照协定的接口接受、解析应用代码数据,然后写入到Flash中。 2. FC 协议 AN2295应用手册中的Bootloader程序运行流程如图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与Hosttool波特率不同,导致数据接收不匹配
1. 指令 Ident指令 当MCU与PC完成波特率同步校准并确立连接后,PC就会发送Ident(0x49) 指令, MCU接收Ident指令后,跟着将Bootloader的相关属性信息发送给PC,如Bootloader版本信息、应用程序的起始与结束地址、boot loader及应用程序的中断向量表地址等(如图3所示),而且Boot loader版本不同,发送给PC的数据也会有所不同,如果使能CRC功能的话,还会在最后发送2 个字节的校验码。
图3Ident指令
Erase指令 PC发送Erase(0x45)指令,并紧跟2 个地址字节符,而MCU在接收到Erase(0x45)指令后,接着会擦写Flash中包含此地址的Block,如果使能CRC功能的话,还会在最后发送2 个字节的校验码;MCU在执行完擦写Flash操作后,则会发送ACK(0xFC)给MCU,具体流程如图4所示。
图4Erase指令
Write指令 PC发送Write(0x57)指令,并紧跟2个地址字节符,1个数据长度字节符及对应长度的数据字节符,如果使能CRC功能的话,还会在最后发送2 个字节的校验码。而MCU在接收到Write(0x57)指令后,识别出地址字节符和数据长度字节符,然后以地址字节符为起始地址,将所有的数据字节符写入到Flash中。MCU在执行完烧写Flash操作后,则会发送ACK(0xFC)给MCU,具体流程如图5所示。
图5Write指令
Read指令 PC发送Read(0x52)指令,并紧跟2个地址字节符,1个数据长度字节符,如果使能CRC功能的话,还会在最后发送2 个字节的校验码。而MCU在接收到Read(0x57)指令后,识别出地址字节符和数据长度字节符,接着向PC发送以地址字节符为起始地址,对应数据长度的数据字节符。具体流程如图6所示。
图6Read指令
Quit指令 PC发送Read(0x51)指令,后面不跟任何字节符,而MCU则在识别出Quit(0x51)指令后,马上跳转到应用程序。具体流程如图7所示。
图7Quit指令
文档下载:
AN2295—Developer’s Serial Bootloader 解析(一).pdf
(607.06 KB)
AN2295.pdf
(1.36 MB)
AN2295代码太大,无法上传,给大家一个链接,自行下载吧!
http://cache.freescale.com/files/microcontrollers/doc/app_note/AN2295SW.zip?fpsp=1&Parent_nodeId=1369087750761754789513&Parent_pageType=product
|