中断控制
中断控制器实验的实验报告

中断控制器实验的实验报告
中断控制器是计算机系统中的重要组成部分,它负责管理和处理来自外部设备的中断信号。
本实验旨在通过搭建一个中断控制器原型,深入了解中断控制器的工作原理与应用。
一、实验目的
1. 掌握中断控制器的基本原理和工作方式;
2. 熟悉中断信号的产生和处理过程;
3. 实践动手能力,培养团队合作精神。
二、实验器材
1. 开发板:一块支持中断控制器实验的开发板;
2. 外设设备:各类外设设备,如键盘、鼠标、显示器等;
3. 连接线:用于连接开发板和外设设备的线缆。
三、实验步骤
1. 准备工作:
a. 确认开发板支持中断控制器实验,并检查开发板是否正常工作;
b. 将外设设备连接到开发板上,确保连接完好稳定;
c. 准备一段简单的代码,用于测试中断控制器的工作。
2. 搭建实验电路:
a. 将外设设备与开发板连接,确保连接正确;
b. 根据开发板的电路图和引脚定义,连接中断控制器电路。
3. 编写测试代码:
a. 利用开发板所提供的编程软件,编写一个简单的测试代码;
b. 测试代码应包括产生外设中断信号和中断处理的相关逻辑;
c. 确保代码的正确性和可靠性。
4. 实验过程:
a. 将测试代码下载到开发板上,确保下载成功;
b. 模拟外设设备的中断信号产生,观察中断控制器的工作情况;。
单片机实验——利用中断控制LED

单片机实验——利用中断控制LED本实验利用中断控制单片机的GPIO口控制LED的亮灭,达到了在不同的时间间隔下实现LED的闪烁、呼吸等效果。
本实验可以让初学者更好地理解与掌握单片机的中断和GPIO 控制。
一、实验器材准备1. STC12C5A16S2单片机开发板2. LED灯3. 1KΩ电阻4. 杜邦线二、实验原理本实验中,我们需要利用单片机的GPIO口控制LED灯的亮灭。
其中,单片机的GPIO 口需要设置为输出模式,即控制LED灯亮灭的电平。
在运行中,通过改变电平状态来控制LED的亮灭。
而中断控制则是为了实现不同的效果,比如在不同的时间间隔下闪烁、呼吸等。
中断是指硬件或软件的外部事件,它会打断当前正在执行的程序,转为执行中断程序。
在单片机编程中,我们可以采取中断方式实现不同的操作。
三、实验步骤1. 首先,连接电路。
将LED作为单片机GPIO控制的输出口,同时连接一个1KΩ的电阻,如下图:2. 打开Keil软件,新建工程,导入STC12C5A16S2头文件。
3. 在代码中,首先需要定义GPIO的引脚,接下来进行中断初始化设置。
4. 编写闪烁程序,实现LED在不同时间间隔下闪烁,如下:```cvoid Led_Flash(void){Led_ON(); //LED灯亮Delay(500); //延时等待500msLed_OFF(); //LED灯灭Delay(500); //延时等待500ms}```5. 编写呼吸程序,实现LED在不同时间间隔下进行呼吸灯效果。
```cvoid Led_Breath(void){uint8 i;uint16 j;for (i = 0; i < 10; i++) //变量i控制灯的亮度{for (j = 0; j < 2000; j++) //变量j控制每次延时等待的时间{Led_ON();Delay_us(i * 20);Led_OFF();Delay_us((9 - i) * 20);}}}```6. 编写中断控制程序,通过定时器中断来实现LED的不同效果。
nvic中断控制原理

nvic中断控制原理
NVIC,全称为嵌套向量中断控制器,是ARMCortex-M微控制器中的核心组件之一。
它的工作原理如下:
1.中断优先级:每个中断都有一个固定的优先级。
优先级高的中断在发生时可以立即打断正在执行的指令序列。
ARMCortex-M微控制器支持动态优先级,可以在运行时改变中断的优先级。
2.中断向量表:NVIC使用一个特殊的存储区域来保存中断向量表(InterruptVectorTable)。
中断向量表是一个数组,其中每个元素都是一个指向中断处理程序的地址。
当中断发生时,NVIC将比较新中断与当前中断的优先级,如果新中断优先级高,则立即处理新中断。
3.中断屏蔽:NVIC具有可编程的中断屏蔽寄存器,用于控制哪些中断被允许或禁止。
通过设置这些寄存器的值,可以控制哪些中断信号可以触发中断事件。
4.自动保存和恢复处理器状态:在ISR(中断服务程序)结束时,NVIC将从栈中恢复相关寄存器的值,进行正常操作,因此花费少量且确定的时间处理中断请求。
总之,NVIC通过优先级管理、向量表、屏蔽寄存器和自动保存恢复处理器状态等功能,实现了对微控制器中断的全面控制和管理。
中断控制系统工作原理

中断控制系统工作原理中断控制系统是计算机系统中的一个重要组成部分,用于管理和处理各种硬件设备的中断请求。
其工作原理主要包括中断源、中断控制器和中断服务程序三个主要组成部分。
中断源是指各种硬件设备,如键盘、鼠标、硬盘等,在发生某些特定事件时会向中断控制系统发送中断请求。
中断请求可以理解为一种硬件中断信号,通常通过硬件电路的方式发送给中断控制器。
中断控制器是计算机系统中的一个重要组件,负责接收并处理来自中断源的中断请求。
它会检测到中断信号后,根据预先设置的中断优先级,确定下一个需要处理的中断请求,并将该请求发送给相应的中断服务程序。
中断服务程序是为处理特定中断请求而编写的一段程序代码。
当中断控制器将中断请求发送给中断服务程序时,它会立即暂停当前正在执行的程序,并将控制权转移到中断服务程序中。
中断服务程序会根据中断请求的类型,执行相应的操作和处理,如读取键盘输入、更新硬盘缓存等。
中断控制系统的工作原理可以简单概括为以下几个步骤:1. 中断源发出中断请求。
2. 中断控制器接收到中断请求,并根据预先设置的中断优先级,确定下一个需要处理的中断请求。
3. 中断控制器将中断请求发送给相应的中断服务程序。
4. 当前正在执行的程序被暂停,控制权转移到中断服务程序中。
5. 中断服务程序执行相应的操作和处理。
6. 中断服务程序执行完毕后,将控制权返回给中断控制器。
7. 中断控制器根据继续处理下一个中断请求。
通过中断控制系统的工作,计算机系统能够快速响应外部设备的中断请求,并及时处理相应的操作和事件。
这种分时处理的方式提高了系统的效率和响应速度,并且能够保证多个设备之间的并行处理,提高了系统的并发性和可靠性。
单片机中断控制实验

实验三中断控制实验
1、实验目的
⑴学习51单片机的中断控制原理。
⑵学习51单片机的外部中断的编程方法。
⑶学习数据的堆栈操作原理和编程方法。
2、实验任务
图1外部中断控制接口电路原理图
实验任务是:在图1中,P2连接8个LED、第12脚(即INT0引脚)连接一个10kΩ的上拉电阻,让该引脚保持为High,另外再连接一个按钮开关(1NT0)。
当主程序正常执行时,P2所连接的8个LED将闪烁。
若按INT0按钮开关,则进入中断状态,P2所连接的8个LED将变成单灯左移,而左移3圈(从最左边到最右边为1圈)后,恢复中断前的状态,程序将继续执行8灯闪烁的功能。
3、实验内容
⑴编制完成实验任务的程序。
⑵绘制实验任务的原理图。
⑶结合硬件原理图,仿真调试程序,记录实验数据和现象。
4、实验预习要求
⑴认真阅读本实验指导书,领会实验目的的要求和实验内容。
⑵复习教材中有关内容。
⑶了解51单片机的中断控制原理。
⑷了解与51单片机的中断控制相关的寄存器的用法。
⑸了解51单片机的各中断源的中断服务子程序的入口地址。
⑹根据实验内容编好各项源程序,为实验做好软件准备。
5、思考题
⑴说明针对外部输入,查询法和中断法有何区别?
⑵若把一个按钮开关改到INT1引脚,实现同样的任务,实验程序应该如何修改,请写出修改后的程序。
6、实验报告要求
⑴写出所编写的程序,需加注释。
⑵写出思考题的答案。
51单片机中断控制

51单片机中断控制在单片机的世界里,中断控制就像是一位高效的调度员,能够让单片机在处理各种任务时更加灵活和高效。
今天,咱们就来好好聊聊 51 单片机的中断控制。
咱们先来了解一下啥是中断。
简单说,中断就是在单片机正常执行主程序的时候,突然有个更紧急或者更重要的事情需要处理,这时候单片机就会暂停主程序,先去处理这个紧急的事情,处理完了再回来继续执行主程序。
51 单片机有 5 个中断源,分别是外部中断 0 和 1、定时器/计数器 0 和 1 的溢出中断,还有串行口中断。
每个中断源都有自己的中断标志位和中断允许位。
外部中断 0 和 1 可以通过单片机的引脚来触发。
比如说,当外部引脚检测到一个下降沿或者低电平时,就可以产生中断。
这在很多实际应用中非常有用,比如检测按键按下、外部设备的信号变化等。
定时器/计数器 0 和 1 的溢出中断则是当定时器或者计数器的值达到设定的最大值时产生中断。
这就好比一个闹钟,设定好时间,时间一到就响铃提醒单片机去做相应的处理。
串行口中断则是在串行通信过程中,当发送或者接收完一帧数据时产生中断,方便单片机及时进行数据处理。
要让中断能够正常工作,还得设置好相关的寄存器。
中断允许寄存器 IE 用来控制各个中断源是否允许中断。
比如说,如果要允许外部中断 0 中断,就需要把 IE 寄存器中的相应位设置为 1。
中断优先级寄存器 IP 则用来确定各个中断源的优先级。
当多个中断同时发生时,优先级高的中断会先得到处理。
在编写中断服务程序的时候,有几个要点需要注意。
首先,中断服务程序要有一个特定的函数格式,一般是以“void 中断服务函数名()interrupt 中断号”这样的形式来定义。
然后,在中断服务程序中,要尽量快速地完成关键处理,因为中断服务程序会打断主程序的执行,如果处理时间过长,可能会影响主程序的实时性。
比如说,在一个温度控制系统中,主程序负责采集温度数据、显示温度等常规操作。
而外部中断0 可以用来检测温度超过设定的上限值,一旦触发中断,中断服务程序就会迅速采取降温措施,比如启动风扇或者关闭加热设备,然后迅速返回主程序。
中断控制的基本原理

中断控制的基本原理中断控制是计算机中最基本的组成部分之一,也是操作系统的核心之一。
中断控制从本质上来说是一个自动化的程序执行机制,让计算机可以在需要时中断现有操作而转而处理其他的任务,最后再返回到被中断的操作上。
本文将详细介绍中断控制的基本原理和实现机制。
一、中断控制的基本概念中断是指计算机执行一个程序时,由于硬件发出的请求或是软件发出的信号而打断当前程序的执行,暂停操作并转向执行某个相应的命令。
这个命令通常被叫做“中断处理程序”,它的作用是在被中断的程序运行期间暂停操作,执行处理中断的工作,完成后再返回到被中断的程序继续执行。
在计算机内部,中断处理是通过使用硬件中断来实现的。
硬件中断是指计算机内部的一个硬件模块(如计时器或IO设备)向CPU发出信号请求打断当前程序的进程。
CPU接收到这个信号后,立即转向执行相应的中断处理程序,这样就实现了中断控制。
二、中断控制的实现原理在计算机中,中断控制是由操作系统来完成的。
当硬件设备有需要中断处理程序来处理的信息时,它会向操作系统发出请求,然后操作系统会在相应的时间点调用中断处理程序。
中断处理程序会执行处理信息的操作,同时保存现场信息(如当前进程的状态等),以便处理完成后能够返回到之前的操作上继续执行。
以下是中断控制的详细实现原理:1.中断请求:当硬件设备有需要中断处理程序来处理的信息时,它会向操作系统发出请求。
在发送请求之前,硬件设备会向相应控制器发送一个信号,这个信号会使中断线电平置高,通知CPU有中断请求发生了。
2.中断识别:CPU接收到中断请求后,就需要进行中断识别。
中断识别是指CPU要确定哪个设备发起了中断请求,以便能够调用相应的中断处理程序。
每个设备都有一个相应的中断控制器,当设备向控制器发出中断请求时,控制器会将请求发送给CPU。
CPU通过中断向量表来查找设备的中断向量,以确定哪个设备发起了中断请求。
3.中断响应:中断响应是指CPU执行中断处理程序的操作。
中断控制

TF0/TF1:定时器溢出中断申请标志位(由硬件自动置位)。 =0:定时器未溢出; =1:定时器溢出(由全“1”变成全“0”)时由硬件自动置 位,申请中断,中断被CPU响应后由硬件自动清零。
TR0/TR1:定时器运行启停控制位(可由用户通过软件设置 )。
二.51单片机的中断系统
8051单片机提供了5个中断源,2个中断优先级控制,可实 现2个中断服务嵌套。可通过程序设置中断的允许或屏蔽,设 置中断的优先级。 1.8051的中断源 8051允许5个中断源: (1)外部中断源(中断标志为IE0和IE1 ) 由 INT0 ( P3.2 )端口线引入,低电平或下降沿引起。 由 INT1 ( P3.3 )端口线引入,低电平或下降沿引起。 (2)定时器/计数器中断源 (中断标志为TF0、TF1和TI/RI ) T0:定时/计数器0中断,由T0回零溢出引起。 T1:定时/计数器1中断,由T1回零溢出引起。 (3)串口中断源 (中断标志为TI/RI ) TI/RI:串行I/O中断,完成一帧字符发送/接收引起。
void ISR_Key(void) interrupt 0 using 1 { LED = ~ LED; //K1按下触发一次,P0.0取反一次 }
④ 若正在执行RETI,或正在访问IE或IP寄存器,则必须执行完 当前指令的下一条指令。后方能响应中断。
(2)中断响应的过程
中断过程包括中断请求、中断响应、中断服务、中断返 回四个阶段。 中断请求:中断源将相应请求中断的标志位置 “1”,表示发出 请求,并由CPU 查询。 中断响应:在中断允许条件下相应中断。断点入栈→撤除中断 标志→关闭低同级中断允许→中断入口地址送PC。 这些工作 都是由硬件自动完成的。 中断服务:根据入口地址转中断服务程序,包含保护现场、执 行中断主体、恢复现场。 中断返回:执行中断返回RETI指令→断点出栈→开放中断允许 →返回原程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理实验报告实验名称:并行I/O接口实验院系:班级:姓名:学号:一. 实验目的掌握GPIO IP核的工作原理和使用方法掌握中断控制方式的IO接口设计原理掌握中断程序设计方法掌握IO接口程序控制方法查询方式中断方式延时方式二. 实验环境UltraEdit ; XilinxISE。
三、实验内容最小系统的建立,查询方式与中断方式在counse显示独立开关操作总线连接方式Gpio内部框图中断寄存器硬件电路框图四.实验内容1.最小系统的建立打开Xilinx Platform studio平台,选择相关参数,建立相关文件。
将FPGA内存改为32K,添加UART类型接口,其他选择默认配置。
修改时钟设置:删除Exterinal Port 中的CLK_P与CLK_N并添加Clock_generator_0中的CLKIN修改名称为CLK。
同时再将RS232的输入输出端口名修改RsRxRsTx。
最后再添加约束文件,约束引脚,保存。
产生bit流,最小系统就建好了。
NET "CLK" LOC="E3"|IOSTANDARD="LVCMOS33";NET "RESET" LOC="E16"|IOSTANDARD="LVCMOS33";NET "RsRx" LOC="C4"|IOSTANDARD="LVCMOS33";NET "RsTx" LOC="D4"|IOSTANDARD="LVCMOS33"; #OUTOUT2.在最小系统基础上添加相应的IP核。
分别是8位的Button,4位的Dip,中断控制核(AXI Interrupt Controller IP)并与micorblace的中断信号线相连(刚开始我没有做这一步,结果一节课过去了,却怎么也做不出来),将Button,Dip添加为他的中断源,button Dip设置为仅输入其他端都设置为无连接。
最后再添加相应的约束文件并保存。
NET "Dip_GPIO_IO_I_pin<0>" LOC="U9"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<1>" LOC="U8"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<2>" LOC="R7"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<3>" LOC="R6"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<4>" LOC="R5"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<5>" LOC="V7"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<6>" LOC="V6"|IOSTANDARD="LVCMOS33";NET "Dip_GPIO_IO_I_pin<7>" LOC="V5"|IOSTANDARD="LVCMOS33";NET "Button_GPIO_IO_I_pin<0>" LOC="F15"|IOSTANDARD="LVCMOS33";NET "Button_GPIO_IO_I_pin<1>" LOC="T16"|IOSTANDARD="LVCMOS33"; NET "Button_GPIO_IO_I_pin<2>" LOC="R10"|IOSTANDARD="LVCMOS33"; NET "Button_GPIO_IO_I_pin<3>" LOC="V10"|IOSTANDARD="LVCMOS33";最后输出bit流,进入SDK。
下图为文件位置,Microblaze_0地址IP核进行软件设计。
3.软件设计中断程序void PushBtnHandler(void *CallBackRef){state1=XGpio_DiscreteRead(&Btns,1);//读取按键的状态值pshBtn=1;XGpio_InterruptDisable(&Btns, 1);//暂时禁止button中断Delay_50ms();//延时50ms,忽略按键弹起再次触发的中断XGpio_InterruptClear(&Btns,1);//清除中断标志位XGpio_InterruptEnable(&Btns, 1);//再次开放按键中断}//按钮中断程序voidPushBtnHandler(void *CallBackRef){state1 = XGpio_DiscreteRead(&Btns,1);//读取按钮状态pshBtn = 1;XGpio_InterruptDisable(&Btns,1);//由于按钮按下去弹上来,是两个过程,这个时延把弹上来的中断屏蔽过去Delay_50ms();XGpio_InterruptClear(&Btns,1);//清除弹上去的中断XGpio_InterruptEnable(&Btns,1);}//开关中断程序voidSwitchHandler(void *CallBackRef){state2 = XGpio_DiscreteRead(&Dips,1);//读取中断开关状态pshDip = 1;XGpio_InterruptClear(&Dips,1);}//主程序int main(){Initialize();xil_printf("\r\nRunningGpioInputInterrupt!\r\n");while(1){if(pshBtn){xil_printf("Button Interrupt Triggered!!! The state is 0x%X\n\r",state1);pshBtn = 0;}if(pshDip){xil_printf("Switch Interrupt Triggered!!! The state is 0x%X\n\r",state2);pshDip = 0;}}return 0;}//时延程序void Delay_50ms(){inti;for(i = 0;i<5000000;i++);}//初始化代码void Initialize(){//将开关地址与程序变量绑定,并设定七为输入方式XGpio_Initialize(&Dips,XPAR_DIP_DEVICE_ID);XGpio_SetDataDirection(&Dips,1,0xff);//初始化button实例,并设定其为输入方式XGpio_Initialize(&Btns,XPAR_BUTTON_DEVICE_ID);XGpio_SetDataDirection(&Btns,1,0xff);//初始化intCtrl实例XIntc_Initialize(&intCtrl,XPAR_AXI_INTC_0_DEVICE_ID);//GPIO中断使能XGpio_InterruptEnable(&Dips,1);XGpio_InterruptGlobalEnable(&Dips);XGpio_InterruptEnable(&Btns,1);XGpio_InterruptGlobalEnable(&Btns);//对中断控制器使能XIntc_Enable(&intCtrl,XPAR_AXI_INTC_0_DIP_IP2INTC_IRPT_INTR);XIntc_Enable(&intCtrl,XPAR_AXI_INTC_0_BUTTON_IP2INTC_IRPT_INTR);//注册中断服务函数XIntc_Connect(&intCtrl,XPAR_AXI_INTC_0_DIP_IP2INTC_IRPT_INTR,(XInterruptHandler)SwitchHandler,(void *)0);XIntc_Connect(&intCtrl,XPAR_AXI_INTC_0_BUTTON_IP2INTC_IRPT_INTR,(XInterruptHandler)PushBtnHandler,(void *)0);microblaze_enable_interrupts();//允许处理器中断处理//注册中断控制器处理函数microblaze_register_handler((XInterruptHandler)XIntc_InterruptHandler,(void *)&intCtrl);XIntc_Start(&intCtrl,XIN_REAL_MODE);//启动中断控制器}查询程序设计#include "xparameters.h"#include"stdio.h"#include"xil_io.h"#include"xil_types.h"//直接配置地址//Button#define btn_data 0x40000000//button 数据寄存器地址#define btn_status 0x40000120// 控制寄存器地址#definebtn_ctr 0x40000004// 数据寄存器地址//Switch#define sw_date 0x40040000//switch 数据寄存器地址#define sw_status 0x40040120// 控制寄存器地址#define sw_ctr 0x40040004// 数据寄存器地址//时延函数void Delay_50ms();//按键标志位shortpshBtn,pshSw;int main(void){shortbtn,sw;xil_printf("\r\nRunningGpioInputInterrupt!\r\n");//将btn,sw分别设置为输入,并初始化Xil_Out8(btn_ctr,0xff);Xil_Out8(sw_ctr,0xff);pshBtn=0x00;pshSw=0x00;while(1){pshBtn=Xil_In8(btn_status);pshSw=Xil_In8(sw_status);if(pshBtn){btn= Xil_In8(btn_data);Xil_Out8(btn_status,0x01);xil_printf("Button pushed !!!The status is 0x%X\n\r",btn);}if(pshSw){sw=Xil_In8(sw_date);Xil_Out8(sw_status,0x01);xil_printf("Switch,pushed !!!The status is 0x%X\n\r",sw);}}return 0;}新建一个hello_word模板工程,将源代码删除,换成新编的代码,保存,就会自动编译,如果没有问题,就在下载到板子上。