新闻中心

EEPW首页>嵌入式系统>设计应用> 从Flash和SRAM中触发中断的过程示例

从Flash和SRAM中触发中断的过程示例

作者: 时间:2016-09-12 来源:网络 收藏

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

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;

}

中运行上述代码所需要进行的改变和增加

链接需要按照如下方法配置:中断向量表(ivt.s)需要链接到的底部(0x40000000)。确定相关的中断向量位于0x40000000-0x4000003F。其他的文件链接到代码内部,可以存放在中。

而且,中断向量需要被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


上一页 1 2 下一页

关键词:FlashSRAM触发中断

评论


相关推荐

技术专区

关闭