keil下ARM9按键中断问题

发布者:CelestialSoul最新更新时间:2015-08-25 来源: eefocus关键字:keil  ARM9  按键中断 手机看文章 扫描二维码
随时随地手机看文章
一直纠结于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来管理中断向量等有关知识。


关键字:keil  ARM9  按键中断 引用地址:keil下ARM9按键中断问题

上一篇:内存管理单元MMU 地址映射一
下一篇:裸机程序--keil mdk下xc2440按键控制LED

推荐阅读最新更新时间:2024-03-16 14:29

mini2440+jlink+mkd 裸机按键中断调试心得体会
开发板:友善之臂mini2440,仿真器:jlink v8,开发环境:RealView mdk 4.54 需要阅读的文档:S3C2440A_UserManual,mini2440开发手册,其他 实验目标:按下开发板上的key1,触发外部中断EINT8,开发板进入中断程序运行点亮或灭掉LED1 分析: 为了方便理解,我按照信号的走向,分为几个环节,逐个说明。 环节1.先说说,按下key1是如何触发外部中断信号。阅读mini2440的开发手册后发现key1是和s3c2440芯片上的GPG0管脚相连,这个IO口除了能作输入输出用,还可以功能复用为EINT8,即2440众多的外部中断源之一。也就是说,我们把这个GPG0
[单片机]
mini2440+jlink+mkd 裸机<font color='red'>按键</font><font color='red'>中断</font>调试心得体会
S3C2440裸机------异常与中断__按键中断程序示例
1.中断处理流程 首先我们要对中断进行初始化,中断初始化主要分为下面三块: 设置中断,让它能够发出中断信号, 设置中断控制器,让它能够发出中断信号给CPU, 设置CPU,CPSR有I位,它是总开关。 然后中断的处理过程和之前说的异常处理过程类似,不一样的就是处理完成之后要清中断。 2 start.s 首先我们CPSR寄存器的bit7清零,这是中断的总开关,只有这一位设置为0才能相应中断。 mrs r0, cpsr /* 读出cpsr */ bic r0, r0, #(1 7) /* 清除I位, 使能中断 */ msr cpsr, r0 然后当发生中断时,程序会跳转到0x18的地方去执行程序,因此我们增加如下代码
[单片机]
S3C2440裸机------异常与<font color='red'>中断</font>__<font color='red'>按键</font><font color='red'>中断</font>程序示例
keil4程序的某行断点设置问题,双击程序所在行没反应
最近要用到keil4 来设置断点,测试单片机延时时间,发现双击程序所在行没反应。 解决方案: 1.打开keil软件,选择 Source Group 1 2.右击 Source Group 1 3.选择 Options for Group ‘Source Group 1’, Generate Assembler SRC File 前面的勾去掉。
[单片机]
ST Link设备连接正常,但是keil中找不到已连接的设备
报错: No target connected Error:Flash Download failed - Target DLL has been cancelled Connection to device is lost:check power supply and debug connection. If the target is in low power mode,please enable Debug in Low Power Mode option from Target- settings menu. 背景: 使用STM32F429,STlink下载程序,keil for arm进行编程,原本一切
[单片机]
ST Link设备连接正常,但是<font color='red'>keil</font>中找不到已连接的设备
C51 keil v4 流水灯简单代码的编写
#include reg52.h #include intrins.h typedef unsigned char u8;/*char 为1字节,8位 */ typedef unsigned int u16; /*一般情况下用int,因为unsigned char取值范围为0~255;而int为65535; 用u16,u8使代码的可移植性高 */ #define led P0 //sbit led=P0^0; //两种表示方式 void delay(u16 i) { while(i--); }//运用延时函数达到使led灯闪烁的目的 void main() { /* while(1) { led=1; delay
[单片机]
07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键驱动程序
一、查询方式的按键驱动程序 查询方式的按键驱动程序,与LED驱动程序类似,我们来复习一下上节的写好的字符设备驱动程序框架,改写出查询方式的按键驱动程序。 (1)按键驱动程序如下: Open中配置引脚 Read中返回引脚状态 入口函数:地址映射 虚拟地址 #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include asm/uaccess.h #include asm/irq.h #include asm/io.h #
[单片机]
07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+<font color='red'>中断</font>+引入poll机制的<font color='red'>按键</font>驱动程序
将TQ2440的ADS工程文件移植到KEIL5中
TQ2440的例程都是ADS环境下的,ADS已经是古董级的软件,win7都不带支持何况WIN10。考虑需求就尝试将工程移植到keil5上。查找了大量资料,试验加修改总算是移植成功了。文后附上所参考的地址。这里总结一下,方便查看: keil环境配置 打开keil,下载相关的内核,sumsung2440的。 新建工程,选择相关内核(会提示添加源文件,如果自己有就不要添加了,直接导入),将文件导入到工程,此处和导入STM32的h文件,c文件一样 注意拷贝文件时inc文件一定要和源文件在一个文件夹(不是指工程中,是你实际存放文件的文件夹里)就是和2440init.s文件放一块 设置Target选项卡 这里SIZE可以自行设置10000
[单片机]
将TQ2440的ADS工程文件移植到<font color='red'>KEIL</font>5中
Keil模式设置和编程事项
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类: 8051存储类型及存储区域 , 存储模式 , 存储器类型声明 , 变量类型声明 , 位变量与位寻址 ,特殊功能寄存器(SFR) ,C51指针 l 函数属性 具体说明如下(8031为缺省CPU)。 第一节 Keil C51扩展关键字 C51 V4.0版本有以下扩展关键字(共19个): _at_ idata sfr16 alien interrupt small bdata large _task_ Code bit pdata using reentrant xdata compact
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved