Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48665
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-29 11:58
个人简介

等我想好再说

文章分类

全部博文(5)

文章存档

2015年(1)

2014年(1)

2013年(3)

我的朋友

分类: 嵌入式

2013-04-09 10:27:30

LPC11XX提供了IAPIn Applicaion Programing)在应用升级功能。作为实现在应用升级功能的基础,LPC11xx在片内固化了编程32K片内Flash的接口,
用户程序可通过调用这些接口来编程片内
flash,从而达到升级程序的目的。

为了实现IAP升级,我们将片内FLASH分为三块。第一块较小,存储一小段程序我们叫做boot,用来进行IAP升级和引导应用程序。第二块只有一个扇区,
用来存储一个标志(暂且叫做运行标志),boot程序启动后通过判断这个标志来决定是否跳到应用程序运行。第三块较大,用来存储和运行应用程序。
    程序启动后先运行boot,boot通过判断运行标志来决定继续运行boot等待IAP升级,或者跳转到应用程序运行。当运行应用程序时,程序收到IAP升级指
令后更改运行标志,并重启运行boot进行IAP升级。
        从boot跳转到应用程序运行后,有一个问题需要解决,那就是Flash中的中断向量,仍然指向的是boot的中断处理程序。一般的处理方法是,在跳到应
用程序后,应用程序首先将
Flash中应用程序的中断向量拷贝到RAM0地址起始的地方,然后将中断重映射到RAM中。但是对于LPC11C14,由于我们使用了片
内固化的
CAN-API,而CAN-API正好使用了0x100000500x100000b8RAM,这一部分RAM与重映射后的中断向量的一部分相重叠。于是使用中断重映射这种
方法,对我们来说是行不通的,只好另找出路。
       后来我们找到了另一种解决办法,对于中断不进行重映射,而是始终在就在f
lash底部(应用程序和boot程序使用相同的中断向量),然后将中断向量
指向的中断处理程序我们放在
RAM中,而RAM中存放的中断处理程序,并不进行任何实际的处理,而只是跳转到真正的中断处理程序,而这个真正的中断处理
程序保存在boot和应用程序各自的flash中,并且在它里面进行真正的中断处理。这样应用程序启动后就可以通过改写RAM而将中断重定位到自己的中断处理程序

     
这种方法实现了与中断重映射类似的功能,只是多了两次跳转。但是由于它使用的RAM位置可以自定义,所以就成功的回避了直接的的中断重映射会遇到的
RAM冲突问题。而且不使用的中断向量还可以不映射到RAM,从而减小RAM使用的大小。笔者就只使用了RAM中0x10000000---0x10000050来存放中断的跳转指令。


 

 

 


  

阅读(2634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~