新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440之中斷操作(MDK4.22)

        S3C2440之中斷操作(MDK4.22)

        作者: 時間:2016-11-19 來源:網絡 收藏
        背景知識:

        2440中斷控制器接收60個中斷源。

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

        中斷被分為多種類別,此處為32類別,正好用32位。


        圖上可以很好的表示整個中斷的流程。有些中斷源對應一個中斷類別,比如串口中斷發送,接收最后都對應到串口中斷。submask屏蔽子類別,未屏蔽的會引起srcpnd相應位置位,如果mask未屏蔽的話,就會緊接著判斷優先級,最后導致intpnd置位,然后產生了IRQ,而FIQ不需要優先級判斷,會直接產生,由intmod設置。

        注意的是:進入ISR后,清除中斷的順序很重要,首先是srcpnd接著是intpnd,如果還需要清除eintpnd的話,要最先清除。

        實驗過程:

        編譯工具--MDK4.22

        硬件圖

        首先需要配置GPF0/1/2/4的腳為EINT0/1/2/4。

        由于用到了外部4-7中斷,需要開啟EINTMASK寄存器相應位。設置優先級寄存器,設置INTMSK寄存器。

        在2440A.s中已經設置了I F位開啟,可以接收中斷了。

        在中斷初始化代碼里,需要將中斷函數的地址安裝到中斷向量表中。

        程序如下:

        MDK4.22的啟動代碼設置


        配置了堆,棧,以及中斷向量表的地址為0x33ffff20處。配置了B口和F口,B口試LED的燈顯示,F口是連接按鍵的外部中斷。按一個鍵會亮一個LED。

        int.c代碼

        view plain
        1. #include"S3C2440.h"
        2. #include"int.h"
        3. voidinit_irq(void)
        4. {
        5. pHandleEINT0=EINT0_Handle;
        6. pHandleEINT1=EINT1_Handle;
        7. pHandleEINT2=EINT2_Handle;
        8. pHandleEINT4_7=EINT4_7_Handle;
        9. rEINTMASK&=(~(1<<4));
        10. rPRIORITY=(rPRIORITY&(~(0x01)))|(0x01<<7);
        11. rINTMSK&=(~(1<<0))&(~(1<<1))&(~(1<<2))&(~(1<<4));
        12. }
        13. void__irqEINT0_Handle(void)
        14. {
        15. rSRCPND=1<<0;
        16. rINTPND=1<<0;
        17. rGPBDAT|=(0x0f<<5);
        18. rGPBDAT&=~(1<<8);
        19. }
        20. void__irqEINT1_Handle(void)
        21. {
        22. rSRCPND=1<<1;
        23. rINTPND=1<<1;
        24. rGPBDAT|=(0x0f<<5);
        25. rGPBDAT&=~(1<<5);
        26. }
        27. void__irqEINT2_Handle(void)
        28. {
        29. rSRCPND=1<<2;
        30. rINTPND=1<<2;
        31. rGPBDAT|=(0x0f<<5);
        32. rGPBDAT&=~(1<<7);
        33. }
        34. void__irqEINT4_7_Handle(void)
        35. {
        36. rEINTPEND=(1<<4);
        37. rSRCPND=1<<4;
        38. rINTPND=1<<4;
        39. rGPBDAT|=(0x0f<<5);
        40. rGPBDAT&=~(1<<6);
        41. }

        主程序:

        view plain
        1. #include"S3C2440.h"
        2. #include"int.h"
        3. intmain(void)
        4. {
        5. rGPBDAT|=(0xf<<5);
        6. init_irq();
        7. while(1);
        8. }

        scatter文件如下:

        LR_ROM1 0x00000000 0x00001000 { ; load region size_region
        ER_ROM1 0x00000000 0x000001000 { ; load address = execution address
        *.o (RESET, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
        }


        RW_RAM1 0x30000000 0x40000000 { ; RW data
        .ANY (+RW +ZI)
        }


        ISR 0x31000000{
        int.o(*)
        }

        HEAP 0x30000800 {
        S3C2440A.o(HEAP)
        }


        STACK 0x30000c00{
        S3C2440A.o(STACK)
        }


        }

        驗證,可以按一個鍵亮一個鍵。

        over



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 龙里县| 宁海县| 长汀县| 酒泉市| 阿巴嘎旗| 迭部县| 高密市| 正定县| 成武县| 沭阳县| 集安市| 兰西县| 山西省| 滦南县| 桐城市| 陈巴尔虎旗| 云安县| 湖南省| 芦溪县| 西昌市| 宿松县| 和平区| 永清县| 荔波县| 吉安县| 裕民县| 崇州市| 平乡县| 来凤县| 互助| 东辽县| 德钦县| 冀州市| 泗阳县| 秭归县| 璧山县| 博湖县| 沙田区| 财经| 丰镇市| 灯塔市|