異常及中斷處理_第1頁
異常及中斷處理_第2頁
異常及中斷處理_第3頁
異常及中斷處理_第4頁
異常及中斷處理_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、一 ARM異常中斷處理概述1、中斷的概念中斷是一個(gè)過程,是CPU在執(zhí)行當(dāng)前程序的過程中因硬件或軟件的原因插入了另一段程序運(yùn)行的過程。因硬件原因引起的中斷過程的出現(xiàn)是不可預(yù)測(cè)的,即隨機(jī)的,而軟中斷是事先安排的。 2、中斷源的概念 我們把可以引起中斷的信號(hào)源稱之為中斷源。3、中斷優(yōu)先級(jí)的概念A(yù)RM處理器中有7種類型的異常,按優(yōu)先級(jí)從高到低的排列如下:復(fù)位異常(Reset)、數(shù)據(jù)異常(Data Abort)、快速中斷異常(FIQ)、外部中斷異常(IRQ)、預(yù)取異常(Prefetch Abort)、軟件中斷(SWI)和未定義指令異常(Undefined instruction) 二 ARM體系異常種類

2、下面是ARM的7種異常當(dāng)異常發(fā)生時(shí),處理器會(huì)把PC設(shè)置為一個(gè)特定的存儲(chǔ)器地址。這一地址放在被稱為向量表(vector table)的特定地址范圍內(nèi)。向量表的入口是一些跳轉(zhuǎn)指令,跳轉(zhuǎn)到專門處理某個(gè)異?;蛑袛嗟淖映绦颉?當(dāng)異常產(chǎn)生時(shí), ARM core:拷貝 CPSR 到 SPSR_<mode>設(shè)置適當(dāng)?shù)?CPSR 位: 改變處理器狀態(tài)進(jìn)入 ARM 狀態(tài) 改變處理器模式進(jìn)入相應(yīng)的異常模式設(shè)置中斷禁止位禁止相應(yīng)中斷 (如果需要)保存返回地址到 LR_<mode>設(shè)置 PC 為相應(yīng)的異常向量返回時(shí), 異常處理需要:從 SPSR_<mode>恢復(fù)CPSR從LR_<

3、;mode>恢復(fù)PC Note:這些操作只能在 ARM 態(tài)執(zhí)行.當(dāng)異常發(fā)生時(shí),分組寄存器r14和SPSR用于保存處理器狀態(tài),操作偽指令如下。 R14_<exception_mode> = return linkSPSR_<exception_mode> = CPSRCPSR40 = exception mode numberCPSR5 = 0 /*進(jìn)入ARM狀態(tài)*/If <exception_mode> = = reset or FIQ thenCPSR6 = 1/*屏蔽快速中斷FIQ*/CPSR7 = 1/*屏蔽外部中斷IRQ*/PC = excep

4、tion vector address異常返回時(shí),SPSR內(nèi)容恢復(fù)到CPSR,連接寄存器r14的內(nèi)容恢復(fù)到程序計(jì)數(shù)器PC。注:cortex-A8系統(tǒng)中支持通過設(shè)置CP15的c12寄存器將異常向量表的首地址設(shè)置在任意地址。例如:mcr p15, 0, r0, c12, c0, 01復(fù)位異常當(dāng)處理器的復(fù)位引腳有效時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況下。系統(tǒng)上電。系統(tǒng)復(fù)位。當(dāng)復(fù)位異常時(shí),系統(tǒng)執(zhí)行下列偽操作:R14_svc = UNPREDICTABLE valueSPSR_svc = UNPREDICTABLE valueCPSR40 =

5、0b10011/*進(jìn)入特權(quán)模式*/CPSR5 = 0/*處理器進(jìn)入ARM狀態(tài)*/CPSR6 = 1/*禁止快速中斷*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configured thenPC = 0xffff0000ElsePC = 0x00000000 復(fù)位異常中斷處理程序的主要功能:· 設(shè)置異常中斷向量表。 · 初始化數(shù)據(jù)棧和寄存器。 · 初始化存儲(chǔ)系統(tǒng),如系統(tǒng)中的MMU等。 · 初始化關(guān)鍵的I/O設(shè)備。 · 使能中斷。 · 處理器切換到合適的模式。 · 初始化C變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行。

6、 2未定義指令異常當(dāng)ARM處理器執(zhí)行協(xié)處理器指令時(shí),它必須等待一個(gè)外部協(xié)處理器應(yīng)答后,才能真正執(zhí)行這條指令。若協(xié)處理器沒有相應(yīng),則發(fā)生未定義指令異常 當(dāng)未定義異常發(fā)生時(shí),系統(tǒng)執(zhí)行下列的偽操作:r14_und = address of next instruction after the undefined instructionSPSR_und = CPSRCPSR40 = 0b11011/*進(jìn)入未定義指令模式*/CPSR5 = 0/*處理器進(jìn)入ARM狀態(tài)*/*CPSR6保持不變*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configured then PC =

7、0xffff0004Else PC = 0x000000043軟中斷SWI軟中斷異常發(fā)生時(shí),處理器進(jìn)入特權(quán)模式,執(zhí)行一些特權(quán)模式下的操作系統(tǒng)功能。軟中斷異常發(fā)生時(shí),處理器執(zhí)行下列偽操作。r14_svc = address of next instruction after the SWI instructionSPSR_und = CPSRCPSR40 = 0b10011/*進(jìn)入特權(quán)模式*/CPSR5 = 0/*處理器進(jìn)入ARM狀態(tài)*/*CPSR6保持不變*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff0008El

8、se PC = 0x00000008 4預(yù)取指令異常預(yù)取指令異常是由系統(tǒng)存儲(chǔ)器報(bào)告的。當(dāng)處理器試圖去取一條被標(biāo)記為預(yù)取無效的指令時(shí),發(fā)生預(yù)取異常。如果系統(tǒng)中不包含MMU時(shí),指令預(yù)取異常中斷處理程序只是簡單地報(bào)告錯(cuò)誤并退出。若包含MMU,引起異常的指令的物理地址被存儲(chǔ)到內(nèi)存中。預(yù)取異常發(fā)生時(shí),處理器執(zhí)行下列偽操作:r14_svc = address of the aborted instruction + 4SPSR_und = CPSRCPSR40 = 0b10111/*進(jìn)入特權(quán)模式*/CPSR5 = 0/*處理器進(jìn)入ARM狀態(tài)*/*CPSR6保持不變*/CPSR7 = 1/*禁止外設(shè)中斷*/

9、If high vectors configured then PC = 0xffff000CElse PC = 0x0000000C5數(shù)據(jù)訪問中止異常數(shù)據(jù)訪問中止異常是由存儲(chǔ)器發(fā)出數(shù)據(jù)中止信號(hào),它由存儲(chǔ)器訪問指令Load/Store產(chǎn)生。當(dāng)數(shù)據(jù)訪問指令的目標(biāo)地址不存在或者該地址不允許當(dāng)前指令訪問時(shí),處理器產(chǎn)生數(shù)據(jù)訪問中止異常。當(dāng)數(shù)據(jù)訪問中止異常發(fā)生時(shí),處理器執(zhí)行下列偽操作。r14_abt = address of the aborted instruction + 8SPSR_abt = CPSRCPSR40 = 0b10111CPSR5 = 0/*CPSR6保持不變*/CPSR7 = 1

10、/*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff000C10Else PC = 0x00000010當(dāng)數(shù)據(jù)訪問中止異常發(fā)生時(shí),寄存器的值將根據(jù)以下規(guī)則進(jìn)行修改: 返回地址寄存器r14的值只與發(fā)生數(shù)據(jù)異常的指令地址有關(guān),與PC值無關(guān) 如果指令中沒有指定基址寄存器回寫,則基址寄存器的值不變 如果指令中指定了基址寄存器回寫,則寄存器的值和具體芯片的Abort Models有關(guān),由芯片的生產(chǎn)商指定 如果指令只加載一個(gè)通用寄存器的值,則通用寄存器的值不變 如果是批量加載指令,則寄存器中的值是不可預(yù)知的值 如果指令加載協(xié)處理器寄存器的值,則被加載寄

11、存器的值不可預(yù)知6外部中斷IRQ當(dāng)處理器的外部中斷請(qǐng)求引腳有效,而且CPSR寄存器的I控制位被清除時(shí),處理器產(chǎn)生外部中斷IRQ異常。系統(tǒng)中各外部設(shè)備通常通過該異常中斷請(qǐng)求處理器服務(wù)。當(dāng)外部中斷IRQ發(fā)生時(shí),處理器執(zhí)行下列偽操作。r14_irq = address of next instruction to be executed + 4SPSR_irq = CPSRCPSR40 = 0b10010/*進(jìn)入特權(quán)模式*/CPSR5 = 0/*處理器進(jìn)入ARM狀態(tài)*/ /*CPSR6保持不變*/CPSR7 = 1 /*禁止外設(shè)中斷*/If high vectors configured then

12、PC = 0xffff0018Else PC = 0x00000018 7快速中斷FIQ當(dāng)處理器的快速中斷請(qǐng)求引腳有效且CPSR寄存器的F控制位被清除時(shí),處理器產(chǎn)生快速中斷請(qǐng)求FIQ異常。當(dāng)快速中斷異常發(fā)生時(shí),處理器執(zhí)行下列偽操作。r14_fiq = address of next instruction to be executed + 4SPSR_fiq = CPSRCPSR40 = 0b10001 /*進(jìn)入FIQ模式*/CPSR5 = 0CPSR6 = 1CPSR7 = 1If high vectors configured then PC= 0xffff001cElse PC = 0x

13、0000001c 三 ARM異常的優(yōu)先級(jí)四ARM 處理器模式和異常ARM處理器異常及其對(duì)應(yīng)的模式:每一種異常都會(huì)導(dǎo)致內(nèi)核進(jìn)入一種特定的模式。也可以通過編程改變CPSR,進(jìn)入任何一種ARM處理器模式。注:用戶模式和系統(tǒng)模式是僅有的不可以通過異常進(jìn)入的兩種模式,也就是說,要進(jìn)入這兩張模式必須通過編程改變CPSR五 ARM 異常響應(yīng)和處理程序返回1.中斷響應(yīng)的概念中斷響應(yīng)大致可以分為以下幾個(gè)步驟:1、 保護(hù)斷點(diǎn),即保存下一將要執(zhí)行的指令的地址,就是把這個(gè)地址送入堆棧。Sub lr, lr, #4Stmfd sp!, r0-r12, lr2、 尋找中斷入口,根據(jù)不同的中斷源所產(chǎn)生的中斷,查找不同的入口

14、地址。Bl c_irq_handler3、 執(zhí)行中斷處理程序??梢詫懺趍ain函數(shù)中4、 中斷返回:執(zhí)行完中斷指令后,就從中斷處返回到主程序,繼續(xù)執(zhí)行。 Ldmfd sp!, r0-r12, pc2.ARM異常響應(yīng)流程1.判斷處理狀態(tài)2.向量表跳轉(zhuǎn)指令B的跳轉(zhuǎn)范圍為±32MB,但很多情況下不能保證所有的異常處理函數(shù)都定位在向量的32MB范圍內(nèi),需要更大范圍的跳轉(zhuǎn),而且由于向量表空間的限制,只能由一條指令完成。具體實(shí)現(xiàn)方法有下面兩種。(1)MOV PC,imme_value 這種辦法將目標(biāo)地址直接賦值給PC。但這種方法受格式限制不能處理任意立即數(shù)。這個(gè)立即數(shù)由一個(gè)8位數(shù)值循環(huán)右移偶數(shù)位

15、得到。(2)LDR PC,PC+offset 把目標(biāo)地址先存儲(chǔ)在某一個(gè)合適的地址空間,然后把這個(gè)存儲(chǔ)器單元的32位數(shù)據(jù)傳送給PC來實(shí)現(xiàn)跳轉(zhuǎn)。這種方法對(duì)目標(biāo)地址值沒有要求。但是存儲(chǔ)目標(biāo)地址的存儲(chǔ)器單元必須在當(dāng)前指令的±4KB空間范圍內(nèi)。注意:在計(jì)算指令中引用offset數(shù)值的時(shí)候,要考慮處理器流水線中指令預(yù)取對(duì)PC值的影響。3.從異常處理程序中返回1恢復(fù)被中斷程序的處理器狀態(tài)PC和CPSR的恢復(fù)可以通過一條指令來實(shí)現(xiàn),下面是3個(gè)例子。 · MOVS PC,LR · SUBS PC,LR,4 · LDMFD SP!,PC這幾條指令是普通的數(shù)據(jù)處理指令,特殊之

16、處在于它們把程序計(jì)數(shù)器寄存器PC作為目標(biāo)寄存器,并且?guī)Я颂厥獾暮缶Y“S”或“”。其中“S”或“”的作用就是使指令在執(zhí)行時(shí),同時(shí)完成從SPSR到CPSR的拷貝,達(dá)到恢復(fù)狀態(tài)寄存器的目的。2異常的返回地址六 S5PC100中斷相關(guān)的寄存器如果你要想通過 VIC(中斷控制器)控制一個(gè)外設(shè),首先查下面的中斷源表,找到其中斷號(hào),然后去看中斷控制器中的寄存器對(duì)應(yīng)哪位來控制這個(gè)中斷。如果你需要在片外連接一個(gè)外設(shè),并且這個(gè)外設(shè)也需要申請(qǐng)中斷怎么辦呢?對(duì)了,用外部中斷管腳。也就是上圖對(duì)應(yīng)的從 0 號(hào)到 16號(hào)中斷源,其中需要注意到是有 16 根中斷管腳共用一根中斷請(qǐng)求線,怎么共用呢?我們看下圖外部中斷管理模塊,

17、從 SOC 共有 32 個(gè)管腳引出來,這些管腳是復(fù)用的,可以配置成通用輸入/輸出 IO,也可以配置成喚醒中斷的模式 (及內(nèi)部會(huì)連接到中斷控制器電路)。 GPIO 模塊內(nèi)部有三個(gè)寄存器對(duì)這 32 根管線的中斷功能進(jìn)行管理。(1).功能寄存器 如圖,對(duì)管腳的電平激發(fā)方式進(jìn)行管理,可以配置成高電平激發(fā)中斷,低電平 、上升沿 、下降沿、雙邊沿等。相關(guān)寄存器如下:WKUP_INT0_7_CONWKUP_INT8_15_CONWKUP_INT16_24_CONWKUP_INT25_31_CON圖為中斷控制器 (2)Mask 寄存器 外部管腳 EINT16 到 EINT31 共 16 根線共用一根線 EIN

18、T(16-31)連接到中斷控制器,也就是共用一個(gè)中斷號(hào)(中斷號(hào) 16),可能需要在某一個(gè)時(shí)刻只能有一根管腳線的信號(hào)通過模塊順利進(jìn)入中斷控制器,這個(gè)時(shí)候就需要將其余的管腳信號(hào)屏蔽起來,如何屏蔽呢?就是設(shè)置 mask 里的對(duì)應(yīng)位。相關(guān)寄存器如下:WKUP_INT0_7_MASKWKUP_INT8_15_MASKWKUP_INT16_24_MASKWKUP_INT25_31_MASK (3)Pend 寄存器 記錄中斷信號(hào)標(biāo)志。如果信號(hào)通過了前面的關(guān)口,送入了 VIC,就是將對(duì)應(yīng)線上的 pend 寄存器的對(duì)應(yīng)位值 1,如果在某一時(shí)刻,中斷控制器來不起處理當(dāng)前信號(hào)線上的中斷請(qǐng)求,那么pend 位會(huì)一直保

19、持著這個(gè)請(qǐng)求,哪怕硬件中斷線上的中斷激發(fā)狀態(tài)已經(jīng)過去。同樣,需要注意是,如果當(dāng)前線上的中斷已經(jīng)處理,這個(gè)pend 位也不會(huì)自動(dòng)清零,需要人為的清零。相關(guān)寄存器如下:WKUP_INT0_7_PENDWKUP_INT8_15_PENDWKUP_INT16_24_PENDWKUP_INT25_31_PEND中斷信號(hào)請(qǐng)求的流程是:1 使外設(shè)有中斷激發(fā)的功能(如果為外部中斷,設(shè)置電平激發(fā)方式)。2 設(shè)置子模塊下的 mask 寄存器,讓需要監(jiān)控的中斷信號(hào)能通過,而不需要監(jiān)控的則 被屏蔽。3 開啟中斷控制器中對(duì)應(yīng)每個(gè)中斷源的使能位。1.S5PC100的中斷相關(guān)的寄存器中斷狀態(tài)寄存器VIC0IRQSTATUS

20、中斷源模式選擇寄存器VIC0INTSELECT中斷源使能寄存器VIC0INTENABLE中斷源向量地址寄存器VIC0VECTADDR0 . VIC0VECTADDR31中斷源入口地址寄存器VIC0ADDRESS一 ARM的SWI異常中斷處理程序設(shè)計(jì)匯編:_start:b reset_handlernopb swi_handlernopnopnopnopswi_handler:stmfd sp!, r0-r12, lrldr r0, lr, -4bic r0, r0, #0xff000000 獲取軟中斷 的中斷號(hào)bl c_swi_handlerldmfd sp!, r0-r12, pc SPSR

21、 ->CPSR 并出棧c_swi_handler:stmfd sp!, r0-r12, lrcmp r0, #5bleq sys_opencmp r0, #6bleq sys_closeldmfd sp!, r0-r12, pc二 ARM的IRQ異常中斷處理程序設(shè)計(jì)匯編:_start:b reset_handler reset 異常nopnopnopnopnopb irq_handler 中斷異常nopirq_handler:sub lr, lr, #4 調(diào)整返回地址stmfd sp!, r0-r12, lr 壓棧保存寄存器bl c_irq_handler 跳轉(zhuǎn)到C 中 中斷處理函數(shù)執(zhí)行

22、 執(zhí)行完返回ldmfd sp!, r0-r12, pc 出棧 并回復(fù)cpsrreset_handler:/*將異常向量表搬到 20008000*/ldr r0, =0x20008000mcr p15, 0, r0, c12, c0, 0/*初始化svc棧頂指針*/ldr r0, =0x30000000mov sp, r0sub r0, r0, #0x1000/*到irq模式下初始化irq模式棧頂指針,開irq fiq*/msr cpsr_c, #0x12mov sp, r0sub r0, r0, #0x100/*到user模式 并且初始化user的棧頂指針*/msr cpsr_c, #0x10

23、mov sp, r0/*清bss段*/clear_bss:mov r2, #0ldr r0, =_bss_startldr r1, =_bss_endbss_loop:cmp r0, r1strne r2, r0, #4bne bss_loop/*跳轉(zhuǎn)到*/b main.end(一)key中斷/*key_IRQ*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();printf("c_irq_handler! rn ");VIC0ADDRESS = 0;VIC1ADDR

24、ESS = 0;VIC2ADDRESS = 0;void key1_irq_init(void)/設(shè)置IO 為激發(fā)中斷功能GPH0.GPH0CON = GPH0.GPH0CON & (0xf<<4) | (0x2<<4);/設(shè)置外部中斷管腳為下降沿激發(fā)方式WU_INT0_7_CON = WU_INT0_7_CON & (0x7<<4) | (0x2<<4);/enable mask 位WU_INT0_7_MASK = WU_INT0_7_MASK & (1<<1);/注冊(cè)中斷處理函數(shù) 因?yàn)榘存I1 鏈接的為EIN

25、T1 所以將處理函數(shù)放在對(duì)應(yīng)第0組 第一個(gè)地址寄存器里VIC0VECTADDR.VIC0VECTADDR1 = (unsigned int)key1_down;/enable 中斷控制器中對(duì)應(yīng)中斷源的使能位VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (1<<1);void key2_irq_init(void)GPH0.GPH0CON = GPH0.GPH0CON & (0xf<<8) | (0x2<<8);WU_INT0_7_CON = WU_INT0_7_CON &

26、; (0x7<<8) | (0x2<<8);WU_INT0_7_MASK = WU_INT0_7_MASK & (1<<2);VIC0VECTADDR.VIC0VECTADDR2 = (unsigned int)key2_down;VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (1<<2);void key1_down(void)printf("*key1_down*rn");WU_INT0_7_PEND = (1<<1);void

27、key2_down(void)printf("*key2_down*rn");WU_INT0_7_PEND = (1<<2);void main(void)uart0_init();key1_irq_init();key2_irq_init();uart0_sendstring("hello farsight !nr ");int a = 100;printf("a = %dnr", a);while(1);(二)UART中斷/*uart0_IRQ*/void c_irq_handler(void)void (*pfunc

28、)(void);pfunc =(void *)VIC0ADDRESS;pfunc();uart0_sendstring("c_irq_handler! rn ");VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void uart0_recvchar_irq(void)uart0_sendchar(UART0.URXH0);/清標(biāo)志位 寫1清0UART0.UINTP0 = UART0.UINTP0;UART0.UINTSP0 = UART0.UINTSP0;void main(void)uart0_init();uart0_s

29、endstring("hello farsight !nr ");/注冊(cè)中斷處理函數(shù)UART0.UINTM0 = 0x1;VIC1VECTADDR.VIC1VECTADDR10 = (unsigned int)uart0_recvchar_irq;VIC1INTERRUPT.VIC1INTENABLE = VIC1INTERRUPT.VIC1INTENABLE | (1<<10);while(1);(三)ADC中斷/*ADC_IRQ*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0A

30、DDRESS;pfunc();uart0_sendstring("c_irq_handler! rn ");VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void adc_init(void)/ 精度12位| 開啟分頻| 分頻 得1M | 讀轉(zhuǎn)換/ADC.ADCCON = (1<<16) | (1<<14) | (65<<6) | (1<<1);ADC.ADCCON = (1<<16) | (1<<14) | (65<<6) | (1); /

31、手動(dòng)開啟轉(zhuǎn)換ADC.ADCMUX = 0; /選擇第0通道void adc_read_handler(void)adc_val = ADC.ADCDAT0 & 0xfff;printf("adc_val = %d rn", adc_val);ADC.ADCCLRINT = 0; /填任意值,清ADC中斷標(biāo)志void main(void)uart0_init();uart0_sendstring("hello farsight !nr ");/注冊(cè)中斷處理函數(shù)人口VIC2VECTADDR.VIC2VECTADDR23 = (unsigned int

32、)adc_read_handler;VIC2INTERRUPT.VIC2INTENABLE = VIC2INTERRUPT.VIC2INTENABLE | (1<<23);adc_init();int m;while(1)for(m=0; m<0x1000000;m+);ADC.ADCCON = ADC.ADCCON | (1); /手動(dòng)開啟轉(zhuǎn)換(四)ALARM中斷/*RTC_ALARM*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();uart0_sendstrin

33、g("c_irq_handler! rn ");VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void rtc_init(void)RTCCON = 1; /開啟修改權(quán)限RTCBCD.BCDYEAR = 0x13;RTCBCD.BCDMON = 0x10;RTCBCD.BCDDATE = 0x21;RTCBCD.BCDHOUR = 0x16;RTCBCD.BCDMIN = 0x06;RTCBCD.BCDSEC = 0x55;RTCCON = 0;void rtc_alarm_init(void)RTALM.RTCALM =

34、1<<6 | 1<<2 | 1<<1;RTALM.ALMHOUR = 0x16;RTALM.ALMMIN = 0x07;void rtc_alarm_handler(void)uart0_sendstring("alarm signalnr");alarm_beep_on();RTCINTP = (1<<1);/清除中斷標(biāo)志void main(void)uart0_init();uart0_sendstring("hello farsight !rn ");rtc_init();rtc_alarm_init

35、();VIC0VECTADDR.VIC0VECTADDR28 = (unsigned int)rtc_alarm_handler;VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (1<<28);while(1);(五)TICK中斷/*RTC_ALARM_TICK*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void rtc_init(void)RTCCON = 1; /開啟修改權(quán)限RTCBCD.BCDYEAR = 0x13;RTCBCD.BCDMON = 0x10;RTCBCD.BCDDATE = 0x21;RTCBCD.BCDHOUR = 0x16;RTCBCD.BCDMIN = 0x06;RTCBCD.BCDSEC = 0x55;RTCCON = 0;void rtc_alarm_init(void)RT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論