当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]本文介绍了如何设计和实现一个基于NXP LPC2000的次级启动加载程序(Secondary Boot Loader),用来对用户代码进行在线升级。

引言

本文虽然是针对NXP(恩智浦公司)的LPC2000系列,但使用IAP技术对内部闪存进行编程却适用于几乎所有的NXP ARM MCU系列,包括Cortex-M0 LPC1100以及Cortex-M3 LPC1300/1700等系列。

在大多数的LPC2000器件内部,存在着一个被称为“主启动加载程序(Primary Boot Loader)”的固件,它在每次上电或复位时被首先运行。本文所讲的“次级启动加载程序”实际上是一段用户自己写的代码(烧写在用户闪存区),在执行完主启动加载程序后被执行,提供给用户一个选择,是继续执行当前的应用程序还是对当前应用程序进行更新。

在应用编程(In Application Programming, IAP)是指在用户应用程序运行时,对内部闪存执行擦除或编程操作,它是对用户代码进行升级的一个关键技术。

LPC2000 IAP介绍

扇区(Sector)

IAP操作都是基于“扇区(Sector)”的,这就意味着即使仅仅需要更新一个字节的代码,也要将该字节所在的整个扇区擦除。因此,用户应该将待更新的代码和其它代码放在不同的扇区,以免误擦除。

IAP的应用领域

使用IAP技术,可以对用户代码进行升级,也可以把内部闪存当成类似EEPROM来存储数据。

当用户应用程序运行时,用户可以对程序的一部分进行更新,就像在线升级病毒库一样,而不必将硬件电路断电甚至将芯片取下来放到专门的编程器上去重新烧写代码。

当数据存储器使用,可以减少PCB板面积、降低成本。由于作为数据存储的扇区会被擦除,因此不能将这些扇区和存放用户应用程序的扇区重叠。另外,闪存的擦除和编程次数也是有一定限制的,过于频繁的擦除或编程会影响闪存的寿命。对于LPC2000芯片来说,至少可以稳定擦写十万次,数据至少可以保存20年。

如何使用IAP

关于IAP的详细说明、各种命令码、返回码和参数格式,可以参考LPC2000系列的用户手册。下面重点介绍一下如何使用IAP。

使用流程

图1是使用IAP对闪存进行擦写和编程的基本步骤。

定义系统参数:在调用IAP命令前,有一些参数必须事先设置好,这包括系统时钟、IAP调用的入口地址、存放输入参数和输出参数的变量。

选择扇区:在对任何扇区进行擦除或编程前,必须选择(准备)这些扇区,当然,也可以一次选择多个扇区。

擦除扇区:在对闪存的指定扇区进行编程前,必须先擦除这些扇区。如果这些扇区已经被擦除,则不必再擦除了。可以一次对多个扇区进行擦除。

编程扇区:在这个阶段,数据将被从SRAM写入闪存中的指定地址。这里有几个要特别注意的地方:

● 只能将位于片内SRAM内的数据写入片内闪存;

● 位于片内闪存的写入地址必须是256字节对齐;

● 片内SRAM必须位于局部总线(Local Bus),这就意味着有两块SRAM区域(供USB和以太网使用)内的数据不能被直接写入闪存;

● 一次写入的字节数必须是256、512、1024或者4096。

数据校验:用户不必自己写程序每次对写入的数据进行检查,而是可以直接调用一个数据校验的IAP命令。

IAP过程中的中断

在擦除和编程操作过程中,片内闪存是不可访问的,当用户程序启动执行时,用户闪存区域的中断向量有效。在调用擦除和编程的IAP命令前,用户应当关闭中断或者确保中断向量表在SRAM中有效并且中断处理函数也位于SM中。

IAP使用的RAM

IAP命令使用片内SM最顶端的32字节空间。最多使用128字节的栈空间(位于用户分配的栈内),且为向下生长方式。

次级启动加载程序和用户应用程序设计

次级启动加载程序

每次上电或者复位后,次级启动加载程序将会被运行,通过串口打印出一些选项,用户可以选择继续执行应用程序或者更新程序。

次级启动加载程序位于内部闪存中从扇区0开始的若干个扇区内,这些扇区不能和用户应用程序占用的扇区重叠。

另外,由于主程序运行在ARM模式,而IAP运行在THUMB模式,因此必须做相应配置使得次级启动加载程序里支持ARM和THUMB模式并存。

用户应用程序

存储器分布

用户应用程序存放在和次级启动加载程序位置不同的的扇区中,并且占用了从0x4000 0000开始的一部分片内SM空间。

在片内SRAM的最底部,存放了应用程序的中断向量表。要注意在配置系统RW区域时,把这部分空间预留出来,即用户应用程序的RW从0x4000 0040开始。

中断向量表重映射

对于ARM7处理器而言,中断向量位于从0x0000 0000到0x0000 001C的地址范围,因此在Boot ROM和SRAM内的一小部分空间必须被映射到这个地址内,使得可以在不同的模式(参考LPC2000用户手册内存映射章节)下使用中断。

这一小段空间包括32字节的中断向量以及额外的32字节跳转指令,总共64字节,范围为0x0000 0000到0x0000 003F。

因为次级启动加载程序的中断向量表存在于闪存的0x0000 0000到0x0000 003F,因此用户应用程序的中断向量表只能被映射到片内SRAM(对于支持外部总线接口的LPC2000器件,也可以映射到片外存储器)。在跳转到用户应用程序执行前,要将这64字节的数据复制到片内SRAM的底部(0x4000 0000 – 0x4000 003F),并且将系统的内存映射模式设置为“User RAM Mode”。这样当用户应用程序产生中断时,系统会自动到位于SRAM的中断向量表取中断向量入口,而不是错误地跳转到位于0x0地址处的、属于次级启动加载程序的中断向量表。

运行用户应用程序

更新完成后,修改PC指针,使其指向新的用户程序的起始地址,然后开始执行。

注意:要保证用户应用程序能运行,必须还要做一些必要的初始化工作,包括RW区域的复制、ZI区域的清零等等,这些没有放在次级启动加载程序里完成,而是在用户应用程序开始运行时首先执行。

程序(从串口利用XMODEM协议更新代码)上电运行时,串口将会打印出如图4的信息。

用户可以测试一些IAP命令,或者选择PROG命令更新用户代码,更新完成后,选择RUN命令来执行。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

作 者:道哥,10年的嵌入式开发老兵。公众号:【IOT物联网小镇】,专注于:C/C、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取Linux、嵌入式领域经典书籍。转 载:欢...

关键字: boot 应用程序 操作系统

作 者:道哥,10年的嵌入式开发老兵。公众号:【IOT物联网小镇】,专注于:C/C、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】,获取Linux、嵌入式领域经典书籍。转 载:欢...

关键字: boot 应用程序 操作系统

不论是在x86平台上,还是在嵌入式平台上,系统的启动一般都经历了bootloader到操作系统,再到应用程序,这样的三级跳过程。每一个相互交接的过程,都是我们学习的重点。这篇文章,我们仍然以x86平台为例,一起来看一下:...

关键字: boot 应用程序 操作系统

不论是在x86平台上,还是在嵌入式平台上,系统的启动一般都经历了bootloader到操作系统,再到应用程序,这样的三级跳过程。每一个相互交接的过程,都是我们学习的重点。这篇文章,我们仍然以x86平台为例,一起来看一下:...

关键字: boot 应用程序 操作系统

一、前言核心隐私数据无论对于企业还是用户来说尤其重要,因此要想办法杜绝各种隐私数据的泄漏。下面陈某带大家从以下三个方面讲解一下隐私数据如何脱敏,也是日常开发中需要注意的:配置文件数据脱敏接口返回数据脱敏日志文件数据脱敏文...

关键字: boot 接口

时间格式化在项目中使用频率是非常高的,当我们的 API 接口返回结果,需要对其中某一个 date 字段属性进行特殊的格式化处理,通常会用到 SimpleDateFormat 工具处理。 SimpleDateFormat ...

关键字: boot 代码

“ 程序员是块砖,哪里需要哪里搬。 ” 公司内部的OA系统最近要升级改造,由于人手不够就把我借调过去了,但说真的我还没做过这方面的功能,第一次接触工作流的开发,还是有点好奇是个怎样的流程。 项目主要用 Springboo...

关键字: boot

6 月 25 日消息 据 Windowslatest 报道,苹果的 Boot Camp 允许 Mac 用户在其设备上运行 Windows,但现在看来 Boot Camp 的日子已经到头了。根据 Ap

关键字: 10 boot mac Windows 苹果 camp

/boot目录::此目录包含系统启动时的图像文件和链接文件,这非常重要

关键字: bin boot sbin 硬件 linux-3.2

Linux 引导过程内幕 从主引导记录到第一个用户空间应用程序的指导 早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载

关键字: boot Linux
关闭
关闭