Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191154
  • 博文数量: 34
  • 博客积分: 746
  • 博客等级: 军士长
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 21:19
文章分类

全部博文(34)

文章存档

2011年(34)

分类: 嵌入式

2011-05-01 22:46:06

中断向量表重映射与复制
2009年09月09日 星期三 下午 01:51

/******************************************************************************

*     文档名:中断向量表重映射与复制

*     创建:   

*     日期:    2009-9-9

******************************************************************************/

关键字:中断向量表重映射,中断向量表复制,建立多个KEIL工程,多个MAIN函数

一、为什么要做中断向量表的重映射?

对于 LPC2XXX系列芯片:

当程序中用到中断的功能时,在产生中断后,处理器会将会跳到处理中断的地址处去执行。而在产生中断后处理器首先会跳到指定的地址处。

这个指定的地址只有三个地方:Boot ROM区,内部FLASH区的0x00000000地址处,或者内部SRAM区的0x40000000地址处。(若是LPC2378,则还有一个用户外部存储器区域)

那么产生中断后它到底会跳到哪个地址,就要看存储器映射控制寄存器

MEMMAP-0XE01FC040)的位10MAP)的值,

默认值为00,这时中断向量被重新映射到Boot ROM区,

当为01时,则中断向量位于FLASH中也就是地址0x00000000处,

当为10时,则中断向量被重新映射到SRAM中,地址为0x40000000

当为11时,为用户外部存储器模式。

二、什么时候需要做向量表重映射?

       1、当工程中编写的中断向量表在内部FLASH0x00000000处时,则需要重新映射,

映射方法:只需要将MEMMAP10位的值设为01即可;

       2、当中断向量表在SRAM中时,则需要重新映射,

映射方法:只需要将MEMMAP10位的值设为10可;

三、什么时候需要做中断向量表的复制?

       当中断向量表放在内部FLASH中,而且起始地址不是0x00000000时,此时如果程序运行后产生中断,则中断向量找不到处理中断的地址,这时候就会出错。解决方法:

1、 假设中断向量表被指定放在FLASH中的0x00030000处,若要正确产生中断向量处理,则需要中断向量复制到SRAM并重新映射;

2、 步骤1 因为LPC2XXX8个异常向量(具体异常类型在芯片相关文档中有说明)每个异常向量占4个字节,也就是32位,故先定义一个指向中断向量表的首地址的指针:

unsigned int *vptr = (unsigned int *) 0x00030000;

unsigned int *vsram = (unsigned int *) 0x400000000;

3、 步骤2:复制向量表

int I;

for (i=0;i<32;i++)

{

        *(vptr+i)=*(vsram+i);

}

4、 步骤3:重新映射向量表

#define MEMMAP   (*(volatile unsigned long *)(0xE01FC040)) //寄存器地址定义

MEMMAP = 0x2 //重新映射向量表到SRAM

中断产生后,将到SRAM0x40000000地址处执行中断向量表。

5、 完成。

四、使用中断向量表复制与重映射有什么用途?

1、使用中断向量表与重映射可以建立两个或者两个以上的独立工程(多个main函数);

2、与分散加载文件配合使用,可以在同存储芯片中存储多个可独立运行的代码;

3、利用上述方法可实现任意升级代码区的功能;

4、建立多个工程存放到同一芯片中运行,可增加RAM的使用率。

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