嵌入式系统实验报告-1-外部中断
- 格式:doc
- 大小:490.50 KB
- 文档页数:13
一、实验目的1. 理解外中断的概念和作用。
2. 掌握外中断的触发方式和处理流程。
3. 通过实验验证外中断在嵌入式系统中的应用。
二、实验环境1. 实验平台:STM32开发板2. 开发环境:Keil uVision53. 代码编写语言:C语言三、实验原理外中断是指当外部信号发生时,CPU暂停当前程序执行,转而执行外中断服务程序。
外中断通常用于处理实时事件,如按键、传感器数据采集等。
外中断分为两个部分:中断触发和中断处理。
1. 中断触发:当外部信号满足一定条件时,触发外中断。
2. 中断处理:CPU响应中断请求,执行中断服务程序,完成相关处理。
四、实验步骤1. 初始化外中断(1)配置GPIO引脚为输入模式,用于接收外部信号。
(2)设置中断触发方式(上升沿、下降沿或双边沿触发)。
(3)使能中断和中断优先级。
2. 编写中断服务程序(1)编写中断服务程序,完成外部事件的处理。
(2)在中断服务程序中,设置标志位或调用其他函数处理事件。
3. 编写主程序(1)初始化硬件设备。
(2)启动外中断。
(3)执行主程序,监控中断事件。
4. 编译、下载程序到开发板(1)使用Keil uVision5编译代码。
(2)使用ST-Link下载程序到开发板。
5. 实验验证(1)通过按键或其他外部信号触发外中断。
(2)观察中断服务程序是否被正确执行,事件是否得到处理。
五、实验结果与分析1. 实验结果在实验过程中,当按下按键时,外中断被触发,中断服务程序被正确执行,事件得到处理。
2. 分析(1)外中断的触发方式设置正确,中断能够及时响应。
(2)中断服务程序编写合理,能够完成事件处理。
(3)主程序能够正常执行,监控中断事件。
六、实验总结1. 通过本次实验,掌握了外中断的概念、触发方式和处理流程。
2. 熟悉了STM32开发板外中断的使用方法。
3. 增强了在实际项目中应用外中断的能力。
七、实验心得1. 外中断在嵌入式系统中具有重要作用,能够提高系统的实时性和可靠性。
一、实验背景随着物联网、智能制造等领域的快速发展,嵌入式系统在各个行业中扮演着越来越重要的角色。
中断技术作为嵌入式系统的重要组成部分,对于提高系统的实时性、可靠性和响应速度具有重要意义。
为了更好地掌握中断技术,我进行了嵌入式中断实验,以下是我对实验的心得体会。
二、实验目的1. 理解中断的概念、作用及中断处理流程;2. 掌握嵌入式系统中断的配置方法;3. 学会编写中断服务程序;4. 通过实验验证中断技术的应用效果。
三、实验内容1. 硬件环境:嵌入式开发板、仿真器、连接线等;2. 软件环境:嵌入式操作系统、集成开发环境、仿真器驱动程序等;3. 实验步骤:(1)搭建实验环境,包括硬件连接和软件配置;(2)配置中断源,如GPIO、定时器等;(3)编写中断服务程序,实现中断响应和处理;(4)通过仿真器观察实验效果,验证中断技术。
四、实验心得1. 理解中断原理在实验过程中,我首先学习了中断的基本概念和作用。
中断是指当外部事件发生时,系统暂停当前执行的任务,转而执行中断服务程序,处理外部事件。
通过实验,我明白了中断处理流程,包括中断请求、中断响应、中断处理和中断返回等环节。
2. 中断配置方法在实验中,我学习了如何配置中断源。
以GPIO为例,首先需要设置GPIO引脚为中断模式,然后配置中断触发方式(上升沿、下降沿或双边沿触发),最后设置中断优先级。
通过实验,我掌握了中断配置方法,为后续应用中断技术打下了基础。
3. 编写中断服务程序中断服务程序是中断处理的核心,我通过实验学会了编写中断服务程序。
在编写过程中,需要注意以下几点:(1)保护现场:在中断服务程序开始执行前,需要保存当前CPU状态,如寄存器值等;(2)处理中断:根据中断类型,执行相应的处理逻辑;(3)恢复现场:在中断服务程序执行完毕后,需要恢复CPU状态,以便继续执行被中断的任务。
4. 实验效果验证通过仿真器观察实验效果,我发现中断技术能够有效地提高系统的响应速度和实时性。
外部中断实验原理一、实验原理外部中断是计算机科学中的一个重要概念,它允许程序在特定的事件发生时被唤醒或中断。
外部中断对于实现实时计算、多任务处理、异常处理等重要功能具有关键作用。
本实验旨在深入理解外部中断的工作原理,并通过实例分析来揭示其实际应用中的关键点。
二、详细内容分析1. 中断触发机制外部中断是由特定事件触发的,例如输入输出操作完成、定时器溢出、硬件错误等。
当中断触发条件满足时,硬件会保存当前程序的状态,并将控制权转移到指定的中断处理程序。
2. 中断优先级当多个中断同时发生时,系统需要根据一定的优先级规则来确定执行哪个中断处理程序。
中断优先级的高低取决于具体应用的需求,通常可以根据重要性和实时性要求来设定。
3. 中断处理程序中断处理程序(Interrupt Service Routine, ISR)是一段特定的代码,用于在发生中断时处理事件并做出响应。
ISR通常包括保存寄存器状态、处理中断事件、恢复寄存器状态以及执行相应的操作等步骤。
4. 中断嵌套与处理器状态在多任务操作系统中,可能存在多个中断同时发生的情况。
此时,系统需要根据优先级逐一处理中断,并保存每个中断处理前的处理器状态,以便在处理完中断后恢复到原来的状态。
5. 中断屏蔽与唤醒某些情况下,系统可能需要暂时屏蔽某些中断,以避免干扰关键任务的执行。
同时,某些中断可能需要唤醒睡眠状态的进程或线程。
这些操作需要通过特定的指令或机制来实现。
三、实例分析以一个简单的例子来说明外部中断的工作流程:假设我们有一个基于Linux 系统的嵌入式系统,当某个硬件设备完成一项任务(如数据传输)时,会触发一个外部中断。
系统会保存当前的任务状态,并执行相应的中断处理程序(ISR)。
ISR会读取硬件设备的数据,并执行相应的操作(如数据处理、任务调度等)。
在ISR执行完毕后,系统会恢复之前保存的任务状态,并继续执行之前的任务。
这个例子中,我们看到了外部中断如何被用于实时处理任务、唤醒睡眠状态的进程以及调度任务等操作。
嵌入式中断按键实验报告本实验的目的是学习如何在嵌入式系统中使用中断来处理按键输入。
通过该实验,我们可以掌握如何配置和使用中断,以及如何编写中断服务程序来处理按键输入。
实验材料:1. 嵌入式开发板2. 按键模块3. 电源适配器实验步骤:1. 将按键模块连接到嵌入式开发板的GPIO引脚上,确保连接正确。
2. 打开开发板的开关,给开发板供电。
3. 在开发板上配置GPIO引脚作为中断输入,并使能中断。
4. 编写中断服务程序来处理按键输入。
当按键被按下时,中断服务程序将被调用,并执行相应的操作。
5. 在主程序中初始化中断服务程序,并进入一个无限循环。
在该循环中,可以进行其他的操作,并等待按键中断的发生。
实验结果:在实验中,我们成功地配置并使用了中断来处理按键输入。
当按键被按下时,中断服务程序被调用,并执行了相应的操作。
讨论与分析:通过该实验,我们学习到了中断的基本原理和使用方法。
中断是一种非常重要的机制,可以使嵌入式系统更高效地响应外部事件。
在实际的嵌入式应用中,按键输入是非常常见的操作,使用中断可以很好地处理按键输入,提高系统的响应速度和可靠性。
然而,中断也存在一些问题。
首先,中断处理需要一定的时间,在高速的系统中,中断的处理时间可能会影响到系统的性能。
另外,当系统存在多个中断源时,中断处理的优先级和调度也需要仔细设计,以确保系统的正常运行。
总结:通过本实验,我们成功地学习了嵌入式系统中使用中断处理按键输入的方法。
中断是一种重要的机制,可以使系统更高效地响应外部事件。
通过合理地设计和使用中断,可以提高系统的性能和可靠性。
在实际的嵌入式应用中,我们应该根据具体的需求和系统条件来选择最合适的中断处理方法,并进行适当的优化和调试。
外部中断实验报告外部中断实验报告引言:外部中断是计算机系统中的一种重要机制,它可以响应外部事件并中断正在执行的程序。
本实验旨在通过设计和实现一个外部中断的示例,加深对外部中断的理解和应用。
实验目的:1. 理解外部中断的概念和原理;2. 掌握外部中断的编程方法;3. 设计和实现一个基于外部中断的应用。
实验设备和材料:1. 一台支持外部中断的计算机;2. 开发板或模块,用于外部中断的触发。
实验过程:1. 硬件连接:将开发板或模块与计算机连接,并确保连接正确和稳定。
2. 编写中断处理函数:在编程环境中,编写一个中断处理函数,用于处理外部中断触发时的操作。
可以根据实际需求,设计适当的处理逻辑。
3. 配置中断触发条件:根据实验要求,配置外部中断触发的条件。
可以通过设置开关、按键或其他外部信号来触发中断。
4. 编写主程序:编写一个主程序,用于初始化外部中断和执行其他操作。
在主程序中,需要配置外部中断的相关寄存器和中断向量表。
5. 运行实验:将程序下载到计算机中,并运行实验。
通过触发外部中断条件,观察中断处理函数的执行情况。
实验结果与分析:在实验中,我们成功实现了一个基于外部中断的应用。
当外部中断触发条件满足时,中断处理函数被调用,并执行相应的操作。
通过实验观察和分析,我们可以得出以下结论:1. 外部中断可以在计算机系统中实现对外部事件的及时响应,提高系统的实时性和可靠性。
2. 外部中断的触发条件可以灵活配置,可以通过外部设备或信号的变化来触发中断。
3. 中断处理函数的执行时间相对较短,可以在不影响主程序正常运行的情况下完成相应的操作。
4. 外部中断的应用范围广泛,可以用于实现各种实时控制、通信和交互功能。
实验总结:通过本次实验,我们深入了解了外部中断的原理和应用,并成功设计和实现了一个基于外部中断的应用。
外部中断作为计算机系统中的重要机制,具有重要的意义和应用价值。
在今后的学习和实践中,我们应进一步探索和应用外部中断,为计算机系统的性能和功能提供更多的可能性。
一、实验目的1. 理解外部中断的概念和作用。
2. 掌握外部中断的编程方法。
3. 熟悉中断处理程序的设计和调试。
二、实验原理外部中断是指由外部设备或信号产生的中断,用于处理与CPU无关的事件。
在微机系统中,外部中断通常用于处理输入/输出设备的中断请求。
外部中断分为可屏蔽中断和不可屏蔽中断两种类型。
三、实验环境1. 开发平台:Keil uVision 52. 微控制器:STM32F103C8T63. 外部设备:按钮、LED灯4. 连接方式:通过GPIO引脚连接四、实验步骤1. 设计外部中断电路(1)将按钮连接到STM32F103C8T6的GPIO引脚,例如PA0引脚。
(2)将LED灯连接到STM32F103C8T6的另一个GPIO引脚,例如PB0引脚。
2. 编写外部中断初始化程序(1)在Keil uVision 5中创建一个新项目,并添加STM32F103C8T6的起始代码。
(2)在主函数中编写初始化程序,包括以下步骤:a. 配置PA0引脚为输入模式,设置为浮空输入。
b. 配置PB0引脚为输出模式,用于控制LED灯。
c. 使能中断,设置中断优先级。
d. 配置NVIC(嵌套向量中断控制器)以允许外部中断。
3. 编写外部中断处理程序(1)在项目中添加一个新的C文件,用于编写外部中断处理程序。
(2)编写外部中断处理函数,当按钮按下时,触发中断,控制LED灯闪烁。
a. 初始化外部中断处理函数,设置中断优先级和中断触发方式。
b. 在外部中断处理函数中,编写LED灯控制代码,实现LED灯闪烁。
4. 编译并下载程序(1)编译项目,生成.hex文件。
(2)将.hex文件下载到STM32F103C8T6开发板上。
5. 测试实验结果(1)将按钮按下,观察LED灯是否闪烁。
(2)松开按钮,LED灯停止闪烁。
五、实验结果与分析1. 实验结果实验过程中,当按钮按下时,LED灯闪烁;松开按钮后,LED灯停止闪烁。
实验结果表明,外部中断能够正确地处理外部设备的中断请求,并控制LED灯的亮灭。
一、实训目的1. 理解单片机外部中断的概念和作用。
2. 掌握单片机外部中断的配置方法。
3. 学会编写外部中断服务程序。
4. 通过实际操作,提高单片机编程和调试能力。
二、实训内容1. 单片机外部中断原理2. 单片机外部中断配置3. 外部中断服务程序编写4. 实验验证与调试三、实训环境1. 单片机开发板:选用STC89C52单片机。
2. 仿真软件:Proteus。
3. 实验工具:示波器、电源、连接线等。
四、实训步骤1. 理解单片机外部中断原理外部中断是单片机中断系统中的一种,用于响应外部事件。
当外部事件发生时,单片机会暂停当前程序,转去执行外部中断服务程序。
外部中断有多个中断源,如INT0、INT1等。
2. 单片机外部中断配置(1)设置外部中断触发方式:根据需要选择上升沿触发、下降沿触发或双边沿触发。
(2)设置外部中断优先级:根据实际需求设置中断优先级。
(3)设置外部中断使能:通过设置IE寄存器使能外部中断。
3. 外部中断服务程序编写编写外部中断服务程序,用于处理外部中断事件。
在服务程序中,完成相关处理逻辑,如记录外部事件发生次数、控制LED灯闪烁等。
4. 实验验证与调试(1)搭建实验电路:将单片机开发板与外部设备(如按钮)连接,设置好外部中断配置。
(2)在Proteus中搭建仿真电路,编写代码。
(3)下载代码到单片机开发板,观察实验现象。
(4)根据实验现象,调试程序,确保外部中断功能正常。
五、实验结果与分析1. 实验现象:按下外部按钮,单片机进入外部中断服务程序,控制LED灯闪烁。
2. 分析:通过设置外部中断触发方式、优先级和使能,成功实现外部中断功能。
在服务程序中,完成相关处理逻辑,达到预期效果。
六、实训总结1. 通过本次实训,掌握了单片机外部中断的配置方法,学会了编写外部中断服务程序。
2. 熟悉了外部中断在实际应用中的重要作用,提高了单片机编程和调试能力。
3. 在实训过程中,遇到了一些问题,如外部中断响应不及时、LED灯闪烁不稳定等。
嵌入式-中断实验
嵌入式中断实验是一种用来测试和学习嵌入式系统中断功能的实验。
中断是嵌入式系统中常用的一种机制,用于处理紧急事件或高优先级任务。
通过中断,系统可以立即响应外部事件,中断当前正在执行的任务,执行与中断事件相关的代码,然后返回到原来的任务中继续执行。
在进行中断实验时,通常需要以下步骤:
1. 确定中断源:确定要模拟的中断事件,比如外部输入的触发事件、定时器到达时间等。
2. 配置中断控制器:根据硬件平台和实验要求,配置中断控制器的相应寄存器,使其能够正确地处理中断信号。
3. 编写中断服务程序(ISR):定义一个中断服务程序,用于
处理中断事件。
ISR应当对事件进行必要的处理,然后返回到
原来的任务中。
4. 测试和调试:连接硬件平台,运行实验程序,并进行测试和调试,确保中断功能正常工作。
5. 扩展和优化:根据需要,可以进一步扩展和优化中断功能,比如增加多个中断源,实现优先级控制,提高系统响应速度等。
通过嵌入式中断实验,可以深入了解中断机制的工作原理和应用方法,提高对嵌入式系统的理解和能力。
嵌入式系统实验报告报告成员:一.外部中断实验1、实验内容或题目设置GPF4引脚为外部中断EINT4功能,下降沿触发模式。
初始化S3C2410A中断控制器,设置EINT4为IRQ中断,并使能中断允许。
初始化完成后,等待外部中断产生。
中断服务程序里负责把LED1控制口输出信号取反,清除中断标志后退出中断。
2、实验目的与要求(1) 掌握S3C2410A处理器外部中断的引脚功能设置;(2)掌握中断初始化以及中断服务函数的编写。
3、实验步骤与源程序(一)、实验步骤(1) 启动ADS 1.2,使用ARM Executable Image for DeviceARM2410工程模板建立一个工程EINT。
(2) 在工程src组中的main.c中编写实验代码。
(3) 选用DebugRel生成目标,然后编译链接工程。
(4) 将MagicARM2410实验箱上的启动方式选择跳线JP8短接,然后按RST键复位系统。
(5) 选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
(6) 在中断服务程序中设置断点,全速运行程序,按下/释放KEY1按键,使EINT4为低/高电平(产生中断)。
(7) 取消中断服务程序中有断点,全速运行程序,按下/释放KEY1按键,观察LED1灯的变化4.观察实验结果(1) 取消中断服务程序中的断点,运行程序,按下/释放KEY1按键,观察LED1灯的变化。
(2)完成实验习题程序。
⑵源代码// 定义LED控制口 (输出高电平时点亮LED)#define LED1_CON (1<<11) /* GPE11口 */#define LED2_CON (1<<12) /* GPE12口 */#define LED3_CON (1<<4) /* GPH4口 */#define LED4_CON (1<<6) /* GPH6口 */#define KEY_CON (1<<4) /* GPF4口 */ //定义独立按键KEY1的输入口uint8 ledcon = 0x00; //定义LED1控制值变量void DelayNS(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}void IRQ_Eint4(void){int i;// 按键去抖动rGPFCON = rGPFCON & (~(0x03<<8)); // 设置为GPIO输入方式for(i=0; i<10000; i++); // 延时去抖动if(rGPFDAT&KEY_CON) // 若是假按键,则直接退出{rGPFCON = rGPFCON | (0x02<<8); // 设置回EINT4中断口// 清除中断标志rEINTPEND = (1<<4);rSRCPND = (1<<4);rINTPND = rINTPND;return;}// 设置回EINT4中断口rGPFCON = rGPFCON | (0x02<<8);// 把LED1控制口输出信号取反if(ledcon){ledcon = 0;rGPEDAT = rGPEDAT & (~LED1_CON) ;}else{ledcon = 1;rGPEDAT = rGPEDAT | LED1_CON;}// 清除中断标志rEINTPEND = (1<<4);rSRCPND = (1<<4);rINTPND = rINTPND;}void EINT_init(void){rGPFCON = (rGPFCON & 0xFFFFFCFF) | (0x02<<8); // 设置GPF4引脚为外部中断EINT4功能rEXTINT0 = (0x2<<16); // 外部中断EINT4设置为下降沿触发VICVectAddr[4] = (uint32) IRQ_Eint4; // 中断向量地址设置rPRIORITY = 0x00000000; // 使用默认的固定的优先级rINTMOD = 0x00000000; // 所有中断均为IRQ中断rINTMSK = ~0x0000010; // 使能EINT4中断rEINTMASK = ~0x0000010;}void LED_DispAllOff(void){rGPEDAT = rGPEDAT & (~(0x03<<11));rGPHDAT = rGPHDAT & (~(0x05<<4));}int main(void){// 初始化I/OrGPECON = (rGPECON & (~(0x0F<<22))) | (0x05<<22); // rGPECON[25:22] = 0101b,设置GPE11、GPE12为GPIO输出模式rGPHCON = (rGPHCON & (~(0x33<<8))) | (0x11<<8); // rGPHCON[13:8] = 01xx01b,设置GPH4、GPH6为GPIO输出模式LED_DispAllOff(); // 熄灭LED1--LED4EINT_init(); // 外部中断初始化IRQEnable(); // 使能IRQ中断 (清零CPSR寄存器的I位)while(1); // 等待外部中断return(0);}4、测试数据与实验结果5、结果分析与实验体会通过这次试验我主要了解到了中断的原理,独立按键KEY1电路使用了GPF4口,设置GP FCON寄存器可以选择GPF4引脚为外部中断EINT4功能,此时通过按下KEY1键即可触发外部中断;对于S3C2410A的众多中断源,通过设置INTMOD寄存器可将它们分为IRQ中断或FI Q中断,一般只设置一个中断源为FIQ中断。
外部中断实验报告外部中断实验报告一、引言外部中断是计算机系统中的一种重要的中断方式,它可以使得计算机在执行某个任务的过程中,根据外部设备的信号来暂停当前任务,转而去处理其他紧急事件。
本实验旨在通过对外部中断的实验,深入了解外部中断的原理和应用。
二、实验目的1. 理解外部中断的概念和原理;2. 学会使用外部中断来处理外部设备的信号;3. 掌握外部中断的编程方法。
三、实验装置和材料1. 计算机硬件平台:使用一台支持外部中断的计算机;2. 软件平台:使用汇编语言进行编程。
四、实验步骤1. 连接外部设备:将外部设备(如键盘、鼠标等)与计算机相连接,确保外部设备可以正常工作;2. 编写中断处理程序:使用汇编语言编写中断处理程序,以响应外部设备的信号;3. 设置中断向量表:将中断处理程序的入口地址存放在中断向量表中,以便系统在接收到外部设备信号时能够正确地跳转到中断处理程序;4. 运行程序并测试:运行程序,触发外部设备的信号,观察中断处理程序是否能够正确执行。
五、实验结果与分析在实验中,我们成功地编写了一个外部中断处理程序,并将其入口地址存放在中断向量表中。
当我们触发外部设备的信号时,系统能够正确地跳转到中断处理程序,并执行相应的操作。
通过这个实验,我们深入了解了外部中断的原理和应用。
六、实验总结通过本次实验,我们对外部中断有了更深入的了解。
外部中断作为计算机系统中的一种重要中断方式,可以使计算机在执行某个任务的过程中,根据外部设备的信号来暂停当前任务,转而去处理其他紧急事件。
在实际应用中,外部中断广泛应用于各种设备的控制和通信系统中,提高了计算机系统的效率和可靠性。
七、实验心得通过本次实验,我深刻认识到了外部中断在计算机系统中的重要性。
在实验中,我不仅学会了编写中断处理程序,还了解了中断向量表的作用。
这次实验让我对计算机系统的工作原理有了更深入的了解,也提高了我的编程能力。
我相信这次实验对我的学习和将来的工作都有很大的帮助。
《嵌入式系统技术》实训报告1、实验目的z了解S3C2440A 外部中断的工作原理。
z掌握S3C2440A 外部中断的使用方法。
2、实验设备z PC 机、Multi-ICE 仿真器、2440A 实验箱。
3、实验内容z通过外部K1、K2、K3、K4、K5、K7 按键触发外部中断E INT1、EINT2、EINT3、EINT4、EINT5、EINT74、实验原理4.1 ARM 的异常中断类型在嵌入式系统中外部设备的功能实现主要是靠中断机制来实现的。
中断功能可以解决CPU 内部运行速度远远快于外部总线速度而产生的等待延时问题。
ARM 提供的FIQ 和IRQ 异常中断用于外部设备向C PU 请求中断服务,一般情况下都是采用I RQ 中断。
七种异常中断中断过程框图4.2 异常中断响应过程和返回过程异常中断的响应过程:1).保存处理器当前状态寄存器C PSR 的值到备份程序状态寄存器S PSR 中。
2).设置但前程序状态寄存器CPSR 的值,其中包括:设置CPSR 响应位的值,使处理器进入特定的处理器模式;按要求屏蔽中断,通常应该屏蔽I RQ 中断。
在F IQ 中断时屏蔽F IQ 中断。
3).设置L r 寄存器。
将相应中断模式的L r 寄存器的值设为异常中断的返回地址。
4).处理程序计数器PC,将PC 值设为相应的中断向量的地址,从而实现跳转以执行中断服务程序。
异常中断的返回当处理器执行完以上流程之后,处理器已经从中断向量进入异常处理的状态。
异常中断处理完毕之后,在异常中断程序的末端,处理器进入异常中断的返回状态,其流程如下:1).恢复状态寄存器。
将保存的备份程序状态寄存器SPSR 值赋给当前程序状态寄存器CPSR。
2).将返回地址赋值到程序计数器(PC)。
这样程序将返回到异常中断产生的下一条指令或出现问题的指令处执行。
需要注意的是:对于不同的异常中断,其返回地址的计算方法也是不同的,IRQ 和F IQ 异常中断产生时,程序计数器PC 已经更新,而SWI 中断和未定义指令中断时由当前指令自身产生的,程序计数器P C 尚未更新,所以要计算出下一条指令的地址来执行返回操作;指令预取指中指异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。
S3C2440A 异常中断的响应-返回流程图:保存状态寄存器CPSR->进入特定模式、屏蔽中断->设置Lr 寄存器->设置程序计数器PC进入中断向量、异常中断的处理程序->恢复状态寄存器->将返回地址复制到程序计数器4.3 异常中断的安装S3C2440A 系统通过异常向量表安装异常中断处理程序。
即将异常向量表指向异常中断处理程序的入口,实现面向异常中断的跳转,异常向量中断的的入口地址是固定的(0x00-0x1C),系统运行到满足异常中断时,系统将自动跳入相应的异常中断向量表中,而在异常向量表中保存的正是利用跳转指令或L DR 指令指向该中断的异常中断处理程序,这就实现了异常中断处理程序的安装。
1).利用跳转指令实现异常中断的安装将BL 指令放置到中断向量表的特定位置,跳转目标地址为中断处理程序的首地址,便可直接实现异常中断的安装。
其优点是BL 指令可以直接保存地址,缺点是BL 的跳转范围只有32MB 的地址空间。
2).利用l dr 指令实现异常中断的安装利用ldr 直接向程序计数器PC 中赋值也可以实现中断处理程序的安装。
先要将异常中断处理程序首地址的绝对地址放在临近的一个存储单元中,然后用ldr 命令将该内存单元中的地址读取到P C 中。
其优点是可调用程序的范围不受限制。
5、S3C2440A的中断控制器SRCPND――源中断指示寄存器SRCPND 寄存器32 位中的每一位对应着一个中断源,每一位被设置为1,则相应的中断源产生中断请求并且等待中断被服务。
因此,这个寄存器表明了哪个中断源在等待中断请求被处理。
注意,SRCPND 寄存器的每一位是由中断源自动设置的,而不管I NTMSK 寄存器中的屏蔽位是否置1。
另外,SRCPND 寄存器不影响中断控制器的优先级逻辑。
在指定中断源的中断服务程序中,SRCPND 寄存器相对应的位必须被清除,这样才可以正确地响应来自同一中断源的中断请求。
如果从ISR 返回而没有清除相应的位,也就是SRCPND 寄存器中的对应的位还是1,那么就会一直响应这个中断请求。
SRCPND 中相应的中断标志位清除的时间依赖于用户的需求,如果想要从同一中断源接收另一次有效的中断请求,你在第一次就应该清除相应的位,并且使能中断。
用户可以通过向S RCPND 寄存器的相应位写“1”,这样可以清除该位。
下表为S RCPND 寄存器的地址和位定义说明INTMOD――中断模式寄存器中断模式寄存器(INTMOD)的32 位中的每一位对应一个中断源,当I NTMOD 的谋一位都设置为1,则ARM 内核将以FIQ 模式响应中断,否则将以IRQ 模式响应中断。
INTMOD 寄存器的定义如下表:INTPND――中断请求寄存器中断请求寄存器32 位中的每一位对应着相应的中断请求,经过优先级逻辑后,INTPND 寄存器只能有一位被设置为1,并且向A RM 产生中断请求。
在I RQ 中断服务子程序,能够读取这个寄存器的值来决定32 个中断源的那一个中断被服务。
同SRCPND 寄存器,在中断服务子程序里,这个寄存器的相应位需要被清除。
我们可以向I NTPND 寄存器写一个数据1,来清除寄存器的指定位。
INTMSK――中断屏蔽寄存器在INTMSK 寄存器中,32 位依次对应着每个中断源,如果指定的位被设为1,ARM 将不响应中断源的中断请求(注意,即使在S RCPND 相应的位被置位1的条件下也不响应)。
如果屏蔽位为0,则中断请求可以被响应。
INTOFFSET――中断偏移寄存器中断偏移寄存器INTOFFSET 中的值显示了I NTPND 寄存器中哪一个I RQ 的中断请求,这个位在清除S RCPND 和I NTPND 后将自动清除。
S3C2440A 子中断列表SUBSRCPND――次级源中断指示寄存器INTSUBMSK――次级中断屏蔽寄存器EINTPND――外部中断判断寄存器EINTPND 用来判断外部的20 个中断源(EINT[23:4]),用户可以通过向E INTPEND 寄存器的相应位写“1”,这样可以清除该位。
EINTMASK――外部中断屏蔽寄存器EXTINTn――外部中断控制寄存器n外部中断控制寄存器可以控制外部中断信号有效方式,外部中断信号有效方式可以设置为电平触发和边沿触发,具体内容见下表。
6、实验电路图7、实验程序7.1 外部中断服务程序/*********** 外部中断服务程序************/ static void __irq Eint1_ISR(void){ClearPending(BIT_EINT1);Uart_Printf("EINT1 is occurred.\n");rGPBDAT ^= 1<<5;}static void __irq Eint2_ISR(void){ClearPending(BIT_EINT2);Uart_Printf("EINT2 is occurred.\n");rGPBDAT ^= 1<<6;}static void __irq Eint3_ISR(void){ClearPending(BIT_EINT3);Uart_Printf("EINT3 is occurred.\n");rGPBDAT ^= 1<<7;}static void __irq Eint4_7_ISR(void){if(rEINTPEND & (1<<4)){Uart_Printf("EINT4 is occurred.\n");rEINTPEND=(1<<4);ClearPending(BIT_EINT4_7);rGPBDAT ^= 1<<8;}else if(rEINTPEND & (1<<5)){Uart_Printf("EINT5 is occurred.\n");rEINTPEND=(1<<5);ClearPending(BIT_EINT4_7);rGPBDAT &= ~(0xf<<5);}else if(rEINTPEND & (1<<7)){Uart_Printf("EINT7 is occurred.\n");rEINTPEND=(1<<7);ClearPending(BIT_EINT4_7);rGPBDAT |= (0xf<<5);}else{Uart_Printf("others ENTs are occurred\n");rEINTPEND=0xffffff;ClearPending(BIT_EINT4_7);}}7.2 中断初始化函数/*********** 外部中断初始化************/void INIT_interrupt(){rGPFCON = (rGPFCON &~((3<<2)|(3<<4)|(3<<6)|(3<<8)|(3<<10)|(3<<14)))|(1<<3)|(1<<5)|(1<<7)|(1<<9)|(1<< 11)|(1<<15); //GPF0/2 = EINT0/2rEXTINT0 = (rEXTINT0 & ~(7<<4))|(0x2<<4); //EINT1=Low level triggered rEXTINT0 = (rEXTINT0 & ~(7<<8))|(0x2<<8); //EINT2=falling edge triggered rEXTINT0 = (rEXTINT0 & ~(7<<12))|(0x2<<12); //EINT3=falling edge triggeredrEXTINT0 = (rEXTINT0 & ~(7<<16))|(0x2<<16); //EINT4=falling edge triggeredrEXTINT0 = (rEXTINT0 & ~(7<<20))|(0x2<<20); //EINT5=falling edge triggeredrEXTINT0 = (rEXTINT0 & ~(7<<28))|(0x2<<28); //EINT7=falling edge triggeredpISR_EINT1=(U32)Eint1_ISR;pISR_EINT2=(U32)Eint2_ISR;pISR_EINT3=(U32)Eint3_ISR;pISR_EINT4_7=(U32)Eint4_7_ISR;rEINTPEND = 0xffffff;rSRCPND |= BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT4_7; //to clear the previous pending statesrINTPND |= BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT4_7;rEINTMASK=~( (1<<4)|(1<<5)|(1<<7) );rINTMSK=~(BIT_EINT1|BIT_EINT2|BIT_EINT3|BIT_EINT4_7);}7.3 中断主程序/*********** 主程序************/void xmain(void){ChangeClockDivider(3,1);ChangeMPllValue(127,2,1); //405MHZ//Rtc_Init(); //实时时钟初始化Isr_Init();Uart_Init(0, 115200);Uart_Select(0);rGPBCON=(rGPBCON & ~(0xFF<<10)) | (0x55<<10);//GPB5-8 set outputrGPBUP |= (0xFF<<5); //disable GPB pull upINIT_interrupt();while(1); //死循环,等待中断}8、实验步骤1. 重起2440 实验箱,实验箱会执行f lash 中的B IOS 程序,打开d nw.exe 超级终端。