微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > keil下ARM9按键中断问题

keil下ARM9按键中断问题

时间:11-28 来源:互联网 点击:
一直纠结于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

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来管理中断向量等有关知识。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top