伤城文章网 > 哲学 > 第七讲 中断_图文

第七讲 中断_图文


第七讲 中断

内容

?

中断基本编程方法 中断函数讲解

?

疑问

?

什么是中断?

?

中断的具体应用?

7.1中断基本编程方法
?

中断基本编程方法包含以下步骤: ? 1、包含必要的头文件 ? 2、使能相关片内外设,并进行基本的配置 ? 3、设置具体中断的类型或触发方式 ? 4、使能中断 ? 5、编写中断服务函数 ? 6、注册中断服务

1、 包含必要的头文件

?

有2个头文件与中断处理紧密相关,在程序中必须包含 : #include <hw_ints.h> #include <interrupt.h>

2. 使能相关片内外设,并进行基本的配置
?

对于中断源所涉及的片内外设必须要首先使能。 使 能 的 方 法 是 调 用 头 文 件 <sysctl.h> 中 的 函 数 SysCtlPeripheralEnable( )。 使能该片内外设以后,还要进行必要的基本配置。

?

?

3、设置具体中断的类型或触发方式

?

不同片内外设具体中断的类型或触发方式也各不相同。 在使能中断之前,必须对其进行正确的设置。 以GPIO为例,分为边沿触发、电平触发两大类,共5种, 这要通过调用函数GPIOIntTypeSet( )来进行设置。

?

?

4、使能中断
对于Stellaris系列ARM,使能一个片内外设的具体中 断,通常要采取分3步走的方法: ? 调用片内外设具体中断的使能函数 。 ? 调用函数IntEnable( ),使能片内外设的总中断 ? 调用函数IntMasterEnable( ),使能处理器总中断

5、编写中断服务函数
?

中断服务函数从形式上跟普通函数类似。 中断服务函数命名 对于GCC编译器下的程序,中断服务函数 的名称是事先约定好的。 例如,GPIOB端口的中断名称是GPIO_Port_B_ISR,则对应 的中断服务函数名称为void GPIO_Port_B_ISR(void),参数 和返回值都必须是void类型。

?

?

?

在Keil或IAR开发环境下,中断服务函数的名称可以由程 序员自己指定,但还是推荐采用GCC下的标准名称,这样 有利于程序移植。

中断清除
?

对于Stellaris系列ARM的所有片内外设,在进入其中断服 务函数后,中断状态并不能自动清除,而必须采用软件清 除。 如果中断未被及时清除,则在退出中断服务函数时会立即 再次触发中断而造成混乱。 清除中断的方法是调用相应片内外设的中断清除函数。例 如,GPIO端口的中断清除函数是GPIOPinIntClear( )。

?

?

中断状态查询
?

一个具体的片内外设可能存在多个子中断源,但是都共用 同一个中断向量。 例如GPIOA有8个管脚,每个管脚都可以产生中断,但是 都共用同一个中断向量号16,发生中断时都会进入同一个 中断服务函数。 为了能够准确区分每一个子中断源,就需要利用中断状态 查询函数,例如GPIO的中断状态查询函数是 GPIOPinIntStatus( )。

?

?

6. 注册中断服务函数
?

现在,中断服务函数虽然已经编写完成,但是当中断事件 产生时,程序还无法找到它,因为还缺少最后一个步骤— —注册中断服务函数。

?

注册方法需要修改启动文件,操作也不算复杂。

Keil 环境
?

在Keil开发环境下,启动文件“Startup.s”是用汇编写的以 中断服务函数“void I2C_ISR(void)”为例,找到“Vectors” 表格,根据注释内容把相应的“IntDefaultHandler”替换为 “I2C_ISR”, 并且在“Vectors”表格前面插入声明“EXTERN I2C_ISR” 完成。

?

?

在上述几个步骤完成后,就可以等待中断事件的到来了。 当中断事件产生时,程序就会自动跳转到对应的中断服务 程序中去。

7.2 中断库函数讲解

?

中断的使能与禁止 与GPIO端口中断相关的函数 中断优先级 中断服务函数的注册与注销

?

?

?

7.2.1 中断的使能与禁止

? ?

?
?

IntMasterEnable( ) IntMasterDisable( ) IntEnable( ) IntDisable( )

? ? ?

?
?

IntMasterEnable( ) 功能 使能处理器中断 原型 void IntMasterEnable(void) 参数 无 返回 无

? ? ? ? ?

IntMasterDisable( ) 功能 禁止处理器中断 原型 void IntMasterDisable(void) 参数 无 返回 无

IntEnable( )
?

函数IntEnable( )对某个片内功能模块的中断进行总体上的 使能控制。 由函数IntEnable( )进行使能控制的中断分为两大类:一类 是属于ARM Cortex-M3内核的,如NMI、SysTick等;另 一类是片内外设的,如GPIO、UART、PWM等。

?

?

在表当中,中断向量号在15以内的属于ARM Cortex-M3 内核中断,在16以上的属于Stellaris系列ARM片内外设中 断。

IntDisable( )

? ? ?

功能 :禁止一个片内外设的中断 原型: void IntDisable(unsigned long ulInterrupt) 参数 ulInterrupt:指定被使能的片内外设中断,具体取 值请参考表的描述

7.2.2 与GPIO端口相关的中断函数

?

GPIOIntTypeSet( )
GPIOPinIntEnable( ) GPIOPinIntClear( )

?

?

?

GPIOPinIntStatus( )

1、GPIOIntTypeSet( )
? ?

功能:设置所选GPIO端口指定引脚的中断触发方式。 原型:void GPIOIntTypeSet(unsigned long ulPort , unsigned char ucPins, unsigned long ulIntType)

?

?
?

ulPort:所选GPIO端口的基址 ucPins:指定具体的管脚
ulIntType:指定中断触发机制的类型。

ulIntType
ulIntType是指定中断触发机制的类型,应当取下列值之一: ? GPIO_FALLING_EDGE //下降沿触发中断 ? GPIO_RISING_EDGE //上升沿触发中断 ? GPIO_BOTH_EDGES //双边沿触发中断 ? GPIO_LOW_LEVEL//低电平触发中断 ? GPIO_HIGH_LEVEL //高电平触发中断

2、GPIOPinIntEnable( )
? ?

功能:使能所选GPIO端口指定引脚的中断 函数原型:void GPIOPinIntEnable (unsigned long ulPort , unsigned char ucPins)
?

?

ulPort:所选GPIO端口的基址 ucPins:指定具体的管脚

GPIOPinIntClear()
? ?

功能:清除所选GPIO端口指定引脚的中断 函数原型:void GPIOPinIntClear(GPIOIntTypeSet(unsigned long ulPort , unsigned char ucPins)

7.2.3 优先级相关函数
?

ARM Cortex-M3处理器内核可以配置的中断优先级最多可 以有256级。 虽然Stellaris系列ARM只实现了8个中断优先级,但对于 一个实际的应用来说已经足够了。 在较为复杂的控制系统中,中断优先级的设置会显得非常 重要。

?

?

?

当多个中断源同时产生时,优先级最高的中断首先被处理 器响应并得到处理。 正在处理较低优先级中断时,如果有较高优先级的中断产 生,则处理器立即转去处理较高优先级的中断。 正在处理的中断不能被同级或较高优先级的中断所打断。

?

?

1、IntPrioritySet( )
功能:设置一个中断的优先级 。 ? 原型:void IntPrioritySet(unsigned long ulInterrupt , unsigned char ucPriority) ? 参数ulInterrupt:指定的中断源。 ? ucPriority:要设定的优先级,应当取值(0~7) << 5, 数值越小优先级越高。 ? 返回值:无

?

IntPriorityGet( )
功能:获取一个中断的优先级 原型 :long IntPriorityGet(unsigned long ulInterrupt) 参数 ulInterrupt:指定的中断源,具体取值请参考返回 : 返回中断优先级数值,该返回值除以32后才能得到优先 级数0~7。如果指定了一个无效的中断,则返回-1。

? ? ?

7.2.4 中断服务函数的注册与注销

?

IntRegister( )
IntUnregister( )

?

1、IntRegister( )
? ?

?

? ?

功能: 注册一个中断出现时被调用的函数 原型 :void IntRegister(unsigned long ulInterrupt , void (*pfnHandler)(void)) 参数 ulInterrupt:指定的中断源,具体取值请参考表5 的描述 pfnHandler:指向中断产生时被调用函数的指针 返回 :无

2、IntRegister( )

?
? ?

?

功能:注销一个中断出现时被调用的函数 原型void IntUnregister(unsigned long ulInterrupt) 参数ulInterrupt:指定的中断源,具体取值请参考表5的 描述 返回 :无

举例:按键中断实例

#include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "grlib/grlib.h" #include "drivers/kitronix320x240x16_ssd2119_8bit.h" #include "drivers/set_pinout.h" void delay(int d)//延时函数 { for( ; d; --d); } void IntGPIOj(void)//中断服务程序 { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3); delay(2000000);//延时 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,~GPIO_PIN_3); delay(2000000);//延时 }

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, GPIO_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) { } }


搜索更多“第七讲 中断_图文”

网站地图

All rights reserved Powered by 伤城文章网 5xts.com

copyright ©right 2010-2021。
伤城文章网内容来自网络,如有侵犯请联系客服。zhit325@126.com