新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > keil下ARM9按鍵中斷問題

        keil下ARM9按鍵中斷問題

        作者: 時間:2016-11-28 來源:網絡 收藏
        一直糾結于MDK自帶啟動文件不能中斷,以為文件少了一些配置,網上討論的也是沸沸揚揚!!!!!!!!
        其實不然!!!!!!!!!!!!!!!!!!在一個好心的老師幫助及啟發下,發現只要把IRQ_Handler當成中斷名稱就行了,現場保護都是反匯編(即把不是匯編的代碼轉換成匯編代碼)自動保存的!

        兩種方法實現中斷:

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

        一:啟動文件的中斷向量表里,

        IMPORT key_isr

        ldr pc,=key_isr

        LDR PC, FIQ_Addr

        IF :DEF:__RTX

        IMPORT SWI_Handler

        IMPORT IRQ_Handler_RTX

        ENDIF

        ltorg

        LDRPC, IRQ_Addr的IRQ_Addr直接改為中斷函數名稱(如上:key_isr);

        二:啟動文件里附上

        HandleEINT0EQUIntVTAddress
        HandleEINT1EQUIntVTAddress +4
        HandleEINT2EQUIntVTAddress +4*2
        HandleEINT3EQUIntVTAddress +4*3
        HandleEINT4_7EQUIntVTAddress +4*4
        HandleEINT8_23EQUIntVTAddress +4*5
        HandleCAMEQUIntVTAddress +4*6
        HandleBATFLTEQUIntVTAddress +4*7
        HandleTICKEQUIntVTAddress +4*8
        HandleWDTEQUIntVTAddress +4*9
        HandleTIMER0 EQUIntVTAddress +4*10
        HandleTIMER1 EQUIntVTAddress +4*11
        HandleTIMER2 EQUIntVTAddress +4*12
        HandleTIMER3 EQUIntVTAddress +4*13
        HandleTIMER4 EQUIntVTAddress +4*14
        HandleUART2EQUIntVTAddress +4*15
        HandleLCD EQUIntVTAddress +4*16
        HandleDMA0EQUIntVTAddress +4*17
        HandleDMA1EQUIntVTAddress +4*18
        HandleDMA2EQUIntVTAddress +4*19
        HandleDMA3EQUIntVTAddress +4*20
        HandleMMCEQUIntVTAddress +4*21
        HandleSPI0EQUIntVTAddress +4*22
        HandleUART1EQUIntVTAddress +4*23
        HandleNFCONEQUIntVTAddress +4*24
        HandleUSBDEQUIntVTAddress +4*25
        HandleUSBHEQUIntVTAddress +4*26
        HandleIICEQUIntVTAddress +4*27
        HandleUART0 EQUIntVTAddress +4*28
        HandleSPI1 EQUIntVTAddress +4*39
        HandleRTC EQUIntVTAddress +4*30
        HandleADC EQUIntVTAddress +4*31

        IRQ_Entry
        subsp,sp,#4;reserved for PC
        stmfdsp!,{r8-r9}

        ldrr9,=INTOFFSET
        ldrr9,[r9]
        ldrr8,=HandleEINT0
        addr8,r8,r9,lsl #2
        ldrr8,[r8]
        strr8,[sp,#8]
        ldmfdsp!,{r8-r9,pc}

        兩種方法比較:第二種較第一種在編程時更靈活;

        中斷實現過程中遇到的問題:

        一,中斷函數里寄存器清零順序要注意從中斷源先開始清零,逐個順序到最頂層中斷控制,具體參考我的工程實例“中斷函數實現1和2”

        二,發現必須要有去抖操作,否則可能會多次進中斷,而且去抖方法為

        1,可以在中斷里只設置標志,然后在主函數里執行服務函數;

        2,可以在清中斷寄存器(必須在最底層寄存器:EINT...清中斷)前面加延時函數;

        本人下一步要研究如何利用MMU來管理中斷向量等有關知識。




        關鍵詞: keilARM9按鍵中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永善县| 云林县| 秦皇岛市| 周口市| 五原县| 旬邑县| 清丰县| 汝城县| 容城县| 繁峙县| 兴安盟| 元朗区| 伊宁县| 罗甸县| 揭东县| 津市市| 永城市| 湖州市| 阿鲁科尔沁旗| 麻栗坡县| 桃源县| 满洲里市| 通州区| 墨竹工卡县| 丰顺县| 和林格尔县| 惠水县| 威海市| 辽阳县| 武穴市| 涿鹿县| 凤阳县| 广元市| 高台县| 丰镇市| 宁城县| 北安市| 丽水市| 绥棱县| 山阴县| 芮城县|