搜索
bottom↓
回复: 57

【经验分享】AN2295 bootloader文档解析(一)

  [复制链接]

出0入0汤圆

发表于 2014-7-11 11:33:52 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_Robin 于 2014-7-18 14:29 编辑

  AN2295 bootloader文档解析

       上个星期,KBOOT1.0.2版本终于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波特率不同,导致数据接收不匹配



       3.        指令
               Ident指令
      当MCU与PC完成波特率同步校准并确立连接后,PC就会发送Ident(0x49) 指令, MCU接收Ident指令后,跟着将Boot loader的相关属性信息发送给PC,如Boot loader版本信息、应用程序的起始与结束地址、boot loader及应用程序的中断向量表地址等(如图3所示),而且Boot loader版本不同,发送给PC的数据也会有所不同,如果使能CRC功能的话,还会在最后发送2 个字节的校验码。

图3 Ident指令

               Erase指令
      PC发送Erase(0x45)指令,并紧跟2 个地址字节符,而MCU在接收到Erase(0x45)指令后,接着会擦写Flash中包含此地址的Block,如果使能CRC功能的话,还会在最后发送2 个字节的校验码;MCU在执行完擦写Flash操作后,则会发送ACK(0xFC)给MCU,具体流程如图4所示。

图4 Erase指令

              Write指令
       PC发送Write(0x57)指令,并紧跟2个地址字节符,1个数据长度字节符及对应长度的数据字节符,如果使能CRC功能的话,还会在最后发送2 个字节的校验码。而MCU在接收到Write(0x57)指令后,识别出地址字节符和数据长度字节符,然后以地址字节符为起始地址,将所有的数据字节符写入到Flash中。MCU在执行完烧写Flash操作后,则会发送ACK(0xFC)给MCU,具体流程如图5所示。

图5 Write指令

              Read指令
       PC发送Read(0x52)指令,并紧跟2个地址字节符,1个数据长度字节符,如果使能CRC功能的话,还会在最后发送2 个字节的校验码。而MCU在接收到Read(0x57)指令后,识别出地址字节符和数据长度字节符,接着向PC发送以地址字节符为起始地址,对应数据长度的数据字节符。具体流程如图6所示。

图6 Read指令

               Quit指令
       PC发送Read(0x51)指令,后面不跟任何字节符,而MCU则在识别出Quit(0x51)指令后,马上跳转到应用程序。具体流程如图7所示。

图7 Quit指令




AN2295代码太大,无法上传,给大家一个链接,自行下载吧。
http://cache.freescale.com/files ... nt_pageType=product




PS:本帖可从飞思卡尔版块置顶帖:飞思卡尔Kinetis资料大本营飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2014-7-11 11:36:13 | 显示全部楼层
不足之处,欢迎指正,未完待续!!

出0入0汤圆

发表于 2014-7-11 12:30:25 | 显示全部楼层
谢谢版主分享!楼主应该把AN2295的源码也放上来,方便大家啊。

出0入0汤圆

发表于 2014-7-11 12:31:40 | 显示全部楼层
很给力,FSL加油

出0入0汤圆

发表于 2014-7-11 13:09:22 | 显示全部楼层
mark,给力

出0入0汤圆

发表于 2014-7-11 15:37:50 | 显示全部楼层
赞!期待(二)

出0入0汤圆

发表于 2014-7-11 16:45:49 | 显示全部楼层
好资料啊,学习一下。

出0入0汤圆

 楼主| 发表于 2014-7-11 17:02:42 | 显示全部楼层
sblpp 发表于 2014-7-11 12:30
谢谢版主分享!楼主应该把AN2295的源码也放上来,方便大家啊。

sorry, 我会将AN2295的文本和代码上传。

出0入0汤圆

发表于 2014-8-16 23:47:53 | 显示全部楼层
有没有研究老版本汇编的教程?

出0入0汤圆

发表于 2014-9-10 13:52:04 | 显示全部楼层
记号,收藏

出0入0汤圆

 楼主| 发表于 2014-9-10 14:05:19 | 显示全部楼层
lcptw 发表于 2014-8-16 23:47
有没有研究老版本汇编的教程?

没有,现在提供的例程都没有基于汇编的。

出0入0汤圆

发表于 2014-9-10 16:33:45 | 显示全部楼层
赞!写的不错

出0入0汤圆

发表于 2014-9-11 09:58:08 | 显示全部楼层

cool,看看!

出0入0汤圆

发表于 2014-9-16 20:17:25 | 显示全部楼层
楼主幸苦了

出0入0汤圆

发表于 2014-9-24 13:13:42 | 显示全部楼层
你好  我编译好的bootloader 程序 怎么分flash呢?bootloader下到mcu里是放到那个fslah?   怎么和我的应用程序分开?有相关资料吗?

出0入0汤圆

发表于 2014-9-24 13:48:27 来自手机 | 显示全部楼层
顶楼主。。。。。。

出50入0汤圆

发表于 2014-9-24 14:03:27 | 显示全部楼层
mark.楼主辛苦了

出0入0汤圆

发表于 2014-9-24 14:05:08 | 显示全部楼层
谢谢楼主

出0入0汤圆

 楼主| 发表于 2014-9-25 09:15:29 | 显示全部楼层
robin林 发表于 2014-9-24 13:13
你好  我编译好的bootloader 程序 怎么分flash呢?bootloader下到mcu里是放到那个fslah?   怎么和我的应用 ...

你好,楼主!
其实你的问题,在《AN2295 bootloader文档解析(二)》、《AN2295 bootloader文档解析(三)》两篇文档中已经有详细的介绍啊!

出0入0汤圆

 楼主| 发表于 2014-9-25 09:25:56 | 显示全部楼层

谢谢支持,如有疑问欢迎在帖子后面留言!

出0入0汤圆

发表于 2014-9-25 09:34:29 | 显示全部楼层
感谢楼主

出0入0汤圆

 楼主| 发表于 2014-9-25 09:39:40 | 显示全部楼层
robin林 发表于 2014-9-24 13:13
你好  我编译好的bootloader 程序 怎么分flash呢?bootloader下到mcu里是放到那个fslah?   怎么和我的应用 ...

《AN2295 bootloader文档解析(二)》《AN2295 bootloader文档解析(三) 》

出0入0汤圆

发表于 2014-9-26 12:35:31 来自手机 | 显示全部楼层
mark           .

出0入0汤圆

发表于 2014-9-27 21:11:34 | 显示全部楼层

好资料啊,顶一个

出0入0汤圆

发表于 2014-9-27 23:22:52 | 显示全部楼层
先mark一下!慢慢看!

出0入0汤圆

发表于 2014-9-28 07:36:57 | 显示全部楼层
加油,不错!

出0入8汤圆

发表于 2014-9-28 14:22:17 | 显示全部楼层
好东西,谢谢

出0入0汤圆

 楼主| 发表于 2014-9-28 15:29:56 | 显示全部楼层
youstupy 发表于 2014-9-27 21:11
好资料啊,顶一个

谢谢支持!
还有两篇文档,建议也浏览一下!
《AN2295 bootloader文档解析(二)》《AN2295 bootloader文档解析(三) 》

出0入0汤圆

 楼主| 发表于 2014-9-28 15:30:30 | 显示全部楼层
bi大痣 发表于 2014-9-27 23:22
先mark一下!慢慢看!

谢谢支持!
还有两篇文档,建议也浏览一下!
《AN2295 bootloader文档解析(二)》《AN2295 bootloader文档解析(三) 》

出0入0汤圆

 楼主| 发表于 2014-9-28 15:31:19 | 显示全部楼层

谢谢支持!
还有两篇文档,建议也浏览一下!
《AN2295 bootloader文档解析(二)》《AN2295 bootloader文档解析(三) 》

出0入0汤圆

发表于 2014-9-28 15:31:33 | 显示全部楼层
LZ你好,按照下面2片文章对kl25的bootloader进行修改,好像bootloader都没有启动,需要额外的操作进入bootloader模式吗?
https://community.freescale.com/docs/DOC-99052
https://community.freescale.com/docs/DOC-95429

能否给一个kl25的例子? 谢谢!

出0入0汤圆

 楼主| 发表于 2014-9-28 15:31:48 | 显示全部楼层

谢谢支持!
还有两篇文档,建议也浏览一下!
《AN2295 bootloader文档解析(二)》《AN2295 bootloader文档解析(三) 》

出0入0汤圆

发表于 2014-9-28 15:37:30 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

 楼主| 发表于 2014-9-28 15:44:18 | 显示全部楼层
lilo234 发表于 2014-9-28 15:31
LZ你好,按照下面2片文章对kl25的bootloader进行修改,好像bootloader都没有启动,需要额外的操作进入bootl ...

你好,
关于是否进入Bootloader模式,完全可以通过Debug设置对应的断点来判断,
而你说的关于KL25的bootloader我手头没有,你还是先试试文章给的例程,判断能否进入到Bootloader模式,
如果还有后续问题,咱们再交流。

出0入0汤圆

发表于 2014-9-28 16:33:36 | 显示全部楼层
LZ你好!用opensda调试,代码不断的在main和WDG_Disable 之间跳转,不知道原因?

int __main(void)
{
  /* initialize any hardware specific issues */
  #if BOOTLOADER_INT_WATCHDOG == 1
    WDG_Enable();
  #else
    WDG_Disable();
....
}

出0入0汤圆

 楼主| 发表于 2014-9-28 17:05:00 | 显示全部楼层
lilo234 发表于 2014-9-28 16:33
LZ你好!用opensda调试,代码不断的在main和WDG_Disable 之间跳转,不知道原因?

int __main(void)

你好,
找你的表示,程序不断的复位呢,
你尝试单步运行,看看具体到哪一步开始跳转到Main()

出0入0汤圆

发表于 2015-1-15 11:16:28 | 显示全部楼层
楼主你好,近期有个DSP6747下载程序问题出现,之前没有接触过bootloader,不知道楼主怎么理解不同型号MCU的bootloader程序,还望多多指点!不胜感激!

出0入0汤圆

 楼主| 发表于 2015-1-15 11:38:36 | 显示全部楼层
tjcf 发表于 2015-1-15 11:16
楼主你好,近期有个DSP6747下载程序问题出现,之前没有接触过bootloader,不知道楼主怎么理解不同型号MCU的 ...

就我个人的理解来讲,bootloader的协议肯定是一样的,但是针对不同的MCU,由于寄存器名称完全不同,所以导致代码间没有用共用性,
所以你只能根据bootloader协议的特点,同向比较各个MCU的bootloader工程中的各个代码功能模块,举个例子:比如与HOST建立连接代码模块,接收数据代码模块,烧写flash代码模块,调转到application代码模块。

出0入0汤圆

发表于 2015-1-15 12:25:58 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-1-15 11:38
就我个人的理解来讲,bootloader的协议肯定是一样的,但是针对不同的MCU,由于寄存器名称完全不同,所以 ...

很好,谢谢楼主的回答,有问题我再请教您!

出0入0汤圆

发表于 2015-1-16 16:04:31 | 显示全部楼层
谢谢楼主 先学习下。

出0入0汤圆

发表于 2015-5-8 15:00:13 | 显示全部楼层
你好,楼主,请教一下KL25 Bootload的问题
想要实现的功能:通过win_hc08sprg程序加载AP程序,将AP程序放到0x00001000处开始执行
遇到的问题:connect可以成功,一点击win_hc08sprg上的Program按钮程序就自动退出
麻烦帮我看一下ICF文件中这两个内存分配是否有问题,该如何解决?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-5-8 16:17:47 | 显示全部楼层
好东西  认真学习学习  后面正好要用到

出0入0汤圆

发表于 2015-5-11 09:48:04 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-9-28 15:44
你好,
关于是否进入Bootloader模式,完全可以通过Debug设置对应的断点来判断,
而你说的关于KL25的bootl ...

楼主,麻烦看一下我的问题,在41楼

出0入0汤圆

 楼主| 发表于 2015-5-11 10:07:01 | 显示全部楼层
Michael_STM 发表于 2015-5-11 09:48
楼主,麻烦看一下我的问题,在41楼

好的,有结果再回复你吧

出0入0汤圆

发表于 2015-5-11 10:11:30 | 显示全部楼层
楼主 辛苦 !收藏

出0入0汤圆

 楼主| 发表于 2015-5-11 10:31:26 | 显示全部楼层
Michael_STM 发表于 2015-5-8 15:00
你好,楼主,请教一下KL25 Bootload的问题
想要实现的功能:通过win_hc08sprg程序加载AP程序,将AP程序放到 ...

bootloader的ICF不需要修改的,KL25的ICF应该是正确的。
所以我现在怀疑你是不是Porting过程没有做好啊,
建议你先参考一下这个经验分享。
http://www.amobbs.com/thread-5595526-1-1.html

出0入0汤圆

发表于 2015-5-11 14:59:47 | 显示全部楼层
多谢,正好需要好好研究一下

出0入0汤圆

发表于 2015-5-11 15:24:31 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2015-5-12 10:56:16 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-5-11 10:31
bootloader的ICF不需要修改的,KL25的ICF应该是正确的。
所以我现在怀疑你是不是Porting过程没有做好啊, ...

感谢楼主的回复,
现在出现点击Erase的时候不成功的提示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-9-1 08:57:28 | 显示全部楼层
很好的资料,学习了

出0入0汤圆

发表于 2015-9-1 09:01:38 | 显示全部楼层
很好的资料,学习了

出0入0汤圆

发表于 2015-9-3 22:36:16 | 显示全部楼层
正在找这个资料,谢谢

出0入0汤圆

发表于 2015-10-22 09:44:08 | 显示全部楼层
很强大,收下了!谢谢!

出0入0汤圆

发表于 2015-10-25 09:52:50 | 显示全部楼层
收下了  慢慢学习

出0入0汤圆

发表于 2016-11-6 20:36:25 | 显示全部楼层
收藏起来,备用!

出0入0汤圆

发表于 2016-12-19 11:02:29 | 显示全部楼层
我想问下为什么没有S12系统的bootloader源码呢?

出0入0汤圆

发表于 2017-5-16 22:50:14 | 显示全部楼层
收藏!!!

出0入0汤圆

发表于 2019-6-10 17:22:28 | 显示全部楼层
多谢分享 下载学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 20:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表