在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            用中斷的方式都控制LED

            作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
            1. #include"2410lib.h"
            2. #include"Option.h"
            3. #include"2410slib.h"
            4. #include"def.h"
            5. #include"2410addr.h"
            6. #include"stdlib.h"
            7. #include"string.h"
            8. #include"mmu.h"
            9. #include"timer.h"
            10. #defineLED_OPEN1~(1<<5)
            11. #defineLED_OPEN2~(1<<6)
            12. #defineLED_OPEN3~(1<<7)
            13. #defineLED_CLOSE1(1<<5)
            14. #defineLED_CLOSE2(1<<6)
            15. #defineLED_CLOSE3(1<<7)
            16. intflag=1;
            17. staticvoid__irqkey_handler(void);
            18. //初始化led的端口
            19. voidled_port_init(void)
            20. {
            21. rGPGCON&=0xffff03ff;
            22. rGPGCON|=0x00005400;
            23. }
            24. //初始化按鍵
            25. voidkey_init(void)
            26. {
            27. //initGPIO(F)
            28. rGPFCON&=0xfffffffC;
            29. rGPFCON|=0x00000002;
            30. //initEINT0register初始化控制EINT0這個(gè)中斷的外部中斷控制器
            31. rEXTINT0&=~(0x7);
            32. //rEINTPEND用來(lái)記錄有沒(méi)有發(fā)生中斷,如果要清楚就置1即可
            33. //rEINTMASK用來(lái)指示要不要屏蔽這個(gè)中斷
            34. //設(shè)置ISR
            35. pISR_EINT0=(U32)key_handler;
            36. EnableIrq(BIT_EINT0);//設(shè)置INTMASk寄存器
            37. }
            38. voiddely(inttt)
            39. {
            40. inti=0;
            41. intj=0;
            42. for(;i
            43. {
            44. for(;j<100000000;j++);
            45. }
            46. }
            47. voidled_run(void)
            48. {
            49. if(flag)
            50. {
            51. rGPGDAT|=LED_CLOSE1|LED_CLOSE2|LED_CLOSE3;
            52. dely(100);
            53. flag=0;
            54. }
            55. else
            56. {
            57. rGPGDAT&=LED_OPEN1&LED_OPEN2&LED_OPEN3;
            58. dely(100);
            59. flag=1;
            60. }
            61. }
            62. //按鍵中斷函數(shù)
            63. staticvoid__irqkey_handler(void)
            64. {
            65. if(rINTPND==BIT_EINT0)//去判斷srcpnd這寄存器
            66. {
            67. ClearPending(BIT_EINT0);
            68. led_run();
            69. }
            70. }
            71. intMain()
            72. {
            73. MMU_Init();
            74. led_port_init();
            75. key_init();
            76. while(1);
            77. }

            在這里講中斷主要是為了讓自己能搭起一個(gè)框架,以后關(guān)于中斷的程序能有一個(gè)的模板.

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

            這個(gè)程序的主要作用很簡(jiǎn)單,就是通過(guò)按鍵來(lái)產(chǎn)生中斷,從而控制led的亮與滅...

            第一步:對(duì)中斷引腳的初始化

            我的開(kāi)發(fā)板EINT0這個(gè)中斷是有GPF0觸發(fā)的,所以先對(duì)這個(gè)引腳進(jìn)行初始化,初始化的工作就是工作GPFCON控制器讓引腳為中斷的引腳。通過(guò)配置不同的值可以讓引腳有不同的功能,這里的功能就是產(chǎn)生 中斷的功能。

            第二步:對(duì)于該中斷內(nèi)部的設(shè)置

            中斷內(nèi)部的設(shè)置包含了:按鍵怎么樣的情況下算觸發(fā)中斷,內(nèi)部的pnd要清除(pnd寄存器是用來(lái)記錄這個(gè)中斷是否發(fā)生),還有就是內(nèi)部mask(不能屏蔽該中斷)

            當(dāng)然有的中斷不用全部都設(shè)置,就像EINT0~3好像就不用,因?yàn)檫@幾位都是保留的。

            第三步:就是設(shè)置中斷處理函數(shù)

            這一步應(yīng)該是比較關(guān)鍵的一步,中斷函數(shù)是你自己設(shè)定的,不過(guò)你要把你寫的中斷處理函數(shù)賦值給相對(duì)應(yīng)的地方,這個(gè)講深了就是高級(jí)編程與底層之間的聯(lián)系,關(guān)于這個(gè)就是arm本身的中斷處理過(guò)程了。

            最好在之前能先調(diào)用一下clearpending函數(shù),清除一下srcpnd與intpnd兩個(gè)寄存器,設(shè)置完處理函數(shù)以后就用enableirq這個(gè)函數(shù)去初始化intmsk這個(gè)寄存器,讓他不會(huì)被屏蔽。

            這就是關(guān)于中斷的一個(gè)流程,掌握這個(gè)的話以后就可以以不變應(yīng)萬(wàn)變了。

            但是關(guān)于這個(gè)程序還有一點(diǎn)就是關(guān)于MMU_Init這個(gè)函數(shù)是必須的,原因好像是關(guān)于中斷向量表的轉(zhuǎn)移,我查閱了網(wǎng)上的一些資料,而對(duì)于具體還不是清楚,但是宏觀上是這樣的。

            中斷向量表本身是在0地址處,但是我們?cè)谶\(yùn)行程序的時(shí)候是在0x30000000處,所以程序產(chǎn)生的中斷其實(shí)是不能找到想對(duì)應(yīng)的中斷處理程序,而MMU_Init好像有一部分的作用就是講中斷向量表也轉(zhuǎn)移到0x30000000地址處,那樣就可以運(yùn)行了。不過(guò)真正的原因還在想的過(guò)程中,不過(guò)這樣是可以解決問(wèn)題的。下次會(huì)對(duì)這個(gè)問(wèn)題進(jìn)行解答的....



            關(guān)鍵詞: 中斷控制LE

            評(píng)論


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

            關(guān)閉