新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 從Flash和SRAM中觸發(fā)中斷的過(guò)程示例

從Flash和SRAM中觸發(fā)中斷的過(guò)程示例

作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò) 收藏

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

MAIN

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

int main()

{

/*建立系統(tǒng)*/

Initialize();

/*啟動(dòng)定時(shí)器*/

T1_TCR=0x1;

while(1)

{

}

}

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

初始化

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

void Initialize()

{

/*初始化PLL(使用10MHz晶振配置),使CPU時(shí)鐘達(dá)到60MHz*/

/*設(shè)置驅(qū)動(dòng)和應(yīng)用*/

PLLCFG=0x25;

Feed();

/*開PLL*/

PLLCON=0x1;

Feed();

/*等待PLL設(shè)置頻率并鎖定*/

while(!PLLSTAT PLOCK)){}

/*連接PLL作為時(shí)鐘源*/

PLLCON=0x3;

Feed();

開啟MAM,設(shè)置時(shí)鐘數(shù)來(lái)取得FLASH MEMORY。

MAMCR=0x2;

MAMTIM=0x4;

設(shè)置設(shè)備的時(shí)鐘(pclk)到系統(tǒng)時(shí)鐘(cclk)

VPBDIV=0X1;

初始化GPIO

IODIR = 0Xffff;

IOSET = 0Xffff;

初始化TIMER1

T1_TCR = 0x0;

T1_TC = 0x0;

T1_PR = 0x0;

T1_PC = 0x0;

后面的用戶來(lái)填充相關(guān)的值

T1_MR0 = 0x……;

復(fù)位,進(jìn)入相關(guān)的中斷

T1_MCR = 0x3;

初始化VIC

VICINTSEL = 0x0; /*TIMER1選擇為IRQ*/

VICINTEN = 0x20; //TIMER1 中斷允許

VICCNTL0 = 0x25;

ISR 的地址

VICVADDR0 = (unsigned long)IRQHandler;

}

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

TIMER1 ISR

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

_irq void IRQHandler()

{

/*這里是中斷服務(wù)子程序。這個(gè)中斷需要在TIMER1中清除,然后寫入一個(gè)合適的值到VIC向量地址寄存器來(lái)更新VIC硬件優(yōu)先級(jí)。*/

T1_IR = 0x1;

VICVADDR = 0Xff;

}

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

PLL的反饋頻率

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

void feed()

{

PLLFEED = 0Xaa;

PLLFEED = 0x55;

}

中運(yùn)行上述代碼所需要進(jìn)行的改變和增加

鏈接需要按照如下方法配置:中斷向量表(ivt.s)需要鏈接到的底部(0x40000000)。確定相關(guān)的中斷向量位于0x40000000-0x4000003F。其他的文件鏈接到代碼內(nèi)部,可以存放在中。

而且,中斷向量需要被remapped to SRAM。使用MEMAP寄存器,配置它為用戶RAM模式可以實(shí)現(xiàn)。

Int main()

{

………………….

初始化 MEMAP

MEMAP = 0x2;

………………………..

}

TIMER1配置為觸發(fā)一個(gè)FIQ中斷,代碼從FLASH中運(yùn)行

例子包含下面的文件:

1. 中斷向量表(ivt.s)

2. 啟動(dòng)匯編代碼(init.s)

3. 主C文件

本應(yīng)用筆記只提到了相關(guān)的文件。如果使用其他的交叉編譯環(huán)境,C文件可以保存大部分不動(dòng),匯編文件需要更改。

中斷向量表

這些代碼應(yīng)當(dāng)被鏈接到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 ;標(biāo)識(shí)

LDR PC,IRQ_Addr

;*******************************************************************

FIQ ISR已經(jīng)自己存放在了 0x1C,取代了放置在這里的LDR 指令

******************************************************************

;清 TIMER1 中斷

MOV R8,#0x1

LDR R9,=T1_IR

STR R8,[R9]

后面的用戶應(yīng)當(dāng)增加更多的代碼在這里。

;返回到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


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: Flash SRAM 觸發(fā)中斷

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉