从Flash和SRAM中触发中断的过程示例(一)
使用LPC2106的Timer 1 进行的简单的中断处理。示例代码中Timer1分为FIQ和IRQ,用户可以从Flash或者SRAM中运行这些代码。
示例展示了ARM构架中中断是如何操作的。提供的代码表示了向量IRQ(中断请求)和FIQ(快速中断)两种情况。中断向量位于FLASH地址中的 0x00-0x1C。如果需要从SRAM中运行,则中断向量需要被remapped to 0x40000000-0x4000000C。这可以通过Memory Map register来做到。这些代码用ADS1.2开发,从FLASH中运行。提供了从SRAM中运行代码的不同之处。中断服务程序(ISR)使用C语言编写IRQ,用汇编来编写FIQ。
示例使用下面的样式排列:
1. TIMER1 被配置为触发IRQ中断,代码从FLASH中运行;
2. 代码从SRAM中运行所需要的改变和增加;
3. TIMER1被配置为触发FIQ中断,代码从FLASH中运行;
4. 代码从SRAM中运行所需要的改变和增加。
TIMER1 被配置为触发一个IRQ中断,代码从FLASH中运行
这个示例包含下述文件:
1. 中断向量表(ivt.s)
2. 启动用的汇编代码(init.s)
3. 主C文件
只包含了相关的文件。在不同的交叉编译环境下,C文件不用改变太多,而汇编文件需要改变。
中断向量表
这些代码应该被连接到0x0。
;***********************************************************
; 汇编指令
;*************************************************************
AREA IVT,CODE ;新的代码段
CODE32 ;ARM 代码
IMPORT start ;导入外部函数。Start标志不应该在这个段内定义
ENTRY ;定义程序入口
;*********************************************************************
LDR PC,=START
LDR PC,Underfined_Addr
LDR PC,SWI_Addr
LDR PC,Prefetch_Addr
LDR PC,abort_Addr
在 0x14用户应当插入一个标识(checksum),这个标识允许bootloader决定是否允许在FLASH中存放用户代码。当前大多数FLASH编程工具(debuggers and isp utility)有这个内在性能,所以用户不用担心。如果工具没有提供这个功能,这个值需要自己计算,而且应当被插入到0x14。在 LPC2104/5/6的用户手册中的FLASH编程的章节中可以找到checksum相关计算的细节。
DCD ………..
LDR PC,[PC,#=0Xff0]
LDR PC,FIQ_Addr
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Prefetch_Addr DCD Prefetch_Handler
Abort_Addr DCD Abort_Handler
FIQ_Addr DCD FIQ_Handler
;********************************************************************
; 意外处理
;*******************************************************************
下面虚拟的操作在本例子中不做任何有用的操作。这里写下来仅仅是为了完整性
Undefined_Handler
B Undefined_Handler
SWI_Handler
B SWI_Handler
Prefetch_Handler
B Pretetch_Handler
Abort_Handler
B Abort_Handler
FIQ_Handler
B FIQ_Handler
END
复位时,本例子执行的第一条指令是:
LDR PC,=start
将转移到汇编启动代码,允许中断,建立IRQ的堆栈指针核管理员模式。
中断向量的假肢就是IRQ中断
LDR PC,[PC,#=0Xff0]
这条指令加载到PC,PC地址将从VIC向量地址寄存器(0Xffff f030)转到ISR,并在这里执行转移。其余的向量都是虚拟的中断操作。
- 低压闪光灯方案(06-23)
- flash接口电路的实现(07-18)
- 一种支持ISP的Flash在嵌入式设计中的应用(08-19)
- 基于多端口串行Flash的条形LED显示屏控制(08-05)
- 提高MSP430G 系列单片机的Flash 擦写寿命方法(08-28)
- 基于FLASH介质嵌入式存储方案的设计与实现(04-20)