新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用中斷的方式都控制LED

        用中斷的方式都控制LED

        作者: 時間:2016-11-11 來源:網絡 收藏
        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這個中斷的外部中斷控制器
        31. rEXTINT0&=~(0x7);
        32. //rEINTPEND用來記錄有沒有發生中斷,如果要清楚就置1即可
        33. //rEINTMASK用來指示要不要屏蔽這個中斷
        34. //設置ISR
        35. pISR_EINT0=(U32)key_handler;
        36. EnableIrq(BIT_EINT0);//設置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. //按鍵中斷函數
        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. }

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

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

        這個程序的主要作用很簡單,就是通過按鍵來產生中斷,從而控制led的亮與滅...

        第一步:對中斷引腳的初始化

        我的開發板EINT0這個中斷是有GPF0觸發的,所以先對這個引腳進行初始化,初始化的工作就是工作GPFCON控制器讓引腳為中斷的引腳。通過配置不同的值可以讓引腳有不同的功能,這里的功能就是產生 中斷的功能。

        第二步:對于該中斷內部的設置

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

        當然有的中斷不用全部都設置,就像EINT0~3好像就不用,因為這幾位都是保留的。

        第三步:就是設置中斷處理函數

        這一步應該是比較關鍵的一步,中斷函數是你自己設定的,不過你要把你寫的中斷處理函數賦值給相對應的地方,這個講深了就是高級編程與底層之間的聯系,關于這個就是arm本身的中斷處理過程了。

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

        這就是關于中斷的一個流程,掌握這個的話以后就可以以不變應萬變了。

        但是關于這個程序還有一點就是關于MMU_Init這個函數是必須的,原因好像是關于中斷向量表的轉移,我查閱了網上的一些資料,而對于具體還不是清楚,但是宏觀上是這樣的。

        中斷向量表本身是在0地址處,但是我們在運行程序的時候是在0x30000000處,所以程序產生的中斷其實是不能找到想對應的中斷處理程序,而MMU_Init好像有一部分的作用就是講中斷向量表也轉移到0x30000000地址處,那樣就可以運行了。不過真正的原因還在想的過程中,不過這樣是可以解決問題的。下次會對這個問題進行解答的....



        關鍵詞: 中斷控制LE

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄯善县| 蒲江县| 合作市| 孙吴县| 灵石县| 雷山县| 乌审旗| 沿河| 灌云县| 南康市| 阳春市| 禄丰县| 水富县| 聂拉木县| 尤溪县| 永州市| 佛山市| 台南县| 乐亭县| 巢湖市| 玉环县| 邹城市| 肥城市| 芜湖市| 迭部县| 淄博市| 棋牌| 六枝特区| 遂川县| 水城县| 固安县| 蕉岭县| 漾濞| 建湖县| 沅陵县| 盐边县| 大厂| 金秀| 德惠市| 仙桃市| 攀枝花市|