色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 用中斷的方式都控制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用來記錄有沒有發(fā)生中斷,如果要清楚就置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://cafeforensic.com/article/201611/316752.htm

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

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

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

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

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

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

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

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

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

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

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

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



          關鍵詞: 中斷控制LE

          評論


          技術專區(qū)

          關閉