实验5 ARM中断编程
arm中断处理过程
Arm的中断处理流程1:芯片输入管脚,按照中断的配置发生变化,(比如产生上升沿),arm芯片内部就会检测到中断。
2:ARM要求中断向量表必须放置在从0开始、连续8×4字节的空间内。
所以地址空间“0x00000000-0x00000032”就是所谓的中断向量表。
3:arm检测到中断后,会根据中断的类型强行设置PC寄存器的值。
把当前cpsr的内容保存到spsr_mode . 然后改变cpsr得内容。
(并且把相应的irq或者fiq设置为1,以禁止中断)中断的类型如下表:比如,这个时候来的是复位中断,则IP寄存器的值为0x00000000, 如果来的是IRQ中断则设置IP寄存器的值为 0x00000018。
注意上述中断信号的产生, cpsr 内容的保存,cpsr自动更改,PC寄存器值的设置,都是arm硬件自动完成。
4: arm CPU接下来就会从“IP寄存器所指的地址”内取指令,比如IP内的值是0x00000018,则会从地址 0x00000018 内取指令。
5:中断向量表的内容是我们先前设置好的。
假设是一个IRQ , 0x00000018处的指令为:B INT_IRQ;则代码跳到 INT_IRQ 处的程序执行。
6:INT_IRQ;; /* This Code is to fix a bug in the ARM Core */;STMDB sp!, {r1}MRS r1, SPSRTST r1, #I_BITLDMIA sp!, {r1}SUBNES pc,lr,#4; //保存环境; /* End ARM Core Fix */STMDB sp!, {a1 - v7, fp, ip, lr} ; Save context…… //里面会进行某些状态位判断,以确定具体是哪个中断,然后调用相应处理程序//恢复环境INT_IRQ_EXITLDMIA sp!, {a1 - v7, fp, ip, lr} ; Restore contextSUBS pc, lr, #4 ; Return to interrupted codeEND ; end file7:What happens if an interrupt occurs as it is being disabled?Applies to:If an interrupt is received by the core during execution of an instruction that disables interrupts, the ARM7 family will still take the interrupt. This occurs for both IRQ and FIQ interrupts.For example, consider the follow instruction sequence:MRS r0, cpsrORR r0, r0, #I_Bit:OR:F_Bit ;disable IRQ and FIQ interruptsMSR cpsr_c, r0If an IRQ interrupt is received during execution of the MSR instruction, then the behavior will be as follows:The IRQ interrupt is latchedThe MSR cpsr, r0 executes to completion setting both the I bit and the F bit in the CPSRThe IRQ interrupt is taken because the core was committed to taking the interrupt exception before the I bit was set in the CPSR. The CPSR (with the I bit and F bit set) is moved to the SPSR_irq上面是arm的一个bug。
ARM中断的基本过程
ARM中断的基本过程
ARM 中断的基本过程:在IRQ0 脚给个上升沿后,过程是这样的(比较通
用的过程)。
1)如果你没有打开该中断的使能寄存器,没有任何反应。
2)如果你打开了使能寄存器,但在对应的屏蔽寄存器中屏蔽了该中断,也没有任何反应。
3)上述两个寄存器都设置正确了,中断产生了,CPU 保存当前程序运
行环境,跳到中断入口,ARM 芯片一般是0x?地址处。
4)如果你没有设置中
断向量,即0x?处不是你的代码,程序就会飞掉,当然也可能正常运行,这种情况一般发生在正好飞到正常代码处。
5)设置好中断向量了,中断向量一般是个跳转语句,跳到你的正式的中断处理过程,在这里你可以关闭所有中断,清中断,处理等等,然后退出。
记住某些处理器一定要清中断,否则下次再给个上升沿就没有反应了。
中断路径
如果是irq 中断
产生irq 异常中断转到0x18 1 跳中断跳
如果启用向量中断模式
自动转向对应向量地址每地址对应一条跳转指令2 跳
跳转到中断处理程序
如果使用汇编编写中断处理程序
在该处即可编写处理程序
如果使用c 语言编写中断处理程序
需要添加与c 语言接口程序3 跳
方法:1 汇编编写
在内存空间定义一向量表,用来存放各中断c 语言中断处理程序入口地址。
arm中断实验的实验报告
arm中断实验的实验报告ARM中断实验的实验报告引言:ARM中断是一种常用的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
本次实验旨在通过ARM中断实验,深入了解中断的原理和应用。
一、实验背景ARM中断是ARM处理器中的一种重要功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
中断可以分为外部中断和内部中断两种类型。
外部中断是指来自外部设备的中断请求,例如外部设备的输入信号变化;内部中断是指来自处理器内部的中断请求,例如算术溢出、指令错误等。
二、实验目的1. 了解中断的概念和原理;2. 掌握ARM中断的实现方法;3. 学习如何编写中断服务程序。
三、实验步骤1. 准备实验环境:搭建ARM开发板,连接必要的外设;2. 配置中断控制器:根据实验需求,配置中断控制器的相关寄存器,使其能够正确响应中断请求;3. 编写中断服务程序:根据实验需求,编写中断服务程序,实现中断处理的相关功能;4. 运行实验程序:将编写好的程序下载到ARM开发板上,运行程序,观察中断的触发和响应情况;5. 实验结果分析:根据实验结果,分析中断的触发条件、中断服务程序的执行情况等。
四、实验结果与分析通过实验,我们成功实现了ARM中断的功能。
在实验过程中,我们配置了外部设备的中断引脚,当引脚状态发生变化时,中断控制器会产生中断请求,处理器则会立即中断当前的程序执行,转而执行中断服务程序。
在中断服务程序中,我们可以完成一些特定的操作,例如读取外设数据、更新系统状态等。
实验结果表明,中断服务程序能够正确地响应中断请求,并完成相应的操作。
五、实验总结本次实验通过ARM中断的实验,我们深入了解了中断的原理和应用。
中断是一种重要的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
掌握了中断的实现方法和编写中断服务程序的技巧,我们可以在实际应用中更好地利用中断功能,提高系统的响应速度和稳定性。
arm中断实验的实验报告
arm中断实验的实验报告
《ARM中断实验的实验报告》
实验目的:
本实验旨在通过ARM中断实验,深入理解ARM处理器的中断机制,并掌握中
断处理的相关知识和技能。
实验内容:
1. 确定实验环境:选择一款ARM处理器,并搭建相应的开发环境。
2. 编写中断处理程序:编写一个简单的中断处理程序,包括中断触发条件、中
断服务程序和中断处理函数。
3. 测试中断程序:在实验环境中模拟中断触发条件,验证中断处理程序的正确
性和可靠性。
4. 分析中断处理过程:通过调试工具和相关技术手段,深入分析中断处理过程,包括中断响应时间、中断服务时间和中断处理流程。
实验结果:
经过实验,我们成功搭建了ARM中断实验环境,并编写了一个简单的中断处理程序。
在测试过程中,中断程序能够正确响应和处理中断请求,表现出良好的
稳定性和可靠性。
通过分析中断处理过程,我们深入理解了ARM处理器的中断机制,包括中断触发、中断处理和中断返回等关键环节。
实验结论:
通过本次实验,我们进一步加深了对ARM处理器中断机制的理解,掌握了中断处理的相关知识和技能。
同时,我们也意识到中断处理在实际应用中的重要性
和必要性,为今后的ARM开发和应用奠定了坚实的基础。
总结:
ARM中断实验是一次富有成效的实践活动,通过实验我们不仅学习到了理论知识,还掌握了实际操作技能。
相信在今后的学习和工作中,我们将能够更加熟
练地应用ARM中断处理技术,为ARM相关产品的开发和应用做出更大的贡献。
ARM中断编程实验
ARM中断编程实验数字信息技术实验学校学院专业实验题目 ARM 中断实验编程小组成员二Ο一七年三月一.实验目的通过本次实验了解中断是什么以及学会如何进行中断编程。
二.实验要求基础实验:利用 Exynos4412 的 K1、 K2 这 2 个 I/O 引脚的中断模式,分别点亮LED1和LED2,扩展实验:配置K3为中断模式,点亮LED3.三.实验仪器1、计算机2、USB转9脚串口线(通过USB与计算机连接,母头与实验平台连接)3、Exynos4412处理器开发与应用实验平台4、BL-JTAG 仿真器(通过USB与计算机连接, JTAG口与实验平台连接)5、电源线(与实验平台相连接的交流电源线)四.实验原理1.电路原理K1、 K2、K3 分别与 GPX1_1、 GPX1_2、 GPX3_2相连,在没有按下按键时这些引脚上一直处于高电平,当按键按下时产生下降沿触发中断。
EXYNOS4412 中断实验电路图实验箱上按键位置2、编程流程去除 GPX1_2、 GPX1_2, GPX3_2 内部上下拉属性,配置为中断模式。
GPIO 控制器中关闭屏蔽、使能中断;在 GIC 中断控制器中使能中断;设置中断优先级;使能 GIC;选择中断发送给 CPU0;等待中断产生,然后进入中断处理函数;清除中断源。
五.实验内容(1)连接好开发板与计算机之间的串口线和 BL-JTAG 仿真器(2)连接好开发板的交流电源线(3)接下来利用计算机演示集成开发环境的使用,以及LED灯的控制实验软硬件仿真流程,打开Eclipse,导入工程Key_Int,进行相应代码编写,编译,配置相关debug信息,装载程序,按下KEY1,KEY2,KEY3在putty串口终上查看相应的信息输出以及可以看到LED1和LED2和LED3亮灭情况。
六.实验步骤根据实验一步骤,连接仿真器、串口线,打开Eclipse,导入工程Key_Int,进行相应代码编写,编译,配置相关debug信息,装载程序,按下KEY1,KEY2,在putty串口终端上查看相应的信息输出以及可以看到LED1和LED1亮灭情况。
arm中断实验报告
arm中断实验报告ARM中断实验报告引言:ARM中断是一种重要的系统级别功能,它在处理器运行过程中,能够及时响应外部事件,提高系统的实时性和可靠性。
本实验旨在通过ARM中断的设计和实现,探索中断在嵌入式系统中的应用和原理。
一、实验背景嵌入式系统广泛应用于各个领域,如智能手机、汽车电子、工业自动化等。
这些系统通常需要及时响应外部事件,如按键输入、传感器信号等。
ARM中断机制能够帮助实现这些功能,提高系统的实时性和可靠性。
二、实验目的1. 了解ARM中断的基本原理和工作机制;2. 学习如何使用ARM中断实现外部事件的响应;3. 掌握中断向量表的设计和使用;4. 分析中断服务程序的编写和调用。
三、实验步骤1. 硬件准备:搭建ARM开发板实验环境,连接外部设备(如按键、LED等);2. 软件准备:安装ARM开发工具链,编写中断服务程序;3. 中断初始化:配置中断控制器和外设,使能中断;4. 中断服务程序编写:根据外设的中断触发条件,编写相应的中断服务程序;5. 中断测试:通过触发外设中断,验证中断服务程序的正确性和实时性。
四、实验结果与分析在实验中,我们成功实现了ARM中断的设计和实现。
通过按下外部按键,成功触发了中断服务程序,并实现了相应的功能,如LED闪烁、定时器计数等。
同时,我们还对中断服务程序的响应时间进行了测试和分析,确保系统的实时性。
五、实验总结本实验通过ARM中断的设计和实现,使我们更深入地了解了中断的原理和工作机制。
中断作为一种重要的系统级别功能,在嵌入式系统中具有广泛的应用。
掌握ARM中断的使用,不仅能提高系统的实时性和可靠性,还能为实际项目的开发提供技术支持。
六、实验心得通过本次实验,我对ARM中断有了更深入的了解。
在实验过程中,我遇到了一些问题,如中断服务程序的编写和调试,但通过查阅资料和与同学的讨论,最终解决了这些问题。
通过实验,我不仅学到了理论知识,还提高了问题解决能力和团队合作能力。
实验五_ARM中断控制实验
实验五ARM中断控制实验实验目的1、了解S3C2410中断控制器的结构特点2、理解S3C2410中断控制器的工作原理3、掌握用S3C2410中断控制器的程序设计实验仪器设备及软件ARM实验箱,计算机,ADS程序开发软件实验内容1、HD7279读键中断服务程序在主程序中,通过设置中断屏蔽寄存器,观察按键响应情况。
2、定时器中断服务程序定时器每隔0.5秒中断一次,中断服务程序中,中断次数计数值送数码管显示,计数到N时,重新从0开始计时。
N为学号后两位乘5。
#include "..\INC\config.h"//定时器1中断服务程序//每次中断都把全局变量time的低四位送显示//每次中断time加1,退出前清除中断服务位#define N 8 //根据学号后两位输入void __irq time1(void){ static unsigned time; //time++;if (time==N )time=0;write7279(decode1+4,time%10); //写入显示缓冲区,个位write7279(decode1+5,time%100/10); //写入显示缓冲区,十位write7279(decode1+6,time/100); //写入显示缓冲区,百位rSRCPND |=BIT_TIMER1;rINTPND |=BIT_TIMER1;}//定时器1初始化程序// (Prescale+1) *(1/ div) * TCNTB1//定时器中断时间= ----------------------------------// 50.7MHz//初始化时,要先人工更新一次,即rTON的第9位先1后0void Timer1_init(void){rTCFG0 =254; //Prescale =0rTCFG1 =0; //div MUX=1/2 1/2PCLK=50.7MHzrTCNTB1 =60000; //初始值为60000rTCON =(0<<11)|(1<<9)|(0<<8);//自动更新关,手工更新TCNTB1,定时器1停if ((rINTPND & BIT_TIMER1)){rSRCPND |= BIT_TIMER1;rINTPND |= BIT_TIMER1;}pISR_TIMER1 =(int)time1;rINTMSK &=~(BIT_TIMER1);rTCON =(1<<11)|(0<<9)|(1<<8); //自动更新开,手工更新TCNTB1关,定时器1开}void Main(){unsigned char p,keylast;Target_Init(); //目标初始化send_byte(cmd_test); //测试键write7279(disp_f,0xff); //no flashwrite7279(disp_hide,0xff);//no hidewrite7279(decode1+0,1 & 0x0f); //写入显示缓冲区write7279(decode1+1,1 & 0x0f); //写入显示缓冲区write7279(decode1+2,1 & 0x0f); //写入显示缓冲区write7279(decode1+3,1 & 0x0f); //写入显示缓冲区write7279(decode1+5,1 & 0x0f); //写入显示缓冲区write7279(decode1+6,1 & 0x0f); //写入显示缓冲区write7279(decode1+7,1 & 0x0f); //写入显示缓冲区Timer1_init();//while(1); //程序运行到这行时,停止运行。
单片机实验报告 中断
单片机实验报告中断单片机实验报告:中断引言:单片机是一种集成电路,具有微处理器、存储器和输入输出接口等功能。
在嵌入式系统中,单片机常常被用于控制和管理各种设备。
而中断是单片机中一种重要的机制,它可以在特定条件下打断程序的正常执行,执行一段特定的代码,然后返回到原来的程序中。
本文将介绍中断的概念、分类以及在单片机实验中的应用。
一、中断的概念中断是一种硬件或软件生成的信号,用于打断正在执行的程序。
当中断信号发生时,单片机会立即停止当前的任务,转而执行中断服务程序。
中断可以提高程序的响应速度和效率,使单片机能够及时处理紧急事件。
二、中断的分类中断可以分为外部中断和内部中断两种类型。
1. 外部中断外部中断是由外部设备产生的中断信号。
当外部设备需要单片机的处理时,会发送中断请求信号。
单片机在接收到中断请求后,会立即停止当前任务,转而执行与中断相关的程序。
外部中断常用于处理外部设备的输入信号,如按键、传感器等。
2. 内部中断内部中断是由单片机内部产生的中断信号。
内部中断通常由单片机的一些特定事件触发,如定时器溢出、串口接收完成等。
内部中断常用于周期性的任务处理和数据通信等。
三、中断的实验应用在单片机实验中,中断被广泛应用于各种场景,下面将介绍两个实验应用的例子。
1. 外部中断实验假设我们需要设计一个按键控制LED灯的实验。
当按下按键时,LED灯亮起;当松开按键时,LED灯熄灭。
这个实验可以使用外部中断来实现。
首先,我们需要将按键连接到单片机的外部中断引脚。
当按键按下时,外部中断引脚会产生一个中断请求信号。
单片机接收到中断请求后,会执行相应的中断服务程序。
在中断服务程序中,我们可以控制LED灯的亮灭。
通过这个实验,我们可以学习到如何使用外部中断来处理外部设备的输入信号,并且了解到中断的响应速度和效率优势。
2. 内部中断实验假设我们需要设计一个定时器实验,要求每隔一段时间点亮一次LED灯。
这个实验可以使用内部中断来实现。
实验5 ARM中断编程
实验五 ARM中断编程一、实验目的1.学习键盘驱动原理。
2.掌握中断的使用方法。
二、实验内容通过ARM的外部中断进行键盘的扫描,利用中断服务程序编写键盘的驱动,在超级终端上显示相应的键值。
UART接收中断,以中断方式(而不是查询方式)实现串口数据的接收三、预备知识1.掌握在ADS1.2集成开发环境中编写和调试程序的基本过程。
2.会使用UltraEdit编辑C语言源程序。
3.了解ARM中断服务程序的框架结构。
4.了解编译后的映象文件的下载方法。
四、键盘驱动程序的原理1.简单键盘扫描通常在一个键盘中使用了一个瞬时接触开关,并且用如图1所示的简单电路,微处理器可以容易地检测到闭合。
当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低得到逻辑0。
可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。
尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。
当触点闭合时,其弹起就像一个球。
弹起效果将产生如图2所示的好几个脉冲。
弹起的持续时间通常将维持在5ms~30ms之间。
如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。
然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。
为此我将用到矩阵键盘。
图1 简单键盘电路图2 键盘抖动2. 复杂矩阵键盘扫描键盘上陈列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图3所示的二维矩阵。
当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候)。
一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。
矩阵所需的键的数目显然根据应用程序而不同。
每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。
图3 矩阵键盘键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。
arm中断实验报告
arm中断实验报告
ARM中断实验报告
实验目的:通过ARM中断实验,掌握ARM处理器中断的基本原理和操作方法,了解中断在实际应用中的重要性。
实验内容:本次实验使用ARM处理器搭建实验平台,通过编写程序,模拟外部中断事件,并观察处理器的中断响应过程。
实验步骤:
1. 搭建实验平台:使用ARM处理器搭建实验平台,连接外部中断源,并准备好调试工具。
2. 编写中断处理程序:编写中断处理程序,包括中断服务函数和中断初始化函
数等。
3. 模拟外部中断事件:通过操作外部中断源,模拟外部中断事件的发生。
4. 观察中断响应过程:观察处理器对外部中断事件的响应过程,包括中断请求
的产生、中断服务函数的执行和中断清除等。
实验结果:通过实验观察,我们发现ARM处理器对外部中断事件的响应速度非常快,能够迅速中断当前任务,执行中断服务函数,并在完成中断服务后恢复
原来的任务。
这表明ARM处理器在实际应用中能够有效地处理各种中断事件,保证系统的稳定性和可靠性。
实验结论:本次实验通过ARM中断实验,我们深入了解了ARM处理器中断的
基本原理和操作方法,掌握了中断处理程序的编写和调试技巧,加深了对中断
在实际应用中的重要性的认识。
同时,我们也发现ARM处理器在处理中断事件时表现出色,能够快速、准确地响应各种外部中断事件,确保系统的正常运行。
通过本次实验,我们对ARM中断有了更深入的理解,为今后的嵌入式系统开发和应用奠定了坚实的基础。
【2011.03.21】ARM中断处理流程ARM中断处理分析
【2011.03.21】ARM中断处理流程ARM中断处理分析1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。
每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR (Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。
由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的当中断产生的时候,把CPSR保存在SPSR是自动完成的。
对异常的响应当一个异常出现以后,ARM微处理器会执行以下几步操作:(这些是中断发生时,自动处理的)1、将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。
若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。
例如:在软件中断异常SWI,指令MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
2、将CPSR复制到相应的SPSR中。
3、根据异常类型,强制设置CPSR的运行模式位。
4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。
还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态从异常返回异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:1、将连接寄存器LR的值减去相应的偏移量后送到PC中。
ARM异常及中断处理实验报告
实验报告实验题目ARM异常及中断处理实验姓名:学号:课程名称:所在学院:专业班级:任课教师:实验项目名称ARM异常及中断处理实验一、实验目的与要求:利用 Exynos4412 的 K2、K3这2个I/O引脚的中断模式,当被按下时进入相应的中断处理函数处理相应的事件。
二、实验设备:华清远见试验箱,PC机三、实验方法(原理,流程图)1、电路原理电路原理如图所示,K2、K3 分别与 GPX1_1、GPX1_2 相连,在没有按下按键时 GPX1_1、GPX1_2 引脚上一直处于高电平,当把这两个引脚设为中断模式并为下降沿中断,则按键被按下俩引脚就会有高电平变为低电平,因此,产生 GPIO 中断进入相应的中断函数,处理中段事件,从终端上打印出相应的按键信息。
其中K2 对应的是XEINT9 中断源,K3 对应的是 XEINT10 中断源。
2、编程流程(1)设置 GPX1_2、GPX1_2 两个管脚没有内部上下拉属性,然后配置为中断模式;(2)设置中断触发方式;(3)GPIO 控制器中关闭屏蔽、使能中断;(4)在 GIC 中断控制器中使能中断;(5)设置中断优先级;(6)使能 GIC;(7)选择中断发送给 CPU0;(8)等待中断产生,然后进入中断处理器函数;(9)清楚中断源的挂起状态。
四、实验过程、步骤及内容1、寄存器设置为了实现进入中断目的,需要通过配置 GPX1CON 寄存器将 GPX1_1、GPX1_2 设置为中断模式。
设置中断方式、中断处理函数、使能中断。
2、编写相关代码如下:(1)设置异常向量表:.text.global _start_start:b resetldr pc,_undefined_instructionldr pc,_software_interruptldr pc,_prefetch_abortldr pc,_data_abortldr pc,_not_usedldr pc,_irqldr pc,_fiq_undefined_instruction: .word _undefined_instruction_software_interrupt:.word _software_interrupt_prefetch_abort:.word _prefetch_abort_data_abort:.word _data_abort_not_used:.word _not_used_irq:.word irq_handler_fiq:.word _fiqreset:ldr r0,=0x40008000mcr p15,0,r0,c12,c0,0 @ Vector Base Address Registermrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0 @ Enable svc mode of cpu.text.global _start_start:b resetldr pc,_undefined_instructionldr pc,_software_interruptldr pc,_prefetch_abortldr pc,_data_abortldr pc,_not_usedldr pc,_irqldr pc,_fiq_undefined_instruction: .word _undefined_instruction_software_interrupt:.word _software_interrupt_prefetch_abort:.word _prefetch_abort_data_abort:.word _data_abort_not_used:.word _not_used_irq:.word irq_handler_fiq:.word _fiqreset:ldr r0,=0x40008000mcr p15,0,r0,c12,c0,0 @ Vector Base Address Registermrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0 @ Enable svc mode of cpuinit_stack:ldr r0,stacktop /*get stack top pointer*//********svc mode stack********/mov sp,r0sub r0,#128*4 /*512 byte for irq mode of stack*/ /****irq mode stack**/msr cpsr,#0xd2mov sp,r0sub r0,#128*4 /*512 byte for irq mode of stack*/ /***fiq mode stack***/msr cpsr,#0xd1mov sp,r0sub r0,#0/***abort mode stack***/msr cpsr,#0xd7mov sp,r0sub r0,#0/***undefine mode stack***/msr cpsr,#0xdbmov sp,r0sub r0,#0/*** sys mode and usr mode stack ***/msr cpsr,#0x10mov sp,r0 /*1024 byte for user mode of stack*/b main.align 4/**** swi_interrupt handler ****//**** irq_handler ****/irq_handler:sub lr,lr,#4stmfd sp!,{r0-r12,lr}bl do_irq //跳转到do_irq 处理器函数ldmfd sp!,{r0-r12,pc}^stacktop: .word stack+4*512.datastack: .space 4*512(2)编写中断处理函数,汇编中的处理/**** irq_handler ****/irq_handler:sub lr,lr,#4stmfd sp!,{r0-r12,lr}bl do_irq //跳转到do_irq 处理器函数ldmfd sp!,{r0-r12,pc}^(3)主程序的初始化:int main(void){//LED2 GPX2_7GPX2.GPX2CON |= 0x1 << 28;//LED3 GPX1_0GPX1.GPX1CON |= 0x1;//Led4 GPF3_4GPF3.GPF3CON |= 0x1 << 16;//Key_2 Interrupt GPX1_1GPX1.GPX1PUD = GPX1.GPX1PUD & ~(0x3 << 2); // Disables Pull-up/Pull-downGPX1.GPX1CON = (GPX1.GPX1CON & ~(0xF << 4)) | (0xF << 4); //GPX1_1:WAKEUP_INT1[1](EXT_INT41[1])EXT_INT41_CON = (EXT_INT41_CON & ~(0x7 << 4)) | 0x2 << 4;EXT_INT41_MASK = (EXT_INT41_MASK & ~(0x1 << 1)); // Bit: 1 = Enables interrupt//Key_3 Interrupt GPX1_2GPX1.GPX1PUD = GPX1.GPX1PUD & ~(0x3 << 4); // Disables Pull-up/Pull-downGPX1.GPX1CON = (GPX1.GPX1CON & ~(0xF << 8)) | (0xF << 8); //GPX1_2:WAKEUP_INT1[2] (EXT_INT41[2])EXT_INT41_CON = (EXT_INT41_CON & ~(0x7 << 8)) | 0x2 << 8;EXT_INT41_MASK = (EXT_INT41_MASK & ~(0x1 << 2)); // Bit: 1 = Enables interrupt/** GIC interrupt controller:* */// Enables the corresponding interrupt SPI25, SPI26 -- Key_2, Key_3ICDISER.ICDISER1 |= (0x1 << 25) | (0x1 << 26);CPU0.ICCICR |= 0x1; //Global enable for signaling of interruptsCPU0.ICCPMR = 0xFF; //The priority mask level.Priority filter. thresholdICDDCR = 1; //Bit1: GIC monitors the peripheral interrupt signals and// forwards pending interrupts to the CPU interfaces2ICDIPTR.ICDIPTR14 = 0x01010101; //SPI25 SPI26 interrupts are sent to processor 0printf("\n ********* GIC test ********\n");while (1){GPF3.GPF3DAT |= 0x1 << 4;mydelay_ms(500);GPF3.GPF3DAT &= ~(0x1 << 4);mydelay_ms(500);}return 0;}(4)中断处理函数:void do_irq(void ){int irq_num;irq_num = (CPU0.ICCIAR & 0x3FF);switch (irq_num) {case 58: //turn on LED2; turn off LED3GPX2.GPX2DAT = 0x1 << 7;GPX1.GPX1DAT &= ~0x1;printf("IRQ interrupt !! turn on LED2; turn off LED3\n");//Clear PendEXT_INT41_PEND |= 0x1 << 2;ICDICPR.ICDICPR1 |= 0x1 << 26;break;case 57: //Turn on Led3; Turn off Led2GPX2.GPX2DAT &= ~(0x1 << 7);GPX1.GPX1DAT |= 0x1;printf("IRQ interrupt !! Turn on LED3; Turn off LED2\n");//Clear PendEXT_INT41_PEND |= 0x1 << 1;ICDICPR.ICDICPR1 |= 0x1 << 26;break;}// End of interruptCPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;}(5)时延函数:void mydelay_ms(int ms){int i, j;while(ms--){for (i = 0; i < 5; i++)for (j = 0; j < 514; j++);}3、实验步骤:(1)导入工程源码。
arm外部调试断点指令
ARM外部调试断点指令1. 什么是ARM外部调试断点指令ARM外部调试断点指令是一种用于调试ARM架构处理器的指令。
在软件开发过程中,调试是一个必不可少的环节,而断点是调试过程中常用的技术之一。
断点指令能够在程序执行到指定位置时暂停程序的执行,这样可以方便地进行调试和分析。
在ARM架构中,通常使用调试器来实现调试功能。
调试器可以通过连接到目标系统的调试接口,与系统进行通信,并发送断点指令来控制程序的执行。
ARM外部调试断点指令就是调试器发送给目标系统的指令,用于设置断点和控制程序的执行。
2. ARM外部调试断点指令的种类ARM外部调试断点指令可以分为软件断点和硬件断点两种类型。
2.1 软件断点软件断点是通过在目标程序的指令中插入特殊的指令来实现的。
当程序执行到这个特殊的指令时,会触发断点,程序的执行会被暂停。
软件断点的优点是灵活性高,可以设置在任意指令上,但是由于需要修改目标程序的指令,所以对于只读存储器的目标系统来说,软件断点可能无法使用。
软件断点的实现原理是将目标指令替换为断点指令,当程序执行到这个断点指令时,会触发中断异常,调试器会捕获这个异常并暂停程序的执行。
在ARM架构中,常用的软件断点指令是BKPT指令,它的操作码是0xE1200070。
2.2 硬件断点硬件断点是通过目标系统的调试接口来实现的。
调试接口通常是通过JTAG或SWD接口与目标系统相连,调试器可以通过这个接口来读写目标系统的寄存器,并设置硬件断点。
硬件断点的优点是速度快、精确度高,可以设置多个断点,而且不需要修改目标程序的指令。
硬件断点的实现原理是在目标系统的调试接口中插入断点触发逻辑,当程序执行到设置的断点位置时,会触发调试接口的中断信号,调试器会捕获这个中断信号并暂停程序的执行。
硬件断点的具体实现方式和数量取决于目标系统和调试器的支持情况,常见的硬件断点指令包括BKPT指令、BRK指令等。
3. ARM外部调试断点指令的使用方法ARM外部调试断点指令的使用方法主要包括以下几个步骤:3.1 连接目标系统和调试器首先,需要将调试器通过JTAG或SWD接口连接到目标系统。
arm中断
ARM中断中断向量b HandlerIRQ;handler for IRQ interrupt很自然,因为所有的单片机都是那样,中断向量一般放在开头,用过单片机的人都会很熟悉,那就不多说了。
异常服务程序这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,下面主要分析的是“中断异常”说白了,就是我们平时单片机里面用的中断!!!所有由器件引起的中断,例如TIMER中断,UART中断,外部中断等等,都有一个统一的入口,那就是中断异常IRQ!然后从IRQ的服务函数里面分辨出,当前究竟是什么中断,再跳转到相应的中断服务程序。
这样看来,ARM比单片机要复杂一些了,不过原理是不变的。
上面说的就是思路,跟着这个思路来接着分析。
HandlerIRQ很明显是一个标号,我们找到了HandlerIRQ HANDLER HandleIRQ这里是一个宏定义,我们再找到这个宏,看他是怎么定义的:MACRO$HandlerLabel HANDLER$HandleLabel$HandlerLabelsub sp,sp,#4;decrement sp(to store jump address)stmfd sp!,{r0};PUSH the work register to stack(lr does not push because it return to originaladdress)ldr r0,=$HandleLabel;load the address of HandleXXX to r0ldr r0,[r0];load the contents(service routine start address)of HandleXXXstr r0,[sp,#4];store the contents(ISR)of HandleXXX to stackldmfd sp!,{r0,pc};POP the work register and pc(jump to ISR)MEND用HandlerIRQ将这个宏展开之后得到的结果实际是这样的HandlerIRQsub sp,sp,#4;decrement sp(to store jump address)stmfd sp!,{r0};PUSH the work register to stack(lr does not push because it return to originaladdress)ldr r0,=HandleIRQ;load the address of HandleXXX to r0ldr r0,[r0];load the contents(service routine start address)of HandleXXXstr r0,[sp,#4];store the contents(ISR)of HandleXXX to stackldmfd sp!,{r0,pc};POP the work register and pc(jump to ISR)至于具体的跳转原理下面再说,好了,这样的话就容易看的多了,很明显,HandlerIRQ还是一个标号,IRQ 异常向量就是跳转到这里执行的,这里粗略看一下,应该是保存现场,然后跳转到真正的处理函数,那么很容易发现了这么一句ldr r0,=HandleIRQ,没错,我们又找到了一个标号HandleIRQ,看来真正的处理函数应该是这个HandleIRQ,继续寻找AREA RamData,DATA,READWRITE^_ISR_STARTADDRESS;_ISR_STARTADDRESS=0x33FF_FF00 HandleReset#4HandleUndef#4HandleSWI#4HandlePabort#4HandleDabort#4HandleReserved#4HandleIRQ#4最后我们发现在这里找到了HandleIRQ,^其实就是MAP,这段程序的意思是,从_ISR_STARTADDRESS开始,预留一个变量,每个变量一个标号,预留的空间为4个字节,也就是32BIT,其实这里放的是真正的C写的处理函数的地址,说白了,就是函数指针--这样做的话就很灵活了接着,我们需要安装IRQ处理句柄,说白了,就是设置处理函数的地址,让PC 指针可以正确的跳转。
ARM的中断实验
嵌入式实验报告课程名称嵌入式成绩实验项目ARM的中断实验指导教师曲培树学生姓名张健秀学号 201000803026 班级专业 10电子本实验地点综合楼226 实验日期 2012年 12 月 7日一、实验目的1.掌握ARM9的中断原理,能够对S3C2410的中断资源及其相关中断寄存器的进行合理配置2. 掌握对S3C2410的中断的编程的方法二、实验内容1. 学习响应外部中断请求的配置方法,并通过响应定时器中断,执行中断服务子程序使CPU板上的LED指示灯LED1、LED2闪烁。
三、实验设备1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真调试电缆。
2. PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真调试驱动程序四、ARM的中断原理在ARM中,有两类中断,一类是IRQ,一类是FIQ,IRQ是普通中断,FIQ是快速中断,在进行大批量的复制、数据转移等工作时,常使用此类中断。
FIQ的优先级高于IRQ。
同时,它们都属于ARM的异常模式,当一旦有中断发生,不管是外部中断,还是内部中断,正在执行的程序都会停下,PC指针进而跳入异常向量的地址处,若是IRQ中断,则PC指针跳到0x18处,若是FIQ中断,则跳到0x1C处。
异常向量地址处,一般存有中断服务子程序的地址,所以,接下来PC指针跳入中断服务子程序中。
当完成中断服务子程序后,PC指针会返回到被打断的程序的下一条地址处,继续执行程序。
这就是ARM中断操作的基本原理。
但是,通常由于生产ARM处理器的各厂家都集成了很多中断请求源,比如,串口中断、AD中断、外部中断、定时器中断、DMA中断等等,所以,很多中断可能同时请求中断,因此,为区分它们,更准确的完成任务,这些中断都有相应的优先级别,以及当发生中断时,它们都有相应的中断标志位,通过在发生中断是判断中断优先级,和访问中断标志位的状态来识别到底哪一个中断发生了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五 ARM中断编程
一、实验目的
1.学习键盘驱动原理。
2.掌握中断的使用方法。
二、实验内容
通过ARM的外部中断进行键盘的扫描,利用中断服务程序编写键盘的驱动,在超级终端上显示相应的键值。
UART接收中断,以中断方式(而不是查询方式)实现串口数据的接收
三、预备知识
1.掌握在ADS1.2集成开发环境中编写和调试程序的基本过程。
2.会使用UltraEdit编辑C语言源程序。
3.了解ARM中断服务程序的框架结构。
4.了解编译后的映象文件的下载方法。
四、键盘驱动程序的原理
1.简单键盘扫描
通常在一个键盘中使用了一个瞬时接触开关,并且用如图1所示的简单电路,微处理器可以容易地检测到闭合。
当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低得到逻辑0。
可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。
尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。
当触点闭合时,其弹起就像一个球。
弹起效果将产生如图2所示的好几个脉冲。
弹起的持续时间通常将维持在5ms~30ms之间。
如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。
然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。
为此我将用到矩阵键盘。
图1 简单键盘电路
图2 键盘抖动
2. 复杂矩阵键盘扫描
键盘上陈列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图3所示的二维矩阵。
当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候)。
一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。
矩阵所需的键的数目显然根据应用程序而不同。
每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。
图3 矩阵键盘
键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。
一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。
每个键被分配一个称为扫描码的唯一标识符。
应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。
换句话说,扫描码将告诉应用程序按下哪个键。
五、实验分析
利用外部中断来编写简单按键驱动程序。
图4. 按键中断程序流程图
涉及的主要寄存器如下: 1. I/O 引脚设置寄存器
2. 中断模式寄存器
3.中断屏蔽寄存器
4.SOURCE PENDING REGISTER
5. INTERRUPT PENDING REGISTER
6. 外部中断控制寄存器
7.外部中断屏蔽寄存器
8.EXTERNAL INTERRUPT PENDING REGISTER
对于键盘中断服务程序的编写,在此作简单的说明:
(1) 中断的初始化:I/O设置, 中断寄存器的设置,中断屏蔽寄存器的设置,中断触发电平的设置,中断跳转的设置等
(2) 中断服务程序的编写:按照关中断――>具体中断处理――>清除相应中断标志位――>开中断的流程编写。
(3) 注意按键去抖要加延时。