DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1139|回复: 0
打印 上一主题 下一主题

[待整理] 设计基于NXP LPC2000的次级启动加载程序用于代码升级

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 08:46:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
引言
  本文虽然是针对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命令来执行。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-1-9 19:32 , 耗时 0.084809 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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