单片机
返回首页

keil下ARM9按键中断问题

2015-08-25 来源:eefocus

一直纠结于MDK自带启动文件不能中断,以为文件少了一些配置,网上讨论的也是沸沸扬扬!!!!!!!!
其实不然!!!!!!!!!!!!!!!!!!在一个好心的老师帮助及启发下,发现只要把IRQ_Handler当成中断名称就行了,现场保护都是反汇编(即把不是汇编的代码转换成汇编代码)自动保存的!
 

两种方法实现中断:

一:启动文件的中断向量表里,

IMPORT key_isr

ldr  pc,=key_isr

                LDR     PC, FIQ_Addr

 

                IF      :DEF:__RTX

                IMPORT  SWI_Handler

                IMPORT  IRQ_Handler_RTX

                ENDIF

   ltorg

LDR     PC, IRQ_Addr的IRQ_Addr直接改为中断函数名称(如上:key_isr);

二:启动文件里附上

HandleEINT0    EQU    IntVTAddress          
HandleEINT1    EQU    IntVTAddress +4
HandleEINT2    EQU    IntVTAddress +4*2
HandleEINT3    EQU    IntVTAddress +4*3
HandleEINT4_7   EQU    IntVTAddress +4*4
HandleEINT8_23    EQU    IntVTAddress +4*5
HandleCAM    EQU    IntVTAddress +4*6
HandleBATFLT   EQU    IntVTAddress +4*7
HandleTICK    EQU    IntVTAddress +4*8
HandleWDT    EQU    IntVTAddress +4*9
HandleTIMER0    EQU    IntVTAddress +4*10
HandleTIMER1    EQU    IntVTAddress +4*11
HandleTIMER2    EQU    IntVTAddress +4*12
HandleTIMER3    EQU    IntVTAddress +4*13
HandleTIMER4    EQU    IntVTAddress +4*14
HandleUART2     EQU    IntVTAddress +4*15
HandleLCD     EQU    IntVTAddress +4*16
HandleDMA0    EQU    IntVTAddress +4*17
HandleDMA1    EQU    IntVTAddress +4*18
HandleDMA2    EQU    IntVTAddress +4*19
HandleDMA3    EQU    IntVTAddress +4*20
HandleMMC    EQU    IntVTAddress +4*21
HandleSPI0    EQU    IntVTAddress +4*22
HandleUART1    EQU    IntVTAddress +4*23
HandleNFCON    EQU    IntVTAddress +4*24
HandleUSBD    EQU    IntVTAddress +4*25
HandleUSBH    EQU    IntVTAddress +4*26
HandleIIC    EQU    IntVTAddress +4*27
HandleUART0    EQU    IntVTAddress +4*28
HandleSPI1     EQU    IntVTAddress +4*39
HandleRTC     EQU    IntVTAddress +4*30
HandleADC     EQU    IntVTAddress +4*31

IRQ_Entry
                sub sp,sp,#4       ;reserved for PC
             stmfd sp!,{r8-r9}
               
             ldr r9,=INTOFFSET
             ldr r9,[r9]
             ldr r8,=HandleEINT0
             add r8,r8,r9,lsl #2
             ldr r8,[r8]
             str r8,[sp,#8]
             ldmfd sp!,{r8-r9,pc}    

两种方法比较:第二种较第一种在编程时更灵活;

中断实现过程中遇到的问题:

一,中断函数里寄存器清零顺序要注意从中断源先开始清零,逐个顺序到最顶层中断控制,具体参考我的工程实例“中断函数实现1和2”

二,发现必须要有去抖操作,否则可能会多次进中断,而且去抖方法为

      1,可以在中断里只设置标志,然后在主函数里执行服务函数;

      2,可以在清中断寄存器(必须在最底层寄存器:EINT...清中断)前面加延时函数;

 

本人下一步要研究如何利用MMU来管理中断向量等有关知识。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章