嵌入式系统实训报告-外部中断

合集下载

外部中断计数实验报告

外部中断计数实验报告

一、实验目的1. 理解单片机外部中断的工作原理和触发条件。

2. 掌握如何通过外部中断实现计数功能。

3. 学习中断服务程序的设计方法。

4. 提高单片机编程和调试能力。

二、实验环境1. 单片机:80C512. 开发工具:Keil uVision3. 实验电路:按键、LED灯、单片机及其相关外围电路三、实验原理外部中断是指单片机通过外部引脚接收到的中断信号,使得CPU暂停当前程序,转而执行中断服务程序。

本实验通过外部中断实现计数功能,具体原理如下:1. 将单片机的某个外部引脚(如P3.2)设置为外部中断0(INT0)的触发引脚。

2. 在外部中断0的中断服务程序中,设置一个计数变量,每次中断发生时,计数变量加1。

3. 将计数变量的值通过LED灯显示出来,以观察计数过程。

四、实验步骤1. 创建Keil uVision项目,并添加80C51固件库。

2. 编写C语言程序,实现以下功能:- 初始化外部中断0,设置中断触发方式为下降沿触发。

- 初始化定时器,用于产生中断。

- 编写外部中断0的中断服务程序,实现计数功能。

- 编写主函数,用于设置单片机的工作状态和显示计数结果。

3. 编译并下载程序到单片机。

4. 连接实验电路,包括按键、LED灯和单片机及其相关外围电路。

5. 观察实验现象,验证计数功能是否实现。

五、实验结果与分析1. 实验现象:按下按键,LED灯显示的计数值加1。

2. 分析:- 外部中断0的中断服务程序被正确调用。

- 计数变量在每次中断发生时加1。

- LED灯能够正确显示计数结果。

六、实验总结1. 本实验成功实现了通过外部中断实现计数功能,验证了单片机外部中断的工作原理。

2. 通过编写中断服务程序,掌握了中断编程方法。

3. 实验过程中,遇到了一些问题,如中断服务程序编写错误、程序编译错误等,通过查阅资料和调试,最终解决了问题。

4. 通过本次实验,提高了单片机编程和调试能力,加深了对单片机外部中断的理解。

嵌入式中断实验报告心得

嵌入式中断实验报告心得

一、实验背景随着物联网、智能制造等领域的快速发展,嵌入式系统在各个行业中扮演着越来越重要的角色。

中断技术作为嵌入式系统的重要组成部分,对于提高系统的实时性、可靠性和响应速度具有重要意义。

为了更好地掌握中断技术,我进行了嵌入式中断实验,以下是我对实验的心得体会。

二、实验目的1. 理解中断的概念、作用及中断处理流程;2. 掌握嵌入式系统中断的配置方法;3. 学会编写中断服务程序;4. 通过实验验证中断技术的应用效果。

三、实验内容1. 硬件环境:嵌入式开发板、仿真器、连接线等;2. 软件环境:嵌入式操作系统、集成开发环境、仿真器驱动程序等;3. 实验步骤:(1)搭建实验环境,包括硬件连接和软件配置;(2)配置中断源,如GPIO、定时器等;(3)编写中断服务程序,实现中断响应和处理;(4)通过仿真器观察实验效果,验证中断技术。

四、实验心得1. 理解中断原理在实验过程中,我首先学习了中断的基本概念和作用。

中断是指当外部事件发生时,系统暂停当前执行的任务,转而执行中断服务程序,处理外部事件。

通过实验,我明白了中断处理流程,包括中断请求、中断响应、中断处理和中断返回等环节。

2. 中断配置方法在实验中,我学习了如何配置中断源。

以GPIO为例,首先需要设置GPIO引脚为中断模式,然后配置中断触发方式(上升沿、下降沿或双边沿触发),最后设置中断优先级。

通过实验,我掌握了中断配置方法,为后续应用中断技术打下了基础。

3. 编写中断服务程序中断服务程序是中断处理的核心,我通过实验学会了编写中断服务程序。

在编写过程中,需要注意以下几点:(1)保护现场:在中断服务程序开始执行前,需要保存当前CPU状态,如寄存器值等;(2)处理中断:根据中断类型,执行相应的处理逻辑;(3)恢复现场:在中断服务程序执行完毕后,需要恢复CPU状态,以便继续执行被中断的任务。

4. 实验效果验证通过仿真器观察实验效果,我发现中断技术能够有效地提高系统的响应速度和实时性。

嵌入式技术及应用实验中断实验报告

嵌入式技术及应用实验中断实验报告

实验步骤与结果分析1、建立工程1)、在工程文件中包含如下文件(int、doc、user、lib、start)2)、选择STM32F103VB芯片3)、分别添加如下文件2、运行过程(1) 使用Keil uVision3 通过ULINK仿真器连接EduKit-M3实验平台,打开实验例程NVIC_test子目录下的NVIC.Uv2例程,编译链接工程;(2) 点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接EduKit-M3实验平台并下载调试代码到目标系统的RAM中;(3) 程序正常启动运行后,会有以下结果:当第一次发生EXTI9 中断后(按下EduKit-M3实验平台上Key按钮),SysTick 中断的优先级比EXTI0中断优先级高。

因此当EXTI0中断发生时(按下Wakeup按钮),将先执行主要程序代码分析/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);主从优先级的选择Group_1,有先占优先级1位,从优先级3位//配置一个比特为抢占优先级/* Enable the EXTI0 Interrupt */ //使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;主优先级的选择PreemptionPriorityValueNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级等于0.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable the EXTI9_5 Interrupt */ //使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Configure the SysTick Handler Priority: Preemption priority and sub priority */ //配置SysTick处理程序优先级:抢占优先级和子优先级NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, !PreemptionPriorityValue, 0);while (1){if(PreemptionOccured != FALSE)//当PreemptionOccured != FALSE)抢占发生{GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));Delay(0x5FFFF);}}void GPIO_Configuration(void){/* Configure PC6, PC7, PC8 and PC9 as output push-pull */ 使能为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //使能其速度为50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //使能为推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);/* Configure GPIOA Pin0 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure GPIOB Pin9 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为推挽输出入GPIO_Init(GPIOB, &GPIO_InitStructure);}GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);/* Configure EXTI Line0 to generate an interrupt on falling edge */ 配置EXTI Line0产生一个中断在下降沿EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);(写不完时,可调整表结构。

外部中断源实验报告(3篇)

外部中断源实验报告(3篇)

第1篇一、实验目的1. 理解外部中断的概念和工作原理。

2. 掌握STM32微控制器外部中断的配置和使用方法。

3. 通过实验验证外部中断在嵌入式系统中的应用。

二、实验环境1. 开发板:STM32F103C8T62. 编程软件:Keil uVision3. 仿真软件:Proteus4. 实验设备:按键、LED灯三、实验原理外部中断是指当微控制器外部电路发生特定事件时,可以引起微控制器中断,从而暂停当前程序的执行,转而执行中断服务程序(ISR)。

STM32微控制器的外部中断通常由GPIO引脚的电平变化触发。

四、实验步骤1. 硬件连接- 将按键的一端连接到STM32的GPIO引脚(如PA0),另一端连接到地(GND)。

- 将LED灯的一端连接到STM32的另一个GPIO引脚(如PC13),另一端连接到VCC。

2. 软件设计- 使用Keil uVision编写程序,配置外部中断。

- 配置GPIO引脚为输入模式,并设置中断触发方式为上升沿触发。

- 配置NVIC(嵌套向量中断控制器)中断优先级。

- 编写中断服务程序(ISR),实现LED灯的闪烁。

3. 程序代码```cinclude "stm32f10x.h"void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 清除中断标志位EXTI_ClearITPendingBit(EXTI_Line0);// 切换LED灯状态GPIO_ToggleBits(GPIOC, GPIO_Pin_13);}}int main(void) {// 初始化系统时钟SystemClock_Config();// 配置GPIOGPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);// 配置外部中断EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 配置NVICNVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 主循环while (1) {// 等待外部中断发生}}```4. 仿真验证- 使用Proteus仿真软件搭建电路,并加载上述程序。

外部中断实验报告

外部中断实验报告

外部中断实验报告外部中断实验报告引言:外部中断是计算机系统中的一种重要机制,它可以响应外部事件并中断正在执行的程序。

本实验旨在通过设计和实现一个外部中断的示例,加深对外部中断的理解和应用。

实验目的: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灯闪烁不稳定等。

《嵌入式系统原理与应用》实验报告04-外部中断实验

《嵌入式系统原理与应用》实验报告04-外部中断实验
EXTINT=0x0F;//中断位清零
VICVectAddr=0x00;
}
void EINT3_init(void)//中断的初始化
{
PINSEL1=(PINSEL1 & 0xFFFFCFF)|0x300;
EXTMODE=EXPOLAR & 0x0E;
IO0CLR=0x01;
IO0DIR=0x01;//p0.1设为输出
while(1);
}
五、分析与讨论
六、教师评语
签名:
日期:
成绩
3. 熟悉LPC2000 系列ARM7 微控制器的GPIO控制。
二、实验设备(环境)及要求
硬件:PC机;
软件:PC机操作系统windows XP,ADS1.2集成开发环境,Proteus软件。
三、实验内容与步骤
实验内容:
设置P0.20脚为EINT3功能,初始化为向量中断,并设置为下降沿触发模式,然后等待外部中断。中断服务程序将LED灯控制输出信号取反,然后清除中断标志并退出中断。
《嵌入式系统原理与应用》实验报告
实验序号:4实验项目名称:外部中断实验
学 号
1207012117
姓 名
黄明
专业、班
1
实验地点
实验楼1#318
指导教师
黄鹏程
实验时间
4-28
一、实验目的
1. 掌握LPC2200 专用工程模板的使用;
2.熟悉LPC2000 系列ARM7 微控制器的VIC和外部中断的使用;
实验步骤:
四、实验结果与数据处理
源程序:
#include "config.h"
int i; /*全局变量*/
void __irq EINT3_ISR(void)//中断服务函数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《嵌入式系统技术》实训报告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 中断主程序/*********** 主程序************/{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 超级终端。

相关文档
最新文档