2011年(34)
分类: 嵌入式
2011-05-01 22:46:06
/******************************************************************************
* 文档名:中断向量表重映射与复制
* 创建:
* 日期: 2009-9-9
******************************************************************************/
关键字:中断向量表重映射,中断向量表复制,建立多个KEIL工程,多个MAIN函数
一、为什么要做中断向量表的重映射?
对于 LPC2XXX系列芯片:
当程序中用到中断的功能时,在产生中断后,处理器会将会跳到处理中断的地址处去执行。而在产生中断后处理器首先会跳到指定的地址处。
这个指定的地址只有三个地方:Boot ROM区,内部FLASH区的0x00000000地址处,或者内部SRAM区的0x40000000地址处。(若是LPC2378,则还有一个用户外部存储器区域)
那么产生中断后它到底会跳到哪个地址,就要看存储器映射控制寄存器
(MEMMAP-0XE01FC040)的位1:0(MAP)的值,
默认值为00,这时中断向量被重新映射到Boot ROM区,
当为01时,则中断向量位于FLASH中也就是地址0x00000000处,
当为10时,则中断向量被重新映射到SRAM中,地址为0x40000000,
当为11时,为用户外部存储器模式。
二、什么时候需要做向量表重映射?
1、当工程中编写的中断向量表在内部FLASH中0x00000000处时,则需要重新映射,
映射方法:只需要将MEMMAP的1:0位的值设为01即可;
2、当中断向量表在SRAM中时,则需要重新映射,
映射方法:只需要将MEMMAP的1:0位的值设为10可;
三、什么时候需要做中断向量表的复制?
当中断向量表放在内部FLASH中,而且起始地址不是0x00000000时,此时如果程序运行后产生中断,则中断向量找不到处理中断的地址,这时候就会出错。解决方法:
1、 假设中断向量表被指定放在FLASH中的0x00030000处,若要正确产生中断向量处理,则需要中断向量复制到SRAM并重新映射;
2、 步骤1: 因为LPC2XXX有8个异常向量(具体异常类型在芯片相关文档中有说明)每个异常向量占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中
中断产生后,将到SRAM的0x40000000地址处执行中断向量表。
5、 完成。
四、使用中断向量表复制与重映射有什么用途?
1、使用中断向量表与重映射可以建立两个或者两个以上的独立工程(多个main函数);
2、与分散加载文件配合使用,可以在同存储芯片中存储多个可独立运行的代码;
3、利用上述方法可实现任意升级代码区的功能;
4、建立多个工程存放到同一芯片中运行,可增加RAM的使用率。