本帖最后由 Jei 于 2015-8-31 22:25 编辑
| 基于ARM Cortex M3 的bootloader设计 |
|
file:///C:\DOCUME~1\Jie\LOCALS~1\Temp\ksohtml\wps235.tmp.jpg[简介] [作者: file:///C:\DOCUME~1\Jie\LOCALS~1\Temp\ksohtml\wps236.tmp.png | 基于LPC1778的bootloader 已测试MCU:LPC1768,LPC1756\8,LPC1778 版本: V220 主要功能: 1、基于RS232的控制台,支持RS232在线升级 2、集成前台任务管理工具 3、内部Flash IAP 4、可配置USB HID通信 5、可配置SPI接口Flash 6、SD卡接口以及fatfs文件系统 7、模块实现了总共两个任务 任务一:LED心跳 任务二:控制台处理
优点: 1、模块化集成度高,方便移植 2、功能灵活 3、方便自定义命令
|
|
目录
第一章 简介本文《基于ARM Cortex M3 的bootloader设计》主要讨论了如何在Cortex M3平台上搭建bootloader系统。实例开发将参考本文具体实例说明。 本文作者水平非常有限,无法与行业前辈相提并论,并且大部分内容均为原创(部分内容网络摘录)。所以,必然存在各种不足以及漏洞,希望和感谢大家可以提出宝贵意见、建议、批评到作者邮箱。 同样,本文仅仅本着创新、原创的精神提出观点、想法以供交流和探讨。
编写本文的基本原则是简单、清晰、系统的向阅读者传达作者如何设计嵌入式代码,如何设计基于ARM的bootloader,以及对系统ROM管理、调试台、前后台管理等介绍。 一、bootloader简介 bootloader是在系统上电时运行的第一段程序,即放在地址0X00000000开头的一段flash内(参见下图flash分布图示意)。和普通的程序区别在于它的主要功能是为了实现系统可在线升级和易于调试。 由于每一个嵌入式系统不尽相同,使用的资源千差万别,正是如此,不存在一个统一的bootloader,总是对应于每一个特定的嵌入式系统。bootloader除了完成调试、跳转,还必须完成硬件初始环境的设置。例如控制某个IO口电平等等。
虽然通用的bootloader几乎不可能,但是我们仍然可以归纳出其应有的一些特性和通用的概念,以指导用户实现具体的设计。 file:///C:\DOCUME~1\Jie\LOCALS~1\Temp\ksohtml\wps237.tmp.jpg 图:flash分布示意
1.1 bootloader 的操作模式 (Operation Mode)如同大多数 bootloader 一样,都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,bootloader 的作用就是用来加载操作系统或者应用程序,而并不存在所谓的启动加载模式与下载工作模式的区别。 file:///C:\DOCUME~1\Jie\LOCALS~1\Temp\ksohtml\wps238.tmp.jpg 图:操作模式 启动加载(Boot loading)模式: 这种模式也称为"自主"(Autonomous)模式。也即 bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,或者执行跳转到应有程序,整个过程并没有用户的介入。这种模式是 bootloader 的正常工作模式,因此在嵌入式产品发布的时侯,bootloader 显然必须工作在这种模式下。
下载(Downloading)模式: 在这种模式下,目标机上的 bootloader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载应有程序固件文件。从主机下载的文件通常首先被 bootloader 保存到目标机的 RAM 中,然后再被 bootloader 写到目标机上的FLASH 类固态存储设备中。bootloader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 bootloader 的这种工作模式。工作于这种模式下的 bootloader 通常都会向它的终端用户提供一个简单的命令行接口。
1.2 与主机文件传输最常见的情况就是,目标机上的 bootloader 通过串口与主机之间进行文件传输,传输协议通常是 xmodem/ymodem/zmodem 协议中的一种。本文所述bootloader支持基于串口的xmodem文件传输协议。 file:///C:\DOCUME~1\Jie\LOCALS~1\Temp\ksohtml\wps239.tmp.jpg 图:xmodem协议文件传输界面 1.3 主要任务与典型结构框架file:///C:\DOCUME~1\Jie\LOCALS~1\Temp\ksohtml\wps23A.tmp.jpg 图:主要任务 初始化硬件设备 通常包括:(1)初始化至少一个串口,以便和终端用户进行 I/O 输出信息。以NXP的系列为例,通常选择UART0初始化,可兼顾固件下载接口和用户I/O输出;(2)初始化计时器;(3)初始化flash等。 在初始化这些设备之后,也可以设置LED闪烁,以表明已经进入 main() 函数执行。设备初始化完成后,可以输出一些打印信息,程序名字、信息说明、版本号等。
检测系统的应用程序 所谓应用程序,即区别于bootloader的应用,完成嵌入式系统的所有功能。 检测系统应用程序即检测该系统是否已经下载了应用程序,是否执行跳转,如果没有则系统将停留在bootloader阶段。可通过一些简单的命令下载应用程序。
在 bootloader 程序的设计与实现中,没有什么能够比从串口终端正确地收到打印信息能更令人激动了。此外,向串口终端打印信息也是一个非常重要而又有效的调试手段。但是,我们经常会碰到串口终端显示乱码或根本没有显示的问题。造成这个问题主要有两种原因:(1) bootloader 对串口的初始化设置不正确。(2) 运行在 host 端的终端仿真程序对串口的设置不正确,这包括:波特率、奇偶校验、数据位和停止位等方面的设置。 此外,有时也会碰到这样的问题,那就是:在 bootloader 的运行过程中我们可以正确地向串口终端输出信息,但当 bootloader 启动应用后却无法看到应用启动输出信息。我们可以从以下方面考虑:(1)应用是否有执行中断映射;(2)编译应用程序时是否已经设置分散加载,地址信息是否准确;(3)应用程序是否正确设置串口;
|