嵌入式-中断实验

合集下载

嵌入式中断实验报告心得

嵌入式中断实验报告心得

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

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

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

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

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

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

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

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

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

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

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

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

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

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

嵌入式- 按键中断实验

嵌入式- 按键中断实验

按键中断实验实验目的:1掌握IO口的使用2掌握中断处理程序编写3掌握按键中断的使用实验器材:Sinosys-EA2440实验箱PC机实验原理:在SinoSys-EA2440a中,已经将EINT0、EINT2、EINT19、EINT11作为外部中断源和开发板上位号为SW1、SW2、SW3、SW4的这四个小按键相连,中断按钮的连接图如图1.1:1.1中断按钮结构电路在SinoSys-EA2440a 中,已将EINT0、EINT2、EINT19、EINT11 作为外部中断源和开发板上位号为SW1、SW2、SW3、SW4 的这四个小按键相连,其中,EINT0、EINT2、EINT11、EINT19 分别和GPF0、GPF2、GPG3、GPG11 复用,当GPFCON[5:4]=10、GPFCON[1:0]=10、GPGCON[7:6]=10、GPGCON[23:22]=10 时,I/O 为中断方式。

通过寄存器的控制,可以达到开启中断和控制中断的目的。

实验总结:将4个按键端口设置成EINT0、EINT2、EINT11、EINT19模式。

rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ;rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ;通过EXTINT寄存器对外部中断触发方式进行设置,这里设置下降沿触发。

rEXTINT0 &= ~(6|(6<<8));rEXTINT0 |= (0|(0<<8));// EINT0、EINT2rEXTINT1 &= ~(7<<12);rEXTINT1 |= (0<<12); // EINT11rEXTINT2 &= ~(0xf<<12);rEXTINT2 |= (0<<12); // EINT19对外部中断挂起寄存器清零,对外部中断屏蔽寄存器时能,同时设置中断服务程序的地址,将中断挂起寄存器清零,开启中断。

嵌入式系统实验2中断实验

嵌入式系统实验2中断实验

中南大学嵌入式系统实验(二)中断实验学院:**************专业班级:*********姓名:*************学号:*************中断实验一.实验目的1.熟悉arm开发板中断原理。

并产生中断。

2.了解快速中断和普通中断。

编写嵌套中断实验。

二.实验器材PC机一台,周立功开发板一块三.实验原理EasyARM2103开发板提供了4个绿色发光二极管用作显示,电路如图1.1所示。

显示电路采用了灌电流的方式来驱动发光二极管,由于微控制器LPC2103 I/O口提供的灌电流大于其拉电流,采用此驱动方式可以保证二极管发光的亮度。

1.1Led电路原理四. 实验原理ARM体系的CPU有7种工作模式,可以通过软件来进行模式切换,或者发生各类中断、异常进行相应模式。

CPU可以识别两种类型中断,正常中断(IRQ)和快速响应中断(FIQ)状态寄存器的PSR中F和R位决定是中断的启闭。

为了使能中断,必须将PSR中F或R位清零,并且中断屏蔽寄存器相应位也要清零。

ARM中断分为子中断源和一般中断源,子中断源多了两个寄存器SUBRCPN(标识子中断源是否发生)INTSUBMSK(屏蔽子中断源)。

ARM中断发生过程如下:1.如果为子中断源,则SUBSRCPND寄存器相应位置1,然后根据子中断源屏蔽寄存器(INTSUBMSK)的设置来判断该中断是否被屏蔽,如未屏蔽,则在SRCPND寄存器相应位置1。

2.如果为非子中断则直接在SRCPND寄存器相应位置1。

3.如果INTMOD寄存器中该中断被设置为FIQ快速中断(相应位置1),即该中断立即执行。

如不是,则判断INTMSK寄存器中该中断是否被屏蔽,如未屏蔽,则进入中断优先仲裁器进行中断优先设置(PRIORITY寄存器)经过中断优先仲裁后,最高优先级的中断在INTPND寄存器中相应位置1(同一时间,此寄存器只有一位置1),INTOFFSET寄存器值用来表示INTPND寄存器置1位(即INTPND 寄存器中位[x]为1时,INTOFFSET寄存器值为x,可以用它确定是什么中断。

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

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

实验步骤与结果分析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);(写不完时,可调整表结构。

嵌入式-中断实验

嵌入式-中断实验

嵌入式-中断实验
嵌入式中断实验是一种用来测试和学习嵌入式系统中断功能的实验。

中断是嵌入式系统中常用的一种机制,用于处理紧急事件或高优先级任务。

通过中断,系统可以立即响应外部事件,中断当前正在执行的任务,执行与中断事件相关的代码,然后返回到原来的任务中继续执行。

在进行中断实验时,通常需要以下步骤:
1. 确定中断源:确定要模拟的中断事件,比如外部输入的触发事件、定时器到达时间等。

2. 配置中断控制器:根据硬件平台和实验要求,配置中断控制器的相应寄存器,使其能够正确地处理中断信号。

3. 编写中断服务程序(ISR):定义一个中断服务程序,用于
处理中断事件。

ISR应当对事件进行必要的处理,然后返回到
原来的任务中。

4. 测试和调试:连接硬件平台,运行实验程序,并进行测试和调试,确保中断功能正常工作。

5. 扩展和优化:根据需要,可以进一步扩展和优化中断功能,比如增加多个中断源,实现优先级控制,提高系统响应速度等。

通过嵌入式中断实验,可以深入了解中断机制的工作原理和应用方法,提高对嵌入式系统的理解和能力。

嵌入式实验4(中断处理程序设计)

嵌入式实验4(中断处理程序设计)

北华航天工业学院《嵌入式系统基础》课程实验报告实验名称编号:实验4 中断处理程序设计作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术作者所在班级:B09513作者学号:20094051329作者姓名:康建云教师姓名:李建义一、实验内容1.本实验涵盖实验手册《ARM嵌入式系统设计及接口编程实验教程》中的实验9 中断处理程序设计。

2.修改程序,使得当四个中断源中断时分别调用实验二跑马灯实验的实验内容第二项中编写的一个函数,即不同中断将控制四个跑马灯的闪烁顺序。

二、实验要求1.了解ARM处理器中断处理过程。

2.掌握S3C2440下进行中断编程的方法,包括中断设置、中断服务子程序的编写。

3.理解实验手册中的实验9的实验程序。

4.编程实现实验内容中第2项任务。

5.撰写实验报告描述实现上述个要求的情况。

三、实验思路在SinoSys-M3中,已经将EINT0、EINT1、EINT2、EINT19、EINT11作为外部中断源和开发板上位号为SW1、SW2、SW3、SW4的这四个小按键相连。

在实验的过程中,在运行之后,按下开关板上这四个按钮,将触发处理器的四个外部中断,处理器转而去执行相应的中断服务程序,在中断服务程序中,向串口打印中断信息,并输出到开发主机的串口终端工具上。

因为key=1、key=3、key=5、key=7分别对应SW1、SW2、SW3、SW4四个按钮。

所以改程序时只需控制key值在不同值下的灯亮情况即可,修改程序实现跑马灯不同亮的次序并循环五次,所修改的程序如下:四、实验程序static void __irq Key_ISR(void){ int i; U8 key;if(rINTPND==BIT_EINT8_23) {ClearPending(BIT_EINT8_23);if(rEINTPEND&(1<<11)){ Uart_Printf("eint11\n");rEINTPEND |= 1<< 11; }if(rEINTPEND&(1<<19)) {Uart_Printf("eint19\n"); rEINTPEND |= 1<< 19; }}if(rINTPND==BIT_EINT0){//Uart_Printf("eint0\n");ClearPending(BIT_EINT0); } if(rINTPND==BIT_EINT2) {Uart_Printf("eint2\n");ClearPending(BIT_EINT2); }key=Key_Scan();if(key==1)//从左到右依次亮{ for(i=0;i<5;i++){ rGPFDAT=rGPFD AT&0x0F|0xE0;Delay(1000);rGPFDAT=rGPFDAT&0x0F|0xD0;Delay(1000);rGPFDAT=rGPFDAT&0x0F|0xB0;Delay(1000);rGPFDAT=rGPFDAT&0x0F|0x70;Delay(2000); }}if(key==3) //从右到左依次亮{ for(i=0;i<5;i++){ rGPFDAT=rGPFD AT&0x0F|0x70; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0xB0; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0xD0;Delay(1000);rGPFDAT=rGPFDAT&0x0F|0xE0;Delay(2000); }}if(key==5) //从左边两个到右边两个到两边的两个到中间两个依次亮{ for(i=0;i<5;i++){ rGPFDAT=rGPFD AT&0x0F|0xC0; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0x30; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0x90; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0x60; Delay(2000); }}if(key==7) //从中间两个到两边两个到右边的两个到左边两个依次亮{ for(i=0;i<5;i++){rGPFDAT=rGPFDAT&0x0F|0x60; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0x90; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0x30; Delay(1000);rGPFDAT=rGPFDAT&0x0F|0xC0; Delay(2000); }}五、实验结果及实验问题分析1.实验结果更改代码后,分别按下sw1、sw2、sw3、sw4按钮,主函数调用keyscan.c文件,继而调用中断服务子程序,根据相应key==1、key==3、key==5、key==7,按实验要求分别实现了使四个灯的闪烁顺序依次为左1灯亮→左2灯亮-→左3灯亮-→左4个灯亮-→四个灯全灭的中断控制;左4灯亮→左3灯亮-→左2灯亮-→左1个灯亮-→四个灯全灭;左1、2灯亮→左3、4个灯亮-→两边两个灯亮-→中间两灯亮-→四个灯全灭;左3、4灯亮-→左1、2个灯亮-→中间两个灯亮-→两边两个灯亮-→四个灯全灭。

嵌入式中断实验

嵌入式中断实验

实验2.3 外部中断实验一、实验目的如何捕获一个外部中断和 CC2530 捕获外部中断后的处理流程。

在 EBDCC2530 节点板上运行外部中断程序。

二、实验环境硬件:PC 机,EBDCC2530 节点板,USB 接口仿真器。

软件:Windows98/2000/NT/XP,IAR 集成开发环境。

三、实验原理EBDCC2530 节点板上有两个按键:按键 S1、按键 S2。

我们通过查看电路图可以得知,选通按键 S1 的按键是 P2.0,选通按键 S2 的按键式P0.6。

我们以 S2 所对应的 P0.6 引脚所用到的控制寄存器为例,仔细说明控制寄存器中每一位所代表的意义。

其他控制寄存器所代表的意义请查看 CC2530 数据手册。

P0IEN:各个控制口的中断使能,0 为中断禁止,1 为中断使能。

D7 D6 D5 D4 D3 D2 D1 D0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0P0INP:设置各个 I/O 口的输入模式,0 为上拉/下拉,1 为三态模式。

D7 D6 D5 D4 D3 D2 D1 D0P0.7模式 P0.6模式P0.5模式P0.4模式P0.3模式P0.2模式P0.1模式P0.0模式PICTL:D0~D3 设置各个端口的中断触发方式,0 为上升沿触发,1 为下降沿触发。

D7 控制 I/O引脚在输出模式下的驱动能力。

选择输出驱动能力增强来补偿引脚 DVDD 的低 I/O 电压,确保在较低的电压下的驱动能力和较高电压下相同。

0 为最小驱动能力增强。

1 为最大驱动能力增强。

D7 D6 D5 D4 D3 D2 D1 D0I/O 驱动能力未用未用未用 P2_0~P2_4P1_4~P1_7P1_0~P1_3P0_0~P0_7IEN1:中断使能 1,0 为中断禁止,1 为中断使能。

D7 D6 D5 D4 D3 D2 D1 D0未用未用端口0 定时器4 定时器3定时器2定时器1DMA传输P0IFG :中断状态标志寄存器,当输入端口有中断请求时,相应的标志位将置 1。

嵌入式- 定时器中断实验

嵌入式- 定时器中断实验

定时器中断实验实验目的:1掌握IO口的使用2掌握中断处理程序编写3掌握定时器的使用实验器材:Sinosys-EA2440实验箱PC机实验原理:S3C2440A 有5 个16 位定时器。

其中定时器0、1、2 和3 具有脉宽调制(PWM)功能。

定时器4 是一个无输出引脚的内部定时器。

定时器0还包含用于大电流驱动的死区发生器。

定时器0 和1 共用一个8位预分频器,定时器2、3 和4 共用另外的8 位预分频器。

每个定时器都有一个可以生成5 种不同分频信号(1/2,1/4,1/8,1/16 和TCLK)的时钟分频器。

每个定时器模块从相应8 位预分频器得到时钟的时钟分频器中得到其自己的时钟信号。

8 位预分频器是可编程的,并且按存储在TCFG0 和TCFG1 寄存器中的加载值来分频PCLK。

定时计数缓冲寄存器(TCNTBn)包含了一个当使能了定时器时的被加载到递减计数器中的初始值。

定时比较缓冲寄存器(TCMPBn)包含了一个被加载到比较寄存器中的与递减计数器相比较的初始值。

这种TCNTBn 和TCMPBn 的双缓冲特征保证了改变频率和占空比时定时器产生稳定的输出。

每个定时器有它自己的由定时器时钟驱动的16 位递减计数器。

当递减计数器到达零时,产生定时器中断请求通知CPU 定时器操作已经完成。

当定时器计数器到达零时,相应的TCNTBn 的值将自动被加载到递减计数器以继续下一次操作。

然而,如果定时器停止了,例如,在定时器运行模式期间清除TCONn 的定时器使能位,TCNTBn 的值将不会被重新加载到计数器中。

TCMPBn 的值是用于脉宽调制(PWM)。

当递减计数器的值与定时器控制逻辑中的比较寄存器的值相匹配时定时器控制逻辑改变输出电平。

因此,比较寄存器决定PWM 输出的开启时间(或关闭时间)。

如图1.1:1.1定时器结构图实验总结:打开Timer.c文件,可以看到,在Test_TimerInt 子函数中首先打开定时器中断,此函数由main主函数所调用。

嵌入式-中断实验

嵌入式-中断实验

嵌入式-中断实验本次实验是一项关于嵌入式系统中断的实验,通过本次实验,我们可以深入了解中断的概念和实现原理,并通过程序代码实现中断的应用。

一、实验原理在嵌入式系统中,中断是一种非常重要的机制,它能够使CPU在执行程序的同时,及时响应外部的事件,例如外部设备的数据传输、计时器的溢出等,从而保证系统的稳定和高效运行。

中断的实现原理是通过CPU计时器实现的,当计时器的值达到某个设定值时,就会发出中断信号,将CPU的执行过程中断,跳转到中断处理程序中,处理完中断事件后,再回到原来的程序中断处继续执行。

二、实验器材1. STC89C52单片机开发板2. LED灯一盏3. 电路连线三、实验步骤1. 首先,在开发板上连接好电路,将LED连接到P1口第0个引脚上,然后在开发环境中编写程序代码。

2. 在程序代码中先设置定时器的计数值,例如本次实验设置为65535。

然后开启定时器中断功能,使CPU在执行程序的同时能够及时响应中断事件,并在中断发生时跳转到中断处理程序中执行。

3. 在中断处理程序中将LED灯的状态进行反转,即每次中断事件发生时,将LED灯的状态从亮转为灭,或从灭转为亮。

4. 在主程序中重复执行LED灯的闪烁操作,从而能够观察到中断事件对LED灯亮灭状态的影响。

四、实验代码#include<reg52.h>unsigned char T0RH=0xff; //定时器高八位unsigned char T0RL=0xff; //定时器低八位void InitTimer0() //初始化定时器0{TMOD &= 0xf0; //清零T0控制位TMOD |= 0x01; //设置T0为模式1TH0 = T0RH; //设置定时器0高八位初值TL0 = T0RL; //设置定时器0低八位初值TR0 = 1; //启动定时器0ET0 = 1; //允许定时器0中断EA = 1; //开放总中断允许}五、实验效果经过以上步骤,就可以实现中断模式下的LED灯闪烁效果,每次定时器中断事件发生时,LED灯的亮灭状态会发生变化。

中断嵌套实验

中断嵌套实验

实验四--中断嵌套实验一、实验要求本实验中使用了一个外部中断和定时器中断,通过p1口连接的8个发光二极管显示中断的作用。

外部中断未发生时,即引脚INTO的按键开关没有按下时,系统通过定时器定时中断的方法,使LED为流水灯操作;当有外部中断产生,即INTO脚的按键开关按下,外部中断INTO打断定时器定时中断,从而控制8个LED闪烁。

当按键开关松开,继续流水灯的操作。

本实验体现了外部中断对定时器的中断嵌套。

二、实验目的了解中断嵌套及中断优先级的概念,掌握同时使用定时器中断与外部中断的编程方法。

三、实验内容1.选择实验所需元器件,按实验图连接电路。

2.用计算机编写代码,并汇编、调试。

3.将程序下载到单片机中,观察现象。

4.如果不符合预期要求则修改程序。

源代码:ORG 0000HAJMP MAINORG 0003HAJMP INTR0ORG 0100H MAIN:MOV P1,#0FEHMOV A,P1X1:RL AMOV P1,AMOV TMOD,#01HCLR TF0SETB TR0 LOOP:MOV TH0,#0F1HMOV TL0,#0CH LOOP1:JNB TF0,LOOP1CLR TF0JB P3.2,X1SETB EASETB EX0CLR IT0SJMP $INTR0:MOV TMOD,#01H CLR TF0SETB TR0LOOP2:MOV P1,#00HMOV TH0,#0F1HMOV TL0,#0CH LOOP3:JNB TF0,LOOP3CLR TF0MOV P1,#0FFHJNB P3.2,LOOP2MOV P1,#0FEHMOV A,P1X2:RL AMOV P1,AMOV TMOD,#01HCLR TF0SETB TR0MOV TH0,#0F1HMOV TL0,#0CH LOOP5:JNB TF0,LOOP5CLR TF0JB P3.2,X2RETI。

中断嵌套的实验报告

中断嵌套的实验报告

一、实验目的1. 理解中断嵌套的概念和原理。

2. 掌握51单片机中断嵌套的实现方法。

3. 熟悉中断优先级设置和中断屏蔽位的控制。

4. 通过实验加深对中断嵌套在实际应用中的理解。

二、实验原理中断嵌套是指在中断服务程序(ISR)执行过程中,允许更高优先级的中断打断当前正在执行的中断服务程序,从而提高系统的灵活性和响应速度。

在51单片机中,中断嵌套的实现依赖于中断优先级的设置和中断屏蔽位的控制。

三、实验器材1. 51单片机开发板2. Keil uVision4集成开发环境3. Proteus仿真软件4. LED灯8个5. 连接线若干四、实验步骤1. 搭建电路:根据实验要求,连接51单片机、LED灯和相应的引脚。

2. 编写程序:a. 初始化51单片机系统,包括设置中断优先级和中断屏蔽位。

b. 编写两个中断服务程序,分别对应两个不同的中断源。

c. 在主函数中设置中断触发条件,例如检测按钮按下。

3. 仿真测试:a. 使用Proteus仿真软件进行仿真测试。

b. 观察LED灯的响应情况,验证中断嵌套是否成功实现。

五、实验结果与分析1. 实验结果:a. 当按钮按下时,高优先级中断服务程序先被触发,LED灯按照预设的方式闪烁。

b. 当高优先级中断服务程序执行过程中,低优先级中断触发,系统实现中断嵌套,低优先级中断服务程序被执行。

c. 低优先级中断服务程序执行完毕后,系统返回高优先级中断服务程序,继续执行剩余部分。

2. 实验分析:a. 通过设置中断优先级,可以实现不同中断源的响应顺序。

b. 通过控制中断屏蔽位,可以防止中断嵌套过程中发生中断冲突。

c. 实验结果表明,中断嵌套在提高系统响应速度和灵活性方面具有重要作用。

六、实验总结1. 本实验成功实现了51单片机中断嵌套,加深了对中断嵌套原理和实现方法的理解。

2. 通过实验,掌握了中断优先级设置和中断屏蔽位的控制技巧。

3. 中断嵌套在实际应用中具有广泛的应用前景,可以提高系统性能和响应速度。

嵌入式KL键盘中断实验

嵌入式KL键盘中断实验

嵌入式KL键盘中断实验
嵌入式KL键盘中断实验是一种使用嵌入式系统的KL键盘进
行中断方式实验的方法。

在嵌入式系统中,中断是一种常用的机制,用于实现多任务处理和实时系统。

在键盘输入中断实验中,我们可以利用KL键
盘的中断功能,实现在用户按下键盘按键时自动触发中断,并进行相应的处理。

实验步骤如下:
1. 准备硬件环境:使用KL键盘连接到嵌入式系统的对应接口。

2. 配置中断:通过编程设置KL键盘对应的中断引脚,使其可
以触发中断。

具体实现方法根据所用的嵌入式系统和开发工具不同而有所差异,可以查阅相应的文档和资料进行配置。

3. 编写中断处理程序:在嵌入式系统中,中断处理程序是在中断发生时被调用的函数。

我们需要编写一个中断处理程序来响应键盘中断,并进行相应的处理,比如读取键盘输入的字符并进行显示或其他操作。

4. 注册中断处理程序:将编写的中断处理程序注册到嵌入式系统的中断向量表中,以便系统在中断发生时能够找到并执行该程序。

5. 运行实验:启动嵌入式系统,按下KL键盘的按键,触发中
断并执行中断处理程序。

根据编写的中断处理程序的功能,可以在显示屏上显示按下的按键字符或进行其他操作。

需要注意的是,不同的嵌入式系统和开发工具对于中断的实现方式和配置方法可能存在差异,具体的实验步骤和代码实现可能需要根据具体的情况进行调整。

建议在进行实验前充分了解相关的文档和资料,以确保正确实施实验。

嵌入式中断控制实训报告

嵌入式中断控制实训报告

一、实训背景随着物联网、智能制造等领域的快速发展,嵌入式系统在各个行业中的应用日益广泛。

中断技术在嵌入式系统中扮演着至关重要的角色,它能够使系统在处理实时任务时更加高效、可靠。

为了提高学生对嵌入式中断技术的理解和应用能力,我们开展了此次嵌入式中断控制实训。

二、实训目的1. 理解中断的基本概念和原理;2. 掌握中断控制的基本方法;3. 学会使用中断进行实时任务处理;4. 提高嵌入式系统设计和开发能力。

三、实训内容本次实训主要分为以下几个部分:1. 中断基础知识- 介绍中断的概念、分类和作用;- 讲解中断处理流程,包括中断请求、中断响应、中断处理和中断返回;- 分析中断优先级和嵌套中断。

2. 中断控制- 学习使用C语言实现中断服务程序(ISR);- 掌握中断使能和禁用方法;- 熟悉中断触发方式和中断屏蔽;- 学会使用定时器中断实现周期性任务。

3. 嵌入式系统开发- 使用STM32F103C8T6微控制器作为实验平台;- 学习使用ST-Link进行程序下载和调试;- 掌握Keil MDK软件的使用;- 实现基于中断的LED闪烁、按键控制等应用。

4. 实验项目- 设计并实现一个基于定时器中断的LED闪烁程序;- 设计并实现一个基于按键中断的LED开关控制程序;- 设计并实现一个基于串口中断的数据传输程序。

四、实训过程1. 理论学习- 认真阅读教材和资料,理解中断的基本概念和原理;- 分析中断处理流程,掌握中断优先级和嵌套中断;- 学习使用C语言实现中断服务程序。

2. 实验操作- 搭建实验平台,连接STM32F103C8T6微控制器和外部设备;- 使用ST-Link下载程序,并使用Keil MDK进行调试;- 编写程序实现LED闪烁、按键控制等应用。

3. 项目开发- 分析项目需求,设计程序框架;- 编写代码实现项目功能;- 调试程序,确保程序正常运行。

五、实训结果1. 成功实现了基于定时器中断的LED闪烁程序,实现了LED灯以一定频率闪烁;2. 成功实现了基于按键中断的LED开关控制程序,实现了通过按键控制LED灯的开关;3. 成功实现了基于串口中断的数据传输程序,实现了上位机与单片机之间的数据交换。

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

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

《嵌入式系统技术》实训报告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 尚未更新,所以要计算出下一条指令的地址来执行返回操作;指令预取指中指异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。

嵌入式实验3按键实验(中断方式)

嵌入式实验3按键实验(中断方式)

嵌入式实验3按键实验(中断方式)河南机电高等专科学校《嵌入式系统开发》课程实验报告系部:电子通信工程系班级:电信1##姓名: ######学号: 120######实验三按键实验(中断方式)一.实验简介在实验一的基础上,使用按键控制流水灯。

二.实验目的熟练使用库函数操作GPIO,掌握中断配置和中断服务程序编写方法,掌握通过全局变量在中断服务程序和主程序间通信的方法。

三.实验内容实现初始化GPIO,并配置中断,在中断服务程序中通过修改全局变量,达到控制流水灯速度及方向。

下载代码到目标板,查看运行结果。

四.实验设备硬件部分:PC计算机(宿主机)、STM32实验板。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤1在实验一代码的基础上,编写中断初始化代码2在主程序中声明全局变量,用于和中断服务程序通信,编写完成主程序3编写中断服务程序4编译代码,下载到实验板5.单步调试6记录实验过程,撰写实验报告六.实验结果及测试中断方式的按键式实验,是通过配置外部中断寄存器和中断嵌套(NVIC)控制器来实现按键按下控制LED灯亮灭。

通过按键中断打断主函数,执行LED1取反一次。

主函数初始化中断配置和LED配置,点亮LED1后一直等待中断,每中断一次,LED1取反一次。

int main(void){LED_GPIO_Config();LED1_ON;CLI();SEI();EXTI_PA0_Config();while(1){}}中断嵌套控制寄存器的配置为中断嵌套分组1;抢占优先级0;响应优先级0 代码如下:void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}外部中断按键的配置源码如下:配置PA0位中断线,并使能AFIO 时钟void EXTI_PA0_Config(void){GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);NVIC_Configuration();GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIO_InitStructure);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);}产生中断后程序进入中断服务子程序,将LED1取反,并软件清除标志位,中断服务子程序如下:void EXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0) != RESET){LED1_TOGGLE;EXTI_ClearITPendingBit(EXTI_Line0);}}七.实验总结通过这次实验,课程知识的实用性很强,因此实验就显得非常重要,刚开始做实验的时候,由于自己的理论知识基础不好,在实验过程遇到了许多的难题,也使我感到理论知识的重要性。

【精品】嵌入式系统实验报告-1-外部中断

【精品】嵌入式系统实验报告-1-外部中断

【精品】嵌入式系统实验报告-1-外部中断实验名称:外部中断
实验目的:了解外部中断的概念和原理,学习在Keil中配置和使用外部中断,掌握外部中断的应用。

实验器材:Keil软件,STC89C52RC单片机,LED灯,按键开关。

实验原理:
外部中断是指单片机外部设备(如按键开关、定时器等)产生的中断请求信号,使得单片机能够在执行程序的过程中,根据需要接受来自外部设备的中断请求,并立即处理中断请求所需的相关程序,在处理完中断请求后再返回到原来程序的执行。

在Keil中使用外部中断需要用到的库函数有:
void EX0_init(void); //外部中断0(P3.2)初始化函数
void EX1_init(void); //外部中断1(P3.3)初始化函数
void INT0_ISR(void) interrupt 0; //外部中断0的中断处理函数
void INT1_ISR(void) interrupt 2; //外部中断1的中断处理函数
其中,EX0_init()和EX1_init()函数用于初始化外部中断0和外部中断1,将相应的引脚设置为中断请求引脚,并设置相应的中断触发方式;INT0_ISR()和INT1_ISR()函数用于处理外部中断0和外部中断1的中断请求。

实验结果:
在Keil中编译程序后,烧录程序到单片机中,并将单片机连接到外部电路中。

当按下按键时,会模拟产生外部中断请求信号,LED灯会闪烁3次后停止闪烁。

当按键松开后,LED灯将停止闪烁,恢复到初始状态。

嵌入式实验 中断实验报告

嵌入式实验 中断实验报告

嵌入式实验报告中断实验报告指导教师:高金山实验者:13410801 房皓13410802 张耀荣一、实验目的:1.理解中断向量表的结构2.理解中断处理的过程3.学习编写中断处理程序的方法二、实验要求:1.修改源程序,通过中断方式响应按键,当1-16键按下时,数码管显示0-F。

2.提高内容:以FIQ方式,替代IRQ方式,实现按下任何一个键,数码管显示按键号的功能。

三、实验内容:1.设计主程序,使8个LED以一定的时间间隔从右到左依次点亮,循环显示;(实验一的内容)2.当有键按下时,在七段数码管上,显示对应的16个键盘编码值 0-9 a-f(实验二、三的内容)四、程序编辑:;boot.sIMPORT postDelayIMPORT osStack;IMPORT post_initStackIMPORT init_StackIMPORT post_initGpioIMPORT post_initMemIMPORT post_initKeyIMPORT dummyOsIMPORT FIQ_HandlerIMPORT ICMRIMPORT init_ICMRIMPORT FIQIMPORT init_FIQ;IMPORT PSSRAREA boot ,CODE ,READONLYENTRYB Reset_HandlerB Undefined_HandlerB SWI_HandlerB Prefetch_HandlerB DataAbort_HandlerNOPB Reset_HandlerB FIQ_HandlerUndefined_HandlerB Undefined_HandlerSWI_HandlerB SWI_HandlerPrefetch_HandlerB Prefetch_HandlerDataAbort_HandlerB DataAbort_HandlerIRQ_HandlerB IRQ_Handler ;Defined by yourself Reset_Handler;*************************;Check if run in the SDRAM;*************************MOV R0,PCCMP R0,#0x0000003CBNE Stack;**************************;Init Memory;**************************mov r14,pc;ldr pc,=init_Memoryldr pc,=post_initMem;**************************;Init Stack;************************** Stackmov r14,pcldr pc,=init_Stack;ldr pc,=post_initStack;**************************;Init Gpio;**************************mov r14, pcldr pc, =post_initGpio;***************************;Enable & Set Interrupt;***************************mrs r1, CPSRbic r1, r1,#0x40msr CPSR_c, r1ldr r1, =ICMRldr r2, =init_ICMRstr r2,[r1]ldr r1, =FIQldr r2, =init_FIQstr r2, [r1];****************************;Init Keypad;****************************mov r14,pcldr pc,=post_initKey;***************************;Power Manager Sleep Status Register;***************************;ldr r1, =PSSR;mov r2, #0x30;str r2, [r1];***************************;Loop;***************************ldr r0,=postDelaypostLoopsub r0,r0,#0x1cmp r0,#0x0bne postLoopldr pc,=dummyOsEND;handler_IRQ.sIMPORT IRQ_Function;IMPORT ICMREXPORT FIQ_HandlerAREA FIQ_Handler,CODE,READONLY;****************************SUB LR, LR, #0x4STMFD SP!,{R0-R12,LR}BL IRQ_FunctionLDR R0,=0x41500000; by gaoLDR R1,[R0] ;by gaoLDMFD SP!,{R0-R12,PC}^;*******************************END;keypad.c#include <stdio.h>#include "register_variant.h"#define LED_CS2 (*((volatile unsigned short int *)(0x10300000))) //LED1 and LED2#define LED_CS3 (*((volatile unsigned short int *)(0x10400000))) //LED3 and LED4#define KPDK_VALUE (*((volatile unsigned char *)(0x41500008)))//Direct Keypad#define KPMK_VALUE (*((volatile unsigned char *)(0x41500020)))//Matrix Keypad#define LED_CS4 (*((volatile unsigned char *)(0x10500000)))#define LED_VALUE (0xff)void IRQ_Function(void){char i,j; //j by gaounsigned short int kbd_buff;i = KPDK_VALUE;switch (i){case 0x40: //key-press 1LED_CS2 = 0x8079;break;case 0x02: //key-press 2LED_CS2 =0x8024;break;case 0x04: //key-press 3LED_CS2 = 0x8030;break;case 0x20: //key-press 4LED_CS2 =0x8019;break;default: kbd_buff=0x8F8F; break;}i = KPMK_VALUE ;switch (i){case 0x00: //key-press 5LED_CS2 =0x8012;break;case 0x01: //key-press 6LED_CS2 = 0x8002;break;case 0x02: //key-press 7LED_CS2 =0x8078;break;case 0x05: //key-press 8LED_CS2 =0x8000;break;case 0x10: //key-press 9LED_CS2 =0x8010;break;case 0x11: //key-press 10LED_CS2 = 0x4079;break;case 0x12: //key-press 11LED_CS2 =0x7979;break;case 0x15: //key-press 12LED_CS2 =0x2479;break;case 0x20: //key-press 13LED_CS2 =0x3079;break;case 0x21: //key-press 14LED_CS2 = 0x1979;break;case 0x22: //key-press * 15 LED_CS2 =0x1279;break;case 0x25: //key-press # 16 LED_CS2 =0x0279;break;default: break;}}//int i;void Delay(unsigned int x){unsigned int i, j, k;for (i =0; i <=x; i++)for (j = 0; j <0xff; j++)for (k = 0; k <0xff; k++);}void button_statusFetch(void){char i = 0;unsigned short int kbd_buff;i = KPDK_VALUE ;switch (i){case 0x40: //key-press 1 LED_CS2 = 0x8079;break;case 0x02: //key-press 2 LED_CS2 =0x8024;break;case 0x04: //key-press 3 LED_CS2 = 0x8030;break;case 0x20: //key-press 4 LED_CS2 =0x8019;break;default: kbd_buff=0x8F8F; break;}}void button_statusFetch1(void){char i = 0;//unsigned short int kbd_buff;i = KPMK_VALUE ;switch (i){case 0x00: //key-press 5 LED_CS2 =0x8012;break;case 0x01: //key-press 6 LED_CS2 = 0x8002;break;case 0x02: //key-press 7 LED_CS2 =0x8078;break;case 0x05: //key-press 8 LED_CS2 =0x8000;break;case 0x10: //key-press 9LED_CS2 =0x8010;break;case 0x11: //key-press 10LED_CS2 = 0x4079;break;case 0x12: //key-press 11LED_CS2 =0x7979;break;case 0x15: //key-press 12LED_CS2 =0x2479;break;case 0x20: //key-press 13LED_CS2 =0x3079;break;case 0x21: //key-press 14LED_CS2 = 0x1979;break;case 0x22: //key-press * 15 LED_CS2 =0x1279;break;case 0x25: //key-press # 16 LED_CS2 =0x0279;break;default: break;}}void dummyOs(void){//int led_sharp;int temp=~0;int i;LED_CS2 = temp;LED_CS3 = temp;while(1){LED_CS4 = 0xff;for (i = 0; i < 8; i++){LED_CS4 = (LED_VALUE << i) -1;Delay(5);}//button_statusFetch();//Delay(10);// button_statusFetch1();// Delay(10);}}五、实验结果:程序运行时,实验箱上的八个LED灯在自左向右闪烁,当按下键盘上的按钮时,七段数码管吗会显示出对应的编码六、实验总结:通过本次实验,我锻炼了自己的操作能力,加深了对理论知识的理解,并对对中断工作方式有了初步的认识,理解了通过IRQ和FIQ两种不同的中断方式控制程序的运行的方法。

嵌入式软件开发基础实验报告 中断实验

嵌入式软件开发基础实验报告 中断实验

上海电力学院嵌入式软件开发基础实验报告题目:ARM 【实验4.3】中断实验专业:电子科学与技术年级:姓名:学号:一、实验目的(1)、学会使用 Embest IDE 编写简单的 C 语言程序并进行调试;(2)、了解不同中断触发方式对中断产生的影响;(3)、理解 S3C44B0X 处理器的中断响应过程;(4)、熟练掌握如何进行 ARM 处理器中断处理的软件编程方法。

二、实验设备硬件:Embest EduKit-III 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。

软件:Embest IDE Pro ARM 集成开发环境,Windows 98/2000/NT/XP。

三、实验步骤1. 准备实验环境使用 Embest 仿真器连接目标板,使用 Embest EduKit-III 实验板附带的串口线,连接实验板上的 UART0 和 PC 机的串口。

2. 串口接收设置在PC 机上运行windows 自带的超级终端串口通信程序(波特率115200、1 位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。

3. 打开实验例程1)拷贝光盘CD1\Software\EduKit44b0 文件夹到EmbestIDE\Examples\Samsung\ 目录下;2) 使用 Embest IDE 通过 Embest JTAG 仿真器连接实验板,打开实验例程目录 4.3_int_test 子目录下的 int_test.pjf 例程,编译链接工程;3) 点击 IDE 的 Debug 菜单,选择 Remote Connect 项或 F8 键,远程连接目标板;4) 点击 IDE 的 Debug 菜单,选择 Download 下载调试代码到目标系统的 RAM 中;5) 打开 View 菜单>Debug Windows>Register 寄存器观察窗口(快捷键Alt+5 ),在寄存器观察窗口下面选择外围寄存器(Peripheral),将 INTERRUPT 中断寄存器组展开,重点观察 INTPND 和 I_ISPR 寄存器值的变化。

嵌入式Linux应用开发(中断实验指导)[★]

嵌入式Linux应用开发(中断实验指导)[★]

嵌入式Linux应用开发(中断实验指导)[★]第一篇:嵌入式Linux应用开发(中断实验指导)嵌入式Linux应用开发——中断按键点亮LED实验一、中断控制设计流程<1>由中断控制器汇集各类外设发出的中断信号,然后向CPU发出处理请求。

<2>CPU保存当前程序的运行环境,调用中断服务程序(ISR,Interrupt Service Rout)处理这些中断。

<3>在ISR中通过读取中断控制器、外设相关寄存器来识别当前中断是哪个中断,并进行相应处理。

<4>清除中断:通过读写中断控制器和外设的相关寄存器来实现。

<5>最后恢复被中断程序的运行环境(即前面保存的各个寄存器等),继续执行。

二、程序设计组成框架程序由head.s、init.c、interrupt.c、makefile四个程序模块组成head.s:初始化,设置中断模式、系统模式的栈,设置中断处理函数,设置各类异常的向量地址。

init.c:关看门狗(WATCHDOG),否则CPU会不断重启。

初始化LED、初始化外部中断、使能外部中断、设置外设中断的触发方式。

interrupt.c:设计代码根据识别出来的中断(即按键)点亮LED,然后清除中断。

写上主函数,主函数只是个不做任何工作的无限循环。

Makefile: Linux中使用make命令编译程序以提高编译效率,makefile既是make所要执行的命令。

三、程序设计结果将所编写程序通过H-JTAG烧写到实验箱中观察结果,按下按键,LED亮;再次按下按键,LED灭,循环往复。

第二篇:嵌入式linu学习心得嵌入式Linux学习心得1、Linux命令ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样pwd: 查看当前的目录cd:改变当前操作目录cd /直接跳到根目录cd..回到上一级目录cat: 打印显示当前文件的内容信息mkdir:创建目录fdisk: 查看硬盘分区信息,-l以列表方式查看->代表是链接文件,类似window下的快捷方式。

嵌入式中断实验

嵌入式中断实验

5.3 中断实验5.3.1 实验目的1. 了解中断的作用;2. 掌握嵌入式系统中断的处理流程;3. 掌握ARM中断编程。

5.3.2 实验内容1. 编写中断处理程序,处理外部中断;5.3.3 预备知识1. 了解ADT IDE集成开发环境的根本功能;2. 了解中断的作用以与根本处理过程。

5.3.4 实验设备1. 硬件:JX44B0教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE集成开发环境。

5.3.5 根底知识1. 中断的根本概念CPU与外设之间传输数据的控制方式通常有三种:查询方式、中断方式和DMA方式。

DMA方式将在后续实验中说明。

查询方式的优点是硬件开销小,使用起来比拟简单。

但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,CPU就只能循环等待,不能执行其它程序,这样就浪费了CPU的大量时间,降低了CPU的利用率。

为了解决这个矛盾,通常采用中断传送方式:即当CPU进展主程序操作时,外设的数据已存入输入端口的数据存放器;或端口的数据输出存放器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进展输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。

这样CPU 就防止了把大量时间消耗在等待、查询状态信号的操作上,使其工作效率得以大大地提高。

能够向CPU发出中断请求的设备或事件称为中断源。

系统引入中断机制后,CPU与外设〔甚至多个外设〕处于“并行〞工作状态,便于实现信息的实时处理和系统的故障处理。

中断方式的原理示意图如下所示。

图5-7 中断处理示意图1〕中断响应中断源向CPU发出中断请求,假如优先级别最高,CPU在满足一定的条件下,可以中断当前程序的运行,保护好被中断的主程序的断点与现场信息。

然后,根据中断源提供的信息,找到中断服务子程序的入口地址,转去执行新的程序段,这就是中断响应。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五中断控制实验(一)实验目的了解中断的作用;掌握嵌入式系统中断的处理流程;掌握ARM中断编程。

(二)实验设备计算机;ARM硬件仿真器;ARM开发板(三)实验硬件设置在做实验之前,先将开发板电源接好,将仿真器的USB连线与电脑相连,通电,然后按核心板的复位键。

(四)实验原理1. 中断的基本概念CPU与外设之间传输数据的控制方式通常有三种:查询方式、中断方式和DMA方式。

DMA 方式将在后续实验中说明。

查询方式的优点是硬件开销小,使用起来比较简单。

但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,CPU就只能循环等待,不能执行其它程序,这样就浪费了CPU的大量时间,降低了CPU的利用率。

为了解决这个矛盾,通常采用中断传送方式:即当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。

这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。

能够向CPU发出中断请求的设备或事件称为中断源。

系统引入中断机制后,CPU与外设(甚至多个外设)处于“并行”工作状态,便于实现信息的实时处理和系统的故障处理。

中断方式的原理示意图如下所示。

图5-7 中断处理示意图1)中断响应中断源向CPU发出中断请求,若优先级别最高,CPU在满足一定的条件下,可以中断当前程序的运行,保护好被中断的主程序的断点及现场信息。

然后,根据中断源提供的信息,找到中断服务子程序的入口地址,转去执行新的程序段,这就是中断响应。

CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。

2)中断服务子程序CPU响应中断以后,就会中止当前的程序,转去执行一个中断服务子程序,以完成为相应设备的服务。

中断服务子程序的一般结构如下图所示。

图5-8 中断服务子程序处理流程▼保护现场(由一系列的压栈指令完成)。

目的是为了保护那些与主程序中有冲突的寄存器,(如R0,R1,R2等),如果中断服务子程序中所使用的寄存器与主程序中所使用的寄存器等没有冲突的话,这一步骤可以省略。

▼中断处理,中断处理程序在检查到相应的中断源后,调用对应的中断处理程序完成。

▼恢复现场并返回(由一系列的出栈指令完成)。

是与保护现场对应的,但要注意数据恢复的次序,以免混乱。

由于中断服务子程序需要打断主程序的执行,因此其处理应该及时完成,较长时间的延时将导致系统性能严重下降。

(五)实验关键代码及使用的寄存器S3C44B0X的中断控制器包括5类寄存器:中断控制寄存器、中断状态寄存器、中断模式寄存器、中断屏蔽寄存器和中断清除寄存器。

1) 中断控制寄存器该控制寄存器是处理器总的中断控制,包括中断模式是矢量模式还是非矢量模式,是否使能IRQ模式的中断,是否使能FIQ模式的中断,具体说明如下:表5-3 中断控制寄存器2) 中断状态寄存器该寄存器用于检查中断来源,该寄存器是只读属性的。

表5-4 中断状态寄存器3) 中断模式寄存器用于设置相应中断的工作模式,是IRQ模式还是FIQ模式。

表5-5 中断模式寄存器4) 中断屏蔽寄存器表5-6 中断屏蔽寄存器5) 中断清除寄存器中断处理之后需要清除相应的标志位,中断清除寄存器说明如下:表5-7 中断清除寄存器4. 44B0中断处理S3C44B0X处理器的中断处理与其他CPU的处理模式基本上是一致的,只是由于它引入了几种不同的处理器模式,使中断处理变得更加容易。

其典型的步骤如下:1) 保存现场:当系统出现中断时,处理器首先要做的就是保存现场,这一过程包括:保存当前的PC值到lr中,保存当前的程序运行状态到spsr中。

值得注意的就是由于ARM7采用3级流水线结构,此时的PC值实际上等于当前指令地址加上8(ARM指令时),所以返回时还需要将保存的PC值减4;2) 模式切换:当处理器完成现场保护后,就进入中断模式,并将PC值置为一个固定的值0X00000018,这也就是IRQ模式的中断入口地址。

在中断模式下,有两个独立的寄存器R13、R14,这样可以便于中断程序使用自己特有的堆栈。

但这样随之而来产生一个问题,就是中断处理时堆栈溢出保护的问题,需要我们认真地估计堆栈的大小,同时在中断处理时也要尽量减少函数调用的层次,否则将产生一些不可预知的错误;3) 获取中断源:所有的IRQ中断都从0X00000018开始执行,通常在该地址处放一条跳转指令,进一步跳到我们的中断程序中;4) 处理中断:在中断程序中需要进一步获取中断源,即谁引发了该中断,然后通过查表获取相应中断的处理程序入口,并调用对应的函数;5) 中断返回,恢复现场:在返回时需要恢复处理器模式,包括恢复中断处理用到的所有寄存器、恢复被中断的程序运行状态到CPSR,并跳转到被中断的主程序。

下图为JX44B0教学实验系统中处理外部中断0的流程:图5-8 JX44B0中断处理示意图中断的入口代码(汇编代码):0X00000018: LDR pc, =0X0C000020……0X0C000020: b HandlerIRQHandlerIRQ:sub sp,sp,#4 /* 为中断分发例程入口地址预留栈空间 */stmfd sp!,{r0} /* 保存R0 */ldr r0,=HandleIRQ /* 将中断分发例程入口地址指针保存到R0中 */ldr r0,[r0] /* 将中断分发例程入口地址保存到R0中*/str r0,[sp,#4] /* 将中断分发例程入口地址保存到预留的堆栈空间 */ldmfd sp!,{r0,pc} /* 将R0和中断分发例程入口地址出栈,这条指令也 *//*实现了一个跳转 */上述代码实际上就是一个三级跳,即从FLASH中跳到了RAM的中断入口,然后又从中断入口跳到中断分发例程入口。

在此我们有一个前提条件,即必须在HandleIRQ地址处保存正确的分发例程入口地址,如使用下面代码后IsrIRQ就是中断分发例程:ldr r0,=HandleIRQldr r1,=IsrIRQstr r1,[r0]中断分发例程可以采用汇编语言和C语言两种格式编写,下面将分别列出这两种方式。

1) 用汇编代码编写的中断分发例程:IsrIRQ: /*using I_ISPR register.*/sub lr,lr,#4stmfd sp!,{lr} /* 保存中断返回的PC值 */stmfd sp!,{r0-r4} /* 备份寄存器R0-R4 */sub sp,sp,#4 /* 为PC预留栈空间 */stmfd sp!,{r8-r9} /* 备份寄存器R8-R9 */ldr r9,=I_ISPR /* 读取中断状态 */ldr r9,[r9]cmp r9, #0x0 /* 检查中断状态 */beq i2mov r8,#0x0 /* R8保存中断表的偏移 */i0: /* 逐位检查中断状态 */movs r9,r9,lsr #1bcs i1 /* 如果该位等于1,则处理这一中断 */add r8,r8,#4 /* 修改当前的中断偏移 */b i0 /* 处理下一比特 */i1:ldr r9,=HandleADC /* HandleADC位于中断向量表起始位置,我们将该地址用作是中断向量表的基地址 */add r9,r9,r8 /* 计算入口地址指针:中断基地址加上偏移 */ldr r9,[r9] /* 从地址向量表中获取入口地址 */str r9,[sp,#8] /* 将入口地址保存到堆栈,并移动堆栈指针 */mov lr,pc /* 保存当前PC*/ldmfd sp!,{r8-r9,pc} /* 调用中断例程 */ldmfd sp!,{r0-r4, pc}^/* 中断返回,并恢复中断前的处理器模式*/i2:ldmfd sp!,{r8-r9} /* 如果当前没有任何中断,直接返回 */add sp,sp,#4 /* 移动堆栈指针,该空间由第4句指令预留 */ldmfd sp!,{r0-r4, pc}^/* 中断返回,并恢复中断前的处理器模式*/2) 用C代码编写的中断分发例程:如果采用GNU编译器,需要将该函数定义为中断类型,使用关键字:__attribute__ ((interrupt("IRQ")))。

如下所示代码为C语言的IsrIRQ实现:typedef (*ISR_ROUTINE_ENTRY)(void);void IsrIRQ() __attribute__ ((interrupt("IRQ")));void IsrIRQ(){int count = 0;unsigned int isr_pending;unsigned int isr_mask = 0x00000001;unsigned int isr_mask_set = rINTMSK; /* 读取中断掩码 */ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0;isr_pending = (rINTPND & ~isr_mask_set); /* 读取中断状态 *//* 查表 */while(isr_mask){if(isr_pending&isr_mask){/* 找到中断源,获取中断例程入口地址 */isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));break;}count+=4;isr_mask <<= 1;}/* 调用中断服务例程 */if(isr_routine_entry) (*isr_routine_entry)();}中断处理例程(该函数无需定义为中断类型)void EINT0_Isr(){rI_ISPC=BIT_EINT0;/* 清除中断标志 */……}中断向量表中各个中断的偏移:表5-8 中断向量表中各个中断的偏移(六)1)编译/执行程序2)跟踪/调试程序3)断点的设置与取消。

4)下载程序与调试(七)实验步骤1. 参照模板工程interrupt(modules\interrupt\interrupt.apj),新建一个工程interrupt,添加相应的文件,并修改interrupt的工程设置;2. 创建interrupt.c并加入到工程interrupt中;3. 编写中断分发例程IsrIRQ;4. 注册外部中断0处理函数ext0_int_isr;5. 实现外部中断0处理函数ext0_int_isr,在其中实现LED开关功能;6. 编译interrupt;7. 下载程序并运行,按下按键EXTINT0将引发一次外部中断,并在中断处理函数中闪灯。

相关文档
最新文档