《第七讲中断精选PPT.ppt》由会员分享,可在线阅读,更多相关《第七讲中断精选PPT.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七讲中断第1页,本讲稿共39页内容n中断基本编程方法n中断函数讲解第2页,本讲稿共39页疑问n什么是中断?n中断的具体应用?第3页,本讲稿共39页7.1中断基本编程方法 n中断基本编程方法包含以下步骤:q1、包含必要的头文件 q2、使能相关片内外设,并进行基本的配置 q3、设置具体中断的类型或触发方式q4、使能中断q5、编写中断服务函数q6、注册中断服务第4页,本讲稿共39页1、包含必要的头文件n有2个头文件与中断处理紧密相关,在程序中必须包含:#include#include 第5页,本讲稿共39页2 使能相关片内外设,并进行基本的配置 n对于中断源所涉及的片内外设必须要首先使能。n使 能
2、 的 方 法 是 调 用 头 文 件 中 的 函 数 SysCtlPeripheralEnable()。n使能该片内外设以后,还要进行必要的基本配置。第6页,本讲稿共39页3、设置具体中断的类型或触发方式n不同片内外设具体中断的类型或触发方式也各不相同。n在使能中断之前,必须对其进行正确的设置。n以GPIO为例,分为边沿触发、电平触发两大类,共5种,这要通过调用函数GPIOIntTypeSet()来进行设置。第7页,本讲稿共39页4、使能中断 对于Stellaris系列ARM,使能一个片内外设的具体中断,通常要采取分3步走的方法:q调用片内外设具体中断的使能函数。q调用函数IntEnable(
3、),使能片内外设的总中断 q调用函数IntMasterEnable(),使能处理器总中断 第8页,本讲稿共39页5、编写中断服务函数 n中断服务函数从形式上跟普通函数类似。n中断服务函数命名 对于GCC编译器下的程序,中断服务函数的名称是事先约定好的。n例如,GPIOB端口的中断名称是GPIO_Port_B_ISR,则对应的中断服务函数名称为void GPIO_Port_B_ISR(void),参数和返回值都必须是void类型。第9页,本讲稿共39页n在Keil或IAR开发环境下,中断服务函数的名称可以由程序员自己指定,但还是推荐采用GCC下的标准名称,这样有利于程序移植。第10页,本讲稿共3
4、9页q对于Stellaris系列ARM的所有片内外设,在进入其中断服务函数后,中断状态并不能自动清除,而必须采用软件清除。q如果中断未被及时清除,则在退出中断服务函数时会立即再次触发中断而造成混乱。q清除中断的方法是调用相应片内外设的中断清除函数。例如,GPIO端口的中断清除函数是GPIOPinIntClear()。中断清除 第11页,本讲稿共39页n一个具体的片内外设可能存在多个子中断源,但是都共用同一个中断向量。n例如GPIOA有8个管脚,每个管脚都可以产生中断,但是都共用同一个中断向量号16,发生中断时都会进入同一个中断服务函数。n为了能够准确区分每一个子中断源,就需要利用中断状态查询函
5、数,例如GPIO的中断状态查询函数是GPIOPinIntStatus()。中断状态查询第12页,本讲稿共39页6.注册中断服务函数n现在,中断服务函数虽然已经编写完成,但是当中断事件产生时,程序还无法找到它,因为还缺少最后一个步骤注册中断服务函数。n注册方法需要修改启动文件,操作也不算复杂。第13页,本讲稿共39页Keil 环境环境n在Keil开发环境下,启动文件“Startup.s”是用汇编写的以 中 断 服 务 函 数“void I2C_ISR(void)”为 例,找 到“Vectors”表 格,根 据 注 释 内 容 把 相 应 的“IntDefaultHandler”替换为“I2C_I
6、SR”,n并且在“Vectors”表格前面插入声明“EXTERN I2C_ISR”完成。第14页,本讲稿共39页n在上述几个步骤完成后,就可以等待中断事件的到来了。当中断事件产生时,程序就会自动跳转到对应的中断服务程序中去。第15页,本讲稿共39页7.2 中断库函数讲解 n中断的使能与禁止 n与GPIO端口中断相关的函数n中断优先级 n中断服务函数的注册与注销第16页,本讲稿共39页7.2.1 中断的使能与禁止qIntMasterEnable()qIntMasterDisable()qIntEnable()qIntDisable()第17页,本讲稿共39页nIntMasterEnable()n
7、功能 使能处理器中断 n原型 void IntMasterEnable(void)n参数 无 n返回 无 nIntMasterDisable()n功能 禁止处理器中断 n原型 void IntMasterDisable(void)n参数 无 n返回 无 第18页,本讲稿共39页n函数IntEnable()对某个片内功能模块的中断进行总体上的使能控制。n由函数IntEnable()进行使能控制的中断分为两大类:一类是属于ARM Cortex-M3内核的,如NMI、SysTick等;另一类是片内外设的,如GPIO、UART、PWM等。IntEnable()第19页,本讲稿共39页n在表当中,中断向
8、量号在15以内的属于ARM Cortex-M3内核中断,在16以上的属于Stellaris系列ARM片内外设中断。第20页,本讲稿共39页第21页,本讲稿共39页第22页,本讲稿共39页第23页,本讲稿共39页q功能:禁止一个片内外设的中断 q原型:void IntDisable(unsigned long ulInterrupt)q参数 ulInterrupt:指定被使能的片内外设中断,具体取值请参考表的描述 IntDisable()第24页,本讲稿共39页7.2.2 与GPIO端口相关的中断函数nGPIOIntTypeSet()nGPIOPinIntEnable()nGPIOPinIntC
9、lear()nGPIOPinIntStatus()第25页,本讲稿共39页1、GPIOIntTypeSet()q功能:设置所选GPIO端口指定引脚的中断触发方式。q原型:void GPIOIntTypeSet(unsigned long ulPort,unsigned char ucPins,unsigned long ulIntType)qulPort:所选GPIO端口的基址 qucPins:指定具体的管脚qulIntType:指定中断触发机制的类型。第26页,本讲稿共39页ulIntType是指定中断触发机制的类型,应当取下列值之一:qGPIO_FALLING_EDGE/下降沿触发中断qG
10、PIO_RISING_EDGE/上升沿触发中断qGPIO_BOTH_EDGES/双边沿触发中断qGPIO_LOW_LEVEL/低电平触发中断qGPIO_HIGH_LEVEL/高电平触发中断ulIntType第27页,本讲稿共39页2、GPIOPinIntEnable()n功能:使能所选GPIO端口指定引脚的中断n函数原型:void GPIOPinIntEnable(unsigned long ulPort,unsigned char ucPins)qulPort:所选GPIO端口的基址 qucPins:指定具体的管脚第28页,本讲稿共39页GPIOPinIntClear()n功能:清除所选GP
11、IO端口指定引脚的中断n函数原型:void GPIOPinIntClear(GPIOIntTypeSet(unsigned long ulPort,unsigned char ucPins)第29页,本讲稿共39页7.2.3 优先级相关函数 nARM Cortex-M3处理器内核可以配置的中断优先级最多可以有256级。n虽然Stellaris系列ARM只实现了8个中断优先级,但对于一个实际的应用来说已经足够了。n在较为复杂的控制系统中,中断优先级的设置会显得非常重要。第30页,本讲稿共39页n当多个中断源同时产生时,优先级最高的中断首先被处理器响应并得到处理。n正在处理较低优先级中断时,如果有
12、较高优先级的中断产生,则处理器立即转去处理较高优先级的中断。n正在处理的中断不能被同级或较高优先级的中断所打断。第31页,本讲稿共39页n功能:设置一个中断的优先级。q原型:void IntPrioritySet(unsigned long ulInterrupt,unsigned char ucPriority)q参数ulInterrupt:指定的中断源。qucPriority:要设定的优先级,应当取值(07)5,数值越小优先级越高。q返回值:无 1、IntPrioritySet()第32页,本讲稿共39页q功能:获取一个中断的优先级 q原型:long IntPriorityGet(unsi
13、gned long ulInterrupt)q参数 ulInterrupt:指定的中断源,具体取值请参考返回:返回中断优先级数值,该返回值除以32后才能得到优先级数07。如果指定了一个无效的中断,则返回-1。IntPriorityGet()第33页,本讲稿共39页7.2.4 中断服务函数的注册与注销 nIntRegister()nIntUnregister()第34页,本讲稿共39页1、IntRegister()q功能:注册一个中断出现时被调用的函数 q原型:void IntRegister(unsigned long ulInterrupt,void(*pfnHandler)(void)q参
14、数 ulInterrupt:指定的中断源,具体取值请参考表5的描述 qpfnHandler:指向中断产生时被调用函数的指针 q返回:无第35页,本讲稿共39页q功能:注销一个中断出现时被调用的函数 q原型void IntUnregister(unsigned long ulInterrupt)q参数ulInterrupt:指定的中断源,具体取值请参考表5的描述 q返回:无 2、IntRegister()第36页,本讲稿共39页举例:按键中断实例第37页,本讲稿共39页#include inc/hw_ints.h#include inc/hw_memmap.h#include inc/hw_ty
15、pes.h#include driverlib/gpio.h#include driverlib/interrupt.h#include driverlib/sysctl.h#include grlib/grlib.h#include drivers/kitronix320 x240 x16_ssd2119_8bit.h#include drivers/set_pinout.hvoid delay(int d)/延时函数 for(;d;-d);void IntGPIOj(void)/中断服务程序 GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_
16、3);delay(2000000);/延时 GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3);delay(2000000);/延时第38页,本讲稿共39页int main(void)SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);/使能外设GPIOF GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_3,GP
17、IO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);GPIODirModeSet(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_DIR_MODE_OUT);GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3);SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);GPIOPadConfigSet(GPIO_PORTJ_BASE,GPIO_PIN_7,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);/设置PJ7为2MA,上拉输入 GPIODirModeSet(GPIO_PORTJ_BASE,GPIO_PIN_7,GPIO_DIR_MODE_IN);/设置GPIO输入 GPIOIntTypeSet(GPIO_PORTJ_BASE,GPIO_PIN_7,GPIO_RISING_EDGE);/设置GPIO中断 GPIOPinIntEnable(GPIO_PORTJ_BASE,GPIO_PIN_7);/使能KEY所在管脚的中断 IntEnable(INT_GPIOJ);/使能GPIOJ端口中断 IntMasterEnable();/使能处理器中断 while(1)第39页,本讲稿共39页