从Flash和SRAM中触发中断的过程示例
/*************************************************************
MAIN
***********************************************************/
int main()
{
/*建立系统*/
Initialize();
/*启动定时器*/
T1_TCR=0x1;
while(1)
{
}
}
/*******************************************************************
初始化
*******************************************************************/
void Initialize()
{
/*初始化PLL(使用10MHz晶振配置),使CPU时钟达到60MHz*/
/*设置驱动和应用*/
PLLCFG=0x25;
Feed();
/*开PLL*/
PLLCON=0x1;
Feed();
/*等待PLL设置频率并锁定*/
while(!PLLSTAT PLOCK)){}
/*连接PLL作为时钟源*/
PLLCON=0x3;
Feed();
开启MAM,设置时钟数来取得FLASH MEMORY。
MAMCR=0x2;
MAMTIM=0x4;
设置设备的时钟(pclk)到系统时钟(cclk)
VPBDIV=0X1;
初始化GPIO
IODIR = 0Xffff;
IOSET = 0Xffff;
初始化TIMER1
T1_TCR = 0x0;
T1_TC = 0x0;
T1_PR = 0x0;
T1_PC = 0x0;
后面的用户来填充相关的值
T1_MR0 = 0x……;
复位,进入相关的中断
T1_MCR = 0x3;
初始化VIC
VICINTSEL = 0x0; /*TIMER1选择为IRQ*/
VICINTEN = 0x20; //TIMER1 中断允许
VICCNTL0 = 0x25;
ISR 的地址
VICVADDR0 = (unsigned long)IRQHandler;
}
/********************************************************************
TIMER1 ISR
******************************************************************/
_irq void IRQHandler()
{
/*这里是中断服务子程序。这个中断需要在TIMER1中清除,然后写入一个合适的值到VIC向量地址寄存器来更新VIC硬件优先级。*/
T1_IR = 0x1;
VICVADDR = 0Xff;
}
/**************************************************************
PLL的反馈频率
*************************************************************/
void feed()
{
PLLFEED = 0Xaa;
PLLFEED = 0x55;
}
在SRAM中运行上述代码所需要进行的改变和增加
链接需要按照如下方法配置:中断向量表(ivt.s)需要链接到SRAM的底部(0x40000000)。确定相关的中断向量位于0x40000000-0x4000003F。其他的文件链接到代码内部,可以存放在SRAM中。
而且,中断向量需要被remapped to SRAM。使用MEMAP寄存器,配置它为用户RAM模式可以实现。
Int main()
{
………………….
初始化 MEMAP
MEMAP = 0x2;
………………………..
}
TIMER1配置为触发一个FIQ中断,代码从FLASH中运行
例子包含下面的文件:
1. 中断向量表(ivt.s)
2. 启动汇编代码(init.s)
3. 主C文件
本应用笔记只提到了相关的文件。如果使用其他的交叉编译环境,C文件可以保存大部分不动,汇编文件需要更改。
中断向量表
这些代码应当被链接到0x0。这样中断向量和FIQ ISR就被提供给了ARM核。
;*******************************************************************
汇编指令
********************************************************************
AREA IVT,CODE ;新的代码段
CODE32
IMPORT start
T1_IR EQU 0Xe0008000
ENTRY
;*******************************************************************
LDR PC,=start
LDR PC,Undefined_Addr
LDR PC,SWI_Addr
LDR PC,Prefetch_Addr
LDR PC,Abort_Addr
DCD ;标识
LDR PC,IRQ_Addr
;*******************************************************************
FIQ ISR已经自己存放在了 0x1C,取代了放置在这里的LDR 指令
******************************************************************
;清 TIMER1 中断
MOV R8,#0x1
LDR R9,=T1_IR
STR R8,[R9]
后面的用户应当增加更多的代码在这里。
;返回到C main
SUBS PC,R14,#0x04
;*************************************************************************
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Pregetch_Addr DCD Pregetch_Handler
Abort_Addr DCD Abort_Handler
IRQ_Addr DCD IRQ_Handler
评论