在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S5PV210的中斷應(yīng)用實(shí)例

            S5PV210的中斷應(yīng)用實(shí)例

            作者: 時間:2016-01-20 來源:電子產(chǎn)品世界 收藏

              實(shí)驗(yàn)程序可以從四個方面設(shè)計:一是啟動程序的設(shè)計,主要是對工作模式的配置和中斷服務(wù)程序的設(shè)計;二是初始化程序,包括中斷控制器的初始化、GPIO引腳的配置;三是主程序設(shè)計;最后編寫Makefile,編譯生成目標(biāo)文件。下面就從這四方面編寫測試代碼以及代碼的詳解。

            本文引用地址:http://www.biyoush.com/article/201601/286015.htm

              1.啟動程序start.S

              前面已介紹過,本身的固化代碼(iROM)在上電后配置好IRQ中斷的棧,以及系統(tǒng)模式所使用的棧,所以在啟動代碼中可以不用設(shè)置這些棧(如果重新配置也可以),所以實(shí)驗(yàn)的啟動程序比較簡單,主要是當(dāng)中斷發(fā)生時先保存現(xiàn)場,跳到中斷服務(wù)程序執(zhí)行中斷處理,處理結(jié)束再恢復(fù)現(xiàn)場。具體代碼示例如下:

              01 .text

              02 .global _start/*聲明一個全局的標(biāo)號*/

              03 .global IRQ_handle

              04_start:

              06mrs r0,cpsr

              07bic r0,r0,#0x00000080/*使能IRQ中斷bit[7]=0 */

              08msr cpsr,r0

              09bl main

              10 halt_loop:

              11bhalt_loop/*死循環(huán),不讓程序跑飛*/

              12

              13 IRQ_handle:

              14sub lr, lr, #4/*計算返回地址*/

              15stmdb sp!, {r0-r12, lr} /*保存用到的寄存器*/

              16bl irq_handler/*跳到中斷服務(wù)函數(shù)*/

              17ldmia sp!, {r0-r12, pc}^/*中斷返回, ^表示將spsr的值復(fù)制到cpsr */

              2.初始化階段

              初始化階段重點(diǎn)講下外部中斷控制寄存器的配置方法,以及中斷向量控制寄存器的設(shè)置,關(guān)于LED相關(guān)的引腳配置不作重復(fù)介紹。

              ……

              08 #define GPH0CON*((volatile unsigned int *)0xE0200C00)

              09 #define GPH0DAT*((volatile unsigned int *)0xE0200C04)

              10 #define EXT_INT_0_CON*((volatile unsigned int *)0xE0200E00)

              11 #define EXT_INT_0_MASK*((volatile unsigned int *)0xE0200F00)

              12

              13 #define VIC0IRQSTATUS*((volatile unsigned int *)0xF2000000)

              14 #define VIC0INTSELECT*((volatile unsigned int *)0xF200000C)

              15 #define VIC0INTENABLE*((volatile unsigned int *)0xF2000010)

              16 #define VIC0VECTADDR0*((volatile unsigned int *)0xF2000100)

              17 #define VIC0VECTADDR1*((volatile unsigned int *)0xF2000104)

              18 #define VIC0ADDRESS*((volatile unsigned int *)0xF2000F00)

              19

              20 extern void IRQ_handle(void);

              ……

              38 //配置中斷引腳

              39 void init_key(void)

              40 {

              41//配置GPIO引腳為中斷功能

              42GPH0CON &= ~(0xFF<<0);

              43GPH0CON |= (0xFF<<0); // key1:bit[3:0];key2:bit[7:4]

              44//配置EXT_INT[0]、EXT_INT[1]中斷為下降沿觸發(fā)

              45EXT_INT_0_CON &= ~(0xFF<<0);

              46EXT_INT_0_CON |= 2|(2<<4);

              47//取消屏蔽外部中斷EXT_INT[0]、EXT_INT[1]

              48EXT_INT_0_MASK &= ~0x3;

              49 }

              50//清中斷掛起寄存器

              51 void clear_int_pend()

              52 {

              53EXT_INT_0_PEND |= 0x3; // EXT_INT[0]、EXT_INT[1]

              54 }

              55 //初始化中斷控制器

              56 void init_int(void)

              57 {

              58//選擇中斷類型為IRQ

              59VIC0INTSELECT = ~0x3; //外部中斷EXT_INT[0]、EXT_INT[1]為IRQ

              60//清VIC0ADDRESS

              61VIC0ADDRESS = 0x0;

              62//設(shè)置EXT_INT[0]、EXT_INT[1]對應(yīng)的中斷服務(wù)程序的入口地址

              63VIC0VECTADDR0 = (int)IRQ_handle;

              64VIC0VECTADDR1 = (int)IRQ_handle;

              65//使能外部中斷EXT_INT[0]、EXT_INT[1]

              66VIC0INTENABLE |= 0x3;

              67 }

              68 //清除需要處理的中斷的中斷處理函數(shù)的地址

              69 void clear_vectaddr(void)

              70 {

              71VIC0ADDRESS = 0x0;

              72 }

              73 //讀中斷狀態(tài)

              74 unsigned long get_irqstatus(void)

              75 {

              76return VIC0IRQSTATUS;

              77 }

              3.主程序

              開發(fā)板上電后就會跳到主程序main執(zhí)行,主程序main中主要是對各初始化函數(shù)的調(diào)用,另外main.c中還定義了一個中斷處理函數(shù),也就是當(dāng)相應(yīng)的中斷發(fā)生后,CPU需要跳過去執(zhí)行的具體內(nèi)容,這里主要是點(diǎn)燈或滅燈。

              01 extern void init_leds(void);//其他源文件中定義的函數(shù)在此聲明

              02 extern void clear_int_pend();

              03 extern void led1_on_off();

              04 extern void led2_on_off();

              05 extern void init_key(void);

              06 extern void init_int(void);

              07 extern void clear_vectaddr(void);

              08 extern unsigned long get_irqstatus(void);

              09 void irq_handler()

              10 {

              11volatile unsigned char key_code = get_irqstatus() & 0x3;// VIC0's status

              12clear_vectaddr();/*清中斷向量寄存器*/

              13clear_int_pend();/*清pending位*/

              14if (key_code == 1)/* key1 */

              15led1_on_off();

              16else if (key_code == 2) /* key2 */

              17led2_on_off();

              18else

              19{

              20led1_on_off();

              21led2_on_off();

              22}

              23 }

              24 int main(void)

              25 {

              26int c = 0;

              27

              28init_leds();/*初始化GPIO引腳*/

              29init_key();/*初始化按鍵中斷*/

              30init_int();/*初始化中斷控制器、使能中斷*/

              31

              32while (1);

              33 }

              4.編寫Makefile

              01 objs := start.o init.o main.o

              02

              03 int.bin: $(objs)

              04arm-linux-ld -Ttext 0xD0020010 -o int.elf $^

              05arm-linux-objcopy -O binary -S int.elf $@

              06arm-linux-objdump -D int.elf > int.dis

              07

              08 %.o : %.c

              09arm-linux-gcc -c -O2 $< -o $@

              10

              11 %.o : %.S

              12arm-linux-gcc -c -O2 $< -o $@

              13

              14 clean:

              15rm -f *.o *.elf *.bin *.dis

              將以上編寫好的源代碼上傳到宿主機(jī)上編譯生成可執(zhí)行的目標(biāo)文件int.bin,然后燒寫到開發(fā)板上電測試。

              實(shí)驗(yàn)最終結(jié)果是:當(dāng)按下“KEY1”,LED1燈會被點(diǎn)亮或熄滅;當(dāng)按下“KEY2”,LED2燈會被點(diǎn)亮或熄滅。



            關(guān)鍵詞: ARM S5PV210

            評論


            相關(guān)推薦

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

            關(guān)閉