在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > s3c6410---外部中斷---key (基于OK6410)

            s3c6410---外部中斷---key (基于OK6410)

            作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
            今天來(lái)說(shuō)一下s3c6410外部中斷

            首先說(shuō)一下外部中斷:顧名思義,由s3c6410外部觸發(fā)的中斷就是外部中斷,由s3c6410內(nèi)部觸發(fā)的是內(nèi)部中斷。

            本文引用地址:http://www.biyoush.com/article/201611/317820.htm

            但是具體到咱們的板子上,到底哪些是外部中斷,哪些是內(nèi)部中斷呢?可以這樣概括,除了INT_EINT0---INT_EINT4之

            外的都是內(nèi)部中斷。像watch dog就是內(nèi)部中斷,像key,wm9717觸發(fā)的就是外部中斷。

            先說(shuō)下外部中斷從外設(shè)到cpu的具體流程:對(duì)理解中斷很中重要!

            外設(shè)------>GPIO------>VIC------>ARM1176

            我們編寫關(guān)于中斷的程序也是這個(gè)過(guò)程:

            配置外設(shè)------>配置GPIO------>配置VIC------>配置ARM協(xié)處理器等

            總之一句話:

            你要打造一個(gè)通路能夠讓中斷的電平變化能順順利利的傳送到ARM里!

            下面就依照這個(gè)順序講一下:

            (一)、GPIO及其配置

            為什么會(huì)有GPIO呢?因?yàn)橥庠O(shè)都是連到GPIO上嘀!s3c6410具有187個(gè)多功能I/O端口,其實(shí)有127個(gè)用于外部中

            斷。這127個(gè)引角呢,可以分為這么10個(gè)分組:

            這里給大家分一下:

            EINT0 GPN0--->GPN15 GPL8--->GPL14 GPM0--->GPM4

            EINT1 GPA0--->GPA7 GPB0--->GPB6

            EINT2 GPC0--->GPC7

            EINT3 GPD0--->GPD5

            EINT4 GPF0--->GPF14

            EINT5 GPG0--->GPG7

            EINT6 GPH0--->GPH9

            EINT7 GPO0--->GPO15

            EINT8 GPP0--->GPP14

            EINT9 GPQ0--->GPQ9

            每個(gè)引腳可以對(duì)應(yīng)一個(gè)外部中斷。

            那么當(dāng)外部中斷電平變化傳GPIO里,除了對(duì)應(yīng)端口的哪幾個(gè)寄存器(CON,PUD,etc)GPIO里又有哪些寄存器會(huì)

            對(duì)這個(gè)中斷信號(hào)造成影響呢?看下面:

            EINTXCON :配置觸發(fā)方式,低電平,高電平,上升沿,下降沿。

            EINTXPEND :這個(gè)現(xiàn)在用不到,一會(huì)兒中斷處理程序會(huì)用到,這個(gè)是pending register。

            EINTXMASK :這里可以屏蔽某個(gè)外部中斷,要通過(guò)需要clear一下對(duì)應(yīng)的中斷位。默認(rèn)是全屏蔽的,需要注意!

            EINTXFLTCON : 這里設(shè)置濾波方式,可以去毛刺。

            我們這里要設(shè)置的是EINTXCON,EINTXMASK,EINTXFLTCON。

            這樣我們的中斷信號(hào)就可以順利通過(guò)GPIO了,又要到哪里去呢?當(dāng)時(shí)是VIC向量中斷控制器!

            (到達(dá)VIC)

            上面說(shuō)的這些外部中斷在GPIO里分成了九組,但是具體反應(yīng)到VIC里他們占用哪些中斷號(hào)呢?這里貼一下:

            NO SOURCES Description Group

            0 INT_EINT0 External interrupt 0 ~ 3 VIC0
            1 INT_EINT1 External interrupt 4 ~ 11 VIC0

            32 INT_EINT2 External interrupt 12 ~ 19 VIC1

            33 INT_EINT3 External interrupt 20 ~ 27 VIC1

            53 INT_EINT4 External interrupt Group 1 ~ Group 9 VIC1

            (前四個(gè)中斷號(hào) 覆蓋了EINT0,他們共用這四個(gè)中斷號(hào)。53中斷號(hào)覆蓋了1--->9組中斷引角,他們悲劇的共用一個(gè)中斷號(hào))

            這里我們使用VIC,當(dāng)然要先開啟VIC,這個(gè)是在協(xié)處理器里設(shè)置的 VE位

            1. //enableVE
            2. __asm____volatile__(
            3. "mrcp15,0,r0,c1,c0,0/n"
            4. "orrr0,r0,#(1<<24)/n"
            5. "mcrp15,0,r0,c1,c0,0/n"
            6. :
            7. :
            8. :"r0"
            9. );

            這樣我們的VIC就能用了。

            這里就簡(jiǎn)單了,就這么幾個(gè)重要的寄存器

            VICXINTSELECT 選擇中斷方式FIQ or IRQ。

            VICXVECTADDR 設(shè)置中斷處理程序的地址。

            VICXINTENABLE 使能GPIO傳過(guò)來(lái)的中斷信號(hào)。

            其實(shí)設(shè)置到這里外部中斷就能正確運(yùn)行了,但是還有許多別的寄存器,比如設(shè)置什么優(yōu)先級(jí)的,大家如果需要就添上去。

            (到達(dá)ARM)

            ARM得知來(lái)了個(gè)中斷,就和VIC進(jìn)行一系列的握手,得到VICADDRESS,就開始執(zhí)行我們的中斷處理程序了。

            另一個(gè)重要的內(nèi)容,就是中斷處理程序里清除中斷。

            我們要clear 一下EINTXPEND,clear 一下VICXADDRESS。有的人說(shuō)要清除一下VICXIRQSTATUS,但是我發(fā)現(xiàn)我清除和不

            清除沒什么區(qū)別,也許是我理解的不透,哪位高手看到了,麻煩告訴我一聲,謝了!也許有人要聞,EINTXPEND和VICXADDRESS

            清除的順序,我要說(shuō):無(wú)所謂了。因?yàn)樵贏RM發(fā)出VICIRQACK或者讀VICADDRESS的時(shí)候,硬件自動(dòng)屏蔽當(dāng)前中斷和比當(dāng)前中斷優(yōu)先級(jí)

            小的中斷!但是不屏蔽更高優(yōu)先級(jí)的中斷。所以誰(shuí)先誰(shuí)后無(wú)所謂了,總之都清了就行了。

            ARM把我們的中斷處理程序執(zhí)行后,這個(gè)循環(huán)就完了,我們的設(shè)置的就起了作用了。

            下面我貼下OK6410 key中斷的代碼。

            1. //VIC
            2. #defineVIC0INTENABLE(*(unsignedlongvolatile*)0x71200010)
            3. #defineVIC0INTSELECT(*(unsignedlongvolatile*)0x7120000C)
            4. #defineVIC0VECTADDR(*(unsignedlongvolatile*)0x71200100)
            5. #defineVIC0IRQSTATUS(*(unsignedlongvolatile*)0x71200000)
            6. #defineVIC0ADDRESS(*(unsignedlongvolatile*)0x71200F00)
            7. #defineVIC0SOFTINT(*(unsignedlongvolatile*)0x71200018)
            8. #defineVIC1ADDRESS(*(unsignedlongvolatile*)0x71300F00)
            9. #defineVIC0INTENCLEAR(*(unsignedlongvolatile*)0x71200014)
            10. //externinterrupt
            11. #defineEINT0CON0(*(unsignedlongvolatile*)0x7F008900)
            12. #defineEINT0MASK(*(unsignedlongvolatile*)0x7F008920)
            13. #defineEINT0PEND(*(unsignedlongvolatile*)0x7F008924)
            14. #defineEINT0FLTCON0(*(unsignedlongvolatile*)0x7F008910)
            15. //GPN
            16. #defineGPNCON(*(unsignedlongvolatile*)0x7F008830)
            17. #defineGPNDAT(*(unsignedlongvolatile*)0x7F008834)
            18. #defineGPNPUD(*(unsignedlongvolatile*)0x7F008838)
            19. intcount=0;
            20. void(*show)(char*,...)=(void*)0xc7e11650;
            21. externunsignedlongprint;
            22. intmain()
            23. {
            24. /*enableVE(VICENABLE)*/
            25. __asm____volatile__(
            26. "mrcp15,0,r0,c1,c0,0/n"
            27. "orrr0,r0,#(1<<24)/n"
            28. "mcrp15,0,r0,c1,c0,0/n"
            29. :
            30. :
            31. :"r0"
            32. );
            33. /*GPIOstuff*/
            34. GPNCON&=1<<2;
            35. GPNCON|=0x2;//setGPNCON(0-1)toexterninterrupt.
            36. GPNPUD&=~(1<<2);//disablepulldown/up.
            37. EINT0CON0&=1<<3;
            38. EINT0CON0|=0x3;//setsignalbothedgetrigger.
            39. //EINT0FLTCON0|=(0x1<<7);
            40. EINT0MASK&=~(0x1);//cleartheinterruptmask.
            41. /*VICstuff*/
            42. VIC0VECTADDR=&print;
            43. VIC0INTSELECT&=~(1<<0);
            44. VIC0INTENABLE|=1<<0;
            45. return0;
            46. }
            47. void__do_irq(void)
            48. {
            49. show("helloexterninterrupt./n");
            50. VIC0IRQSTATUS&=~(1<<1);
            51. EINT0PEND=1;
            52. VIC0ADDRESS=0;
            53. VIC1ADDRESS=0;//justincase.
            54. }

            這里解釋一下,我為什么要把濾波設(shè)置去掉呢,因?yàn)槲以O(shè)置延時(shí)濾波,效果不大,數(shù)字濾波也沒仔細(xì)找合適的寬度,這里就是讓大家理解一下外部中斷

            到底怎么一步步的執(zhí)行的。更細(xì)節(jié)的東西,你可以在ARM1176的datasheet和向量中斷控制器PL192的datasheet里找。

            好了,就寫到這里了,我想可以大家應(yīng)該可以明白,如果明白了就在下面頂一下,如果不明白的或者錯(cuò)誤的就在下面說(shuō)下。謝謝!

            另外感謝↘`莫、離的提醒。

            匯編跳轉(zhuǎn)的代碼

            1. .globalprint
            2. .extern__do_irq
            3. print:
            4. movsp,#0x52000000
            5. sublr,lr,#4
            6. stmfdsp!,{r0-r14}
            7. bl__do_irq;
            8. ldmfdsp,{r0-r13,pc}^

            這是兩個(gè)文件,匯編的主要用于模式跳轉(zhuǎn),設(shè)置irq模式下的棧地址。



            關(guān)鍵詞: s3c6410外部中斷keyOK641

            評(píng)論


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

            關(guān)閉