3.3《十天学会LM4F232,玩转CORTEX M4 》中断使用

合集下载

Cortex-M4的中断与异常处理

Cortex-M4的中断与异常处理

Cortex-M4的中断与异常处理11.4.3异常模式11.4.3.1异常状态不活跃.这种异常是不活跃,不等待。

等待.例外的是等待由处理器处理。

来⾃外设或软件的中断请求可以将相应的中断状态更改为挂起。

活跃。

这种异常是被服务处理器,但还没有完成。

异常处理程序可以中断另⼀个异常处理程序的执⾏。

在这种情况下,两个异常都处于活动状态。

活跃和等待。

该异常服务由处理器和存在来⾃相同源的现⾏异常。

11.4.3.2异常类型重置异常。

重置是⼀种复位调⽤上电或热复位。

这种异常模式将复位作为⼀种特殊形式。

当发⽣复位时,处理器运⾏停⽌,有可能在⼀个指令的任何点。

当复位置为⽆效,重新开始执⾏从向量表中复位⼊⼝的地址。

执⾏是特权执⾏的线程模式。

NMI异常。

⾮屏蔽中断(NMI)可以通过⼀个外设或由软件触发发出信号。

这是最⾼优先级的异常,⽐其他复位都⾼。

它是永久启⽤并拥有-2⼀个固定的优先级。

NMI不能被掩蔽或通过任何其它异常阻⽌激活,也不能被通过⽐复位之外的任何异常抢占。

硬故障的发⽣是由于异常处理期间有错误的异常,或者因为异常不能被任何异常机制管理。

硬故障拥有-1固定的优先级,这意味着他们有更⾼的优先级⽐配置优先级的任何异常。

内存管理故障。

内存管理故障的发⽣是由于内存保护相关的故障异常引起的。

该MPU或固定存储器保护限制决定了该故障指令和数据存储器事务。

该故障⽤来取消指令对不执⾏(XN)存储区域的操作,即使MPU被禁⽤。

总线故障。

总线故障的发⽣是因为⼀个指令或数据存储器事务的存储器相关的故障异常。

这可能是由⼀个总线上的存储器系统中检测到错误。

应⽤故障。

应⽤故障是因为涉及到指令执⾏的故障发⽣了异常,包括:未定义指令;⼀个⾮法的未对齐访问;⽆效状态的指令执⾏;异常返回⼀个错误。

SVCall异常。

系统调⽤(SVC)是由SVC指令触发了异常。

在OS环境,应⽤程序可以使⽤SVC指令来访问OS内核函数和器件驱动。

PendSV异常。

PendSV的是系统级的服务中断驱动的请求。

cortex-m3异常和中断

cortex-m3异常和中断

0.前言本文想解决的问题有:•如何开启、关闭中断•如何开启、关闭异常•LPC177x/8x支持的中断优先级个数•复位后,异常/中断默认的优先级•如何设置异常/中断的优先级•什么是优先级组,如何设置优先级组,复位后的优先级组1. Cortex-M3的异常/中断屏蔽寄存器组注:只有在特权级下,才允许访问这3个寄存器。

名字功能描述PRIMASK 只有单一比特的寄存器。

置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault可以响应。

默认值是0,表示没有关闭中断。

FAULTMASK 只有单一比特的寄存器。

置为1后,只有NMI可以响应。

默认值为0,表示没有关异常。

BASEPRI 该寄存器最多有9位(由表达优先级的位数决定)。

定义了被屏蔽优先级的阈值。

当它被设置为某个值后,所有优先级号大于等于此值的中断都被关。

若设置成0,则不关断任何中断,0为默认值。

注:寄存器BASEPRI的有效位数受系统中表达优先级的位数影响,如果系统中只使用3个位来表达优先级,则BASEPRI有意义的值仅为0x00、0x20、0x40、0x60、0x80、0xA0、0xC0和0xE0使用MRS/MSR指令访问这三个寄存器,比如:MRS R0, BASEPRI ;读取BASEPRI到R0中MSR BASEPRI, R0 ;将R0数据写入到BASEPRI中为了快速的开关中断,CM3还专门设置了一条CPS指令,有四种用法:CPSID I ;PRIMASK=1,关中断CPSIE I ;PRIMASK=0,开中断CPSID F ;FAULTMASK=1,关异常CPSIE F ;FAULTMASK=0,开异常CMSIS-M3微控制器软件接口标准中的core_cm3.h给出了开关中断或异常的函数:1.1 开/关中断1:/**2: * @brief Set the Priority Mask value3: *4: * @param priMask PriMask5: *6: * Set the priority mask bit in the priority mask register7: */8:static __INLINE void __set_PRIMASK(uint32_t priMask)9: {10:register uint32_t __regPriMask __ASM("primask");11: __regPriMask = (priMask);12: }使用__set_PRIMASK(1)关闭中断;__setPRIMASK(0)开启中断。

cortex中断函数定义

cortex中断函数定义

cortex中断函数定义Cortex中断函数定义Cortex中断函数是在ARM Cortex-M系列微控制器中用于处理中断事件的函数。

中断是一种事件驱动的机制,当特定的事件发生时,系统会立即跳转到相应的中断服务函数进行处理。

在Cortex-M系列微控制器中,中断函数的定义有一定的规范和要求,以确保中断处理的正确性和可靠性。

中断函数的定义需要遵循一定的格式。

在Cortex-M系列微控制器中,通常会使用汇编语言编写中断服务函数。

汇编语言是一种低级别的语言,可以直接操作硬件,提供了更高的灵活性和效率。

因此,中断函数的定义通常会以汇编语言的形式呈现。

在定义中断函数时,需要注意保存和恢复CPU寄存器的状态。

由于中断处理过程中,系统会跳转到中断服务函数执行,因此需要保存当前CPU的寄存器状态,以便在中断处理完毕后能正确恢复。

在Cortex-M系列微控制器中,一般会使用堆栈来保存和恢复寄存器状态。

中断函数的定义还需要根据具体的中断事件进行相应的处理。

不同的中断事件可能需要不同的处理方式和操作。

例如,外部中断事件可能需要读取外部输入信号的状态;定时器中断事件可能需要更新定时器的计数值;串口中断事件可能需要读取或发送数据等。

因此,在定义中断函数时,需要根据具体的中断事件进行相应的操作。

中断函数的定义还需要考虑中断优先级和嵌套中断的情况。

Cortex-M系列微控制器支持多级中断优先级,不同的中断事件可以设置不同的优先级,以确保高优先级的中断能够优先处理。

同时,中断函数的定义还需要考虑可能发生的嵌套中断情况,即在一个中断处理过程中,可能会发生其他中断事件。

在这种情况下,需要正确处理嵌套中断的优先级和顺序。

中断函数的定义还需要考虑中断处理的结束条件和返回方式。

在中断处理完毕后,需要恢复中断处理前的状态,并返回到中断发生前的执行点。

在Cortex-M系列微控制器中,通常会使用特定的汇编指令来实现中断的结束和返回。

总结起来,Cortex中断函数的定义需要遵循一定的格式和规范,包括保存和恢复CPU寄存器的状态、根据具体中断事件进行相应的操作、考虑中断优先级和嵌套中断的情况,以及正确处理中断的结束和返回。

基于ARM Cortex-M4的MQX中断机制深度剖析

基于ARM Cortex-M4的MQX中断机制深度剖析

// 是否有 \
的 空
/\
mq x_ e x i t 函


退 出 MQX
管理 系统 的初始
调 用 mq x e x i t 函 数
_
例程
S R执 行流程 ,着 【 关键 词 】中断机 制 稀疏 中断 向量 中断服 务 解 析,给出了中断机制内核 I 重分析 了任务与中断间的切换 以及 中断嵌套处 理的执行过程 。对 MQ X 中断机制的精度解析
退 出 M QX 图2 :M Q X中断 环境 初 始化 流 程 图
为后继 MQ X实时性分析 、任 务调度过程分析
1引言
近年 来 ,众多 芯片 厂商 逐步 加大 了对 其
等进一步研究工作做 了良好的前期铺垫。
2 M O X 中 断处 理 机 制
硬件中断向量表文件 “ . . \ 0 3 MC U' , v e c t o r s .
( P e n d a b l e S u p e vi r s o r ,P e n d S V) 这 两 个 异 常
护和 免 费的技术 支持 ,至 2 0 1 4年 2月推 出最 新版本 4 . 1 . 0 ,MQX 以其开源、免 费等突出特 性逐步得到 了业界 的认可 。 操 作系 统中性 能 卓越 的 中断机 制使 得系 统 的 高实时 响应 、并 发 多任务 处理 、基 于优 先 级 的任务 中断 抢 占等 功能 得 以实现 。在众 多 研 究文献 中,对 中 断机制 的 研 究集 中在对 A r m 架构下 L i n u x开 发 环 境 的 实 时 性 研 究 ,如 吴迅等利 用中断机制对实时操作系统实时性能
内核组成 。其 中断过程分 为两步,首先,模块 Байду номын сангаас断源 向中断控 制器 ( NV1 C)发 出中断 请求

CORTEX-M4知识点总结

CORTEX-M4知识点总结

Cortex-M4内核知识点总结余明目录Cortex-M4内核知识点总结 (1)1 ARM处理器简介 (5)2 架构 (6)2.1架构简介 (6)2.2编程模型 (6)2.3存储器系统 (9)2.4复位和复位流程 (13)3 指令集 (15)3.1 CM4指令集特点 (15)3.2 Cortex-M处理器间的指令集比较 (15)3.3 汇编指令简要介绍 (15)3.3.1 处理器内传送数据 (15)3.3.2 存储器访问指令 (16)3.3.3 算数运算 (17)3.3.4 逻辑运算 (18)3.3.5 移位 (18)3.3.6 异常相关指令 (18)4 存储器系统 (19)4.1 存储器外设 (19)4.2 Bootloader (19)4.3位段操作 (20)4.4 存储器大小端 (20)5 异常和中断 (22)5.1 中断简介 (22)5.2异常类型 (22)5.3 中断管理 (23)5.4 异常或中断屏蔽寄存器 (24)5.4.1 PRIMASK (24)5.4.2 FAULMASK (M0中无) (24)5.4.3 BASEPRI(M0中无) (24)5.5 中断状态及中断行为 (24)5.5.1 中断状态 (24)5.5.2 中断行为 (25)5.6 各Cortex-M处理器NVIC差异 (27)6 异常处理 (29)6.1 C实现的异常处理 (29)6.2 栈帧 (29)6.3 EXC_RETURN (30)6.4异常流程 (31)6.4.1 异常进入和压栈 (31)6.4.2 异常返回和出栈 (32)7 低功耗和系统控制特性 (33)7.1 低功耗模式 (33)7.1 SysTick定时器 (33)8 OS支持特性 (35)8.1 OS支持特性简介 (35)8.2 SVC和PendSV (35)8.3 实际的上下文切换 (36)1 ARM处理器简介ARM处理器的种类很多,从手机上的高端处理器芯片到面向微控制器的芯片,都有ARM的身影。

STM32F4事件和中断使用步骤

STM32F4事件和中断使用步骤

STM32F4事件和中断使用步骤事件的产生过程和中断的产生过程一样可由EXTI_InitStructure.EXTI_Mode来配置为中断模式或事件模式1中断模式是通过一系列过程产生,然后等待处理器来干某件事情2事件模式是通过一系列过程产生,产生的是一个事件(比如一个方波或唤醒闹钟)外部中断:步骤1 嵌套向量中断控制器 NVIC 配置1)定义中断/事件初始化类型结构体(已定义在misc文件里)NVIC_InitTypeDef NVIC_InitStructure;2)定义在那个中断线NVIC_InitStructure.NVIC_IRQChannel=3)指定中断抢占优先级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4)指定中断响应子优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=5)使能中断通道NVIC_InitStructure.NVIC_IRQChannelCmd=6)调用中断初始化函数NVIC_Init(&NVIC_InitStructure);步骤2 EXTI外部中断/事件控制配置1)定义外部中断/事件初始化结构体EXTI_InitTypeDef EXTI_InitStructure;已定义在xxx_exti文件2)外部中断对应GPIO引脚初始化配置3)启用SYSCFG所在总线的时钟RCC_APB2PeriphClockCmd();已定义在xxx_rcc文件里4)调用步骤1配置NVIC5)连接GPIO引脚到外部中断线SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx,EXTI_PinSou rcex);已定义在xxx_syscfg文件6)初始化外部中断/事件结构体的成员EXTI_InitStructure.EXTI_Line=EXTI_Linex;//中断线xEXTI_InitStructure.EXTI_Mode=; //中断模式或事件模式xxx_exti文件里EXTIMode_TypeDef结构体EXTI_InitStructure.EXTI_Trigger=; //触发方式上升,下降,边沿在EXTITrigger_TypeDef结构体EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断线的状态启用或禁用(DISABLE)EXTI_Init(&EXTI_InitStructure);//依据上面的参数初始化已在xxx_exti文件里定义。

STM32F4学习笔记之EXTI中断(使用固件库)

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;//优先级最低
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
批注本地保存成功开通会员云端永久保存去开通
1.使能SYSSCFG和对应GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
2.配置对应GPIO为输入模式
NVIC_InitStructure.NVIC_IRQChannelSubPriority = xx;

M0M4中断优先级设置问题

在咱们嵌入式工程应用中,中断作为最经常使用的异步手腕是必不可少的,而且在一个应用程序中,一个中断往往是不够用的,多个中断混合利用乃最多级中断嵌套也常常会利用到,而如此就涉及到一个中断优先级的问题。

以咱们最熟悉的Cortex-M系列为例,咱们明白ARM从Cortex-M系列开始引入了NVIC 的概念(Nested Vectors Interrupts Controller),即嵌套向量中断操纵器,以它为核心通过一张中断向量表来操纵系统中断功能,NVIC能够提供以下几个功能:1)可嵌套中断支持;2)向量中断支持;3)动态优先级调整支持;4)中断可屏蔽。

抛开其他不谈,那个地址咱们只说说中断优先级的问题。

咱们明白NVIC的核心工作原理即是对一张中断向量表的保护上,其中M4最多支持240+16个中断向量,M0+那么最多支持32+16个中断向量,而这些中断向量默许的优先级那么是向量号越小的优先级越高,即从小到大,优先级是递减的。

可是咱们确信可不能知足于默许的状态(人往往不知足于约束,换句俗语说确实是不喜爱按套路出牌,呵呵),而NVIC那么恰恰提供了这种灵活性,即支持动态优先级调整,不管是M0+仍是M4除3个中断向量之外(复位、NMI和HardFault,他们的中断优先级为负数,它们3个的优先级是最高的且不可更改),其他中断向量都是能够动态调整的。

只是需要注意的是,中断向量表的前16个为内核级中断,以后的为外部中断,而内核级中断和外部中断的优先级那么是由两套不同的寄放器组来操纵的,其中内核级中断由SCB_SHPRx 寄放器来操纵(M0+为SCB_SHPR[2:3],M4为SCB_SHPR[1:3]),外部中断那么由NVIC_IPRx来操纵(M0+为NVIC_IPR[0:7],M4为NVIC_IPR[0:59]),如以下图所示:M0+中断优先级寄放器:M4中断优先级寄放器:其中M4所支持的动态优先级范围为0~15(8位中只有高四位[7:4]才有效),而M0+所支持的动态优先级范围那么为0~3(8位中只有高两位[7:6]才有效),而且秉承着号越小优先级越高的原那么(0最高,15或3为最小),同时也间接说明了什么缘故复位(-3)、NMI(-2)和HardFault(-1)优先级最高的缘故,很简单,人家都是负的了,谁还能比他们高,呵呵,而且这三位中复位优先级最高,NMI第二,HardFault最低(那个最低仅限于这三者)。

微处理器9CortexM3异常(中断)处理


Cortex-M3的异常(中断)处理
优先级分组
为了对具有大量中断的系统加强优先级控制,NVIC
支持优先级分组机制。您可以使用应用中断和复位控制寄 存器中的PRIGROUP区来将每个PRI_N中的值分为占先优
先级区和次优先级区。我们将占先优先级称为组优先级。 如果有多个挂起异常共用相同的组优先级,则需使用次优 先级区来决定同组中的异常的优先级,这就是同组内的次 优先级。组优先级和次优先级的结合就是通常所说的优先 级。如果两个挂起异常具有相同的组优先级,则挂起异常 的编号越低优先级越高。这与优先级机制是一致的。
Cortex-M3的异常(中断)处理
优先级分组
中断优先级区(PRI_N[7:0])
占先区
次优先区
PRI_N 7 6 5 4 3 2 1 0
注意: 修改PRIGROUP区的值可改变占先区和 次优先区的位数。
1. 占先优先级又称 为组优先级
2. 如果两个挂起异 常具有相同的组 优先级,则挂起 异常的编号越低 优先级越高。
Cortex-M3的异常(中断)处理
优先级分组
PRIGROU P[2:0]
二进制点 的位置
中断优先级区,PRI_N[7:0]
占先区 次优先 占先优先级
级区
的数目
次优先级 的数目
b000
bxxxxxxx.y [7:1] [0]
128
2
b001
bxxxxxx.yy [7:2] [1:0] 64
4
b010
Cortex-M3的异常(中断)处理
返回
异常基于优先级的动作
在没有挂起异常或没有比被压栈的ISR优先级更高 的挂起异常时,处理器执行出栈操作,并返回到被压 栈的ISR或线程模式。

arm cortex-m中断处理流程

ARM Cortex—M处理器家族是一组为嵌入式系统制造的32位处理器。

这些处理器被用在很多诸如IOT设备,设备,汽车等等的东西中。

Cortex—M处理器的一个酷点是它们能处理中断,这意味着它们能对事件迅速作出反应。

在文章中,我们将讨论Cortex—M处理器如何
处理中断,我们将专注于所涉及的步骤和概念。

当一个Cortex—M处理器中断时,就像在电子游戏上按下暂停按钮。

处理器很快地将它所做的一切保存在堆栈上,类似于在游戏中保存你
的进度。

它记得它在哪里,它在做什么,和所有重要的环境。

是时候找出真正造成中断的原因了。

处理器检查其特殊的内存图称为
中断矢量表,这就像一个导致不同中断服务常规(ISR)的藏宝图。

这就像在游戏中寻找正确的路径来解决特定的挑战。

一旦处理器知道哪一个ISR去,就像跳进游戏的新关卡。

它开始执行
中断处理器代码,这就像用一套新的指令处理一个新的任务。

就像在
游戏中,处理器可以永远回到它留下的地方,继续冒险!
在ARM Cortex—M的微妙舞蹈中,中断处理是一种优雅的芭蕾舞,
它拯救了现在的时刻,从迷人的矢量台上寻找ISR的悄悄位置区域,
并跳入ISR的等待怀里,执行中断处理者的卡住密码。

这种受试过程
使处理器能够以优雅和高效的空气来响应外部事件的呼唤,将Cortex—M处理器铸成实时嵌入系统的发光星。

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

III
青风 QF-LM4F232
V1.0 开发手册
3.3.4 程序下载及使用说明: 1.打开工程项目: QF-LM4F232\Code\QFLM4F232仿真器 3.在 keil 中选择仿真下载器类型 4.点击 KEIL 中的 DOWNLOAD 下载成功后:
II
青风 QF-LM4F232
V1.0 开发手册
这里面需要详细介绍下: 按上面总结的三步骤编写中断处理: void GPIO_IN(void)//中断处理子函数 { unsigned char ucVal; unsigned long ulStatus;//中断状态标识 ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true); // 读取中断状态 GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus); // 清除中断状态,重要 if (ulStatus & PIN2) // 如果 KEY 的中断状态有效 { ucVal = GPIOPinRead(GPIO_PORTB_BASE, PIN1); // 翻转 LED GPIOPinWrite(GPIO_PORTB_BASE, PIN1, ~ucVal); SysCtlDelay(10*(TheSysClock/ 3000)); // 延时约 10ms,消除按键抖动 while (GPIOPinRead(GPIO_PORTB_BASE, PIN2) == 0x00); // 等待 KEY 抬起 SysCtlDelay(10*(TheSysClock/ 3000)); // 延时约 10ms,消除松键抖动 } } /////////////////////////////////////////////////// int main(void) { SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);//设置系统时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//初始化外设 GPIO GPIOPadConfigSet(GPIO_PORTB_BASE, PIN1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);// 设置 PB5 为 2MA,推挽输出 GPIOPadConfigSet(GPIO_PORTB_BASE,PIN2,GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);// 设置 PB4 为 2MA,上拉输入 GPIODirModeSet(GPIO_PORTB_BASE, PIN1, GPIO_DIR_MODE_OUT); //设置 GPIO 输出模式 GPIODirModeSet(GPIO_PORTB_BASE, PIN2, GPIO_DIR_MODE_IN); //设置 GPIO 输入模式 GPIOIntTypeSet(GPIO_PORTB_BASE, PIN2, GPIO_LOW_LEVEL);//设置 GPIO 中断 GPIOPinIntEnable(GPIO_PORTB_BASE, PIN2); // 使能 KEY 所在管脚的中断 IntEnable(INT_GPIOB); // 使能 GPIOB 端口中断 IntMasterEnable(); // 使能处理器中断 for(;;) // 等待 KEY 中断 { }; } 最后在:startup.s 文件中声明外部中断 EXTERN GPIO_INT 这样,一个简单的 GPIO 中断函数就编写完成了,包括按键控制。按键控制和单片机一样 加入延迟进行消抖,这里面使用了一个库函数定义过的函数:SysCtlDelay 在函数文件: sysctl.c 函数中通过汇编语言定义的一个延迟函数。 TheSysClock 的大小, 大家可以提前定 义。这个设置在以后系统设置中详细讲述。
青风 QF-LM4F232
V1.0 开发手册
3.3 按键输入与中断控制
3.3.1 原理分析: 3.3.2 硬件设计: 3.3.3 软件设计: 3.3.4 程序下载及使用说明: 3.3.1 原理分析: 按键的输入其实就是对 GPIO 口进行操作。3.1 节就对 GPIO 的就进行了初步介绍,下面 我们主要通过 GPIO 口的变化触发外部中断,来控制 LED 灯的状态。 中断是指由于接收到来自外围硬件 (相对于中央处理器和内存) 的异步信号或来自软件 的同步信号, 而进行相应的硬件/软件处理。 发出这样的信号称为进行中断请求 (interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行 状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为 CPU 指令集中 的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。 中断在计算机多任务处理,尤其是实时系统中尤为有用,这样的系统,包括运行于其上 的操作系统,也被称为“中断驱动的”。简单的来说就比如某个人正在做某事,突然来了个 电话,他就要停下手中的事情去接电话,中断相当于这个电话。触发中断后跳出原来运行的 程序去执行中断处理。首先这里我们先来学习软件中断:GPIO 中断处理。以后再其他功能 中在探讨其他事件中断。 3.3.2 硬件设计: 中断处理电路十分简单, 下图就是我们在 QF-LM4F232 开发板上设计的用户中断按键, 采 用 5 向按键,同时提供了 5 个用户按键。
I
青风 QF-LM4F232
V1.0 开发手册
对于单片机来说,很简单,开中断即可。但 LM4F 却有所不同。LM4F 系列中断需要设置具体 中断的类型或触发方式, 不同片内外设具体中断的类型或触发方式也各不相同。 在使能中断 之前,必须对其进行正确的设置。以 GPIO 为例,分为边沿触发、电平触发两大类,共 5 种. 基本库函数介绍: 1.GPIOIntTypeSet( )设置指定管脚的中断类型。 函数原型: void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulIntType) 参数: ulPort 是 GPIO 端口的基址。 ucPins 是特定管脚的位组合(bit-packed)表示。 ulIntType 指定中断触发机制的类型。 描述: 这个函数为所选 GPIO 端口上特定的管脚设置不同的中断触发机制。 参数 ulIntType 是一个枚举数据类型,它可以是下面其中的一个值: GPIO_FALLING_EDGE ; GPIO_RISING_EDGE ; GPIO_BOTH_EDGES ; GPIO_LOW_LEVEL; GPIO_HIGH_LEVEL。 在上面的值中,不同的值描述了中断检测机制(边沿或电平)和特定的触发事件(边沿 检测的上升沿、下降沿或上升/下降沿,电平检测的低电平或高电平)。管脚用一个位组合 (bit-packed)的字节来指定,这里的每个字节,置位的位用来识别被访问的管脚,字节的 位 0 代表 GPIO 端口管脚 0、位 1 代表 GPIO 端口管脚 1 等等。 2.IntMasterEnable( )使能处理器中断 原型 tBoolean IntMasterEnable(void) 参数 无 返回 如果在调用该函数之前处理器中断是使能的,则返回 false 如果在调用该函数之前处理器中断是禁止的,则返回 true 3.IntEnable( )使能一个片内外设的中断 原型 void IntEnable(unsigned long ulInterrupt) 参数 ulInterrupt:指定被使能的片内外设中断, 知道上面三个函数,我们就可以来编程了,对于 Stellaris 系列 ARM,使能一个片内外设 的具体中断,通常要采取分 3 步走的方法: 1 调用片内外设具体中断的使能函数,比如 GPIO 中断等。 2 调用函数 IntEnable( ),使能片内外设的总中断。 3 调用函数 IntMasterEnable( ),使能处理器总中断。 按照上面三个步骤我们介绍上一节关于 GPIO 的编程方法,通过调用相应库函数来编写程 序,
电路设计的时候都是按键接一个上拉电阻,提供给驱动能力因为我们设置按键端口是输 入功能,考虑到输入功能的驱动能力,电路设计的时候一般加上拉电阻。 3.3.3 软件设计: 学习 LM4F 系列中断时,我们可以一边回想单片机中断系统一边探讨。这里的思路就与 单片机类似:当按下按键时,电平变动,使用上升或下降沿触发中断,然后执行中断处理事 件, 必然翻转 LED 的亮灭, 这里我们可以通过实现这个简单是功能来对 LM4F 中断进行入门。
效果:向左上方按下五向按键,LED 的点亮,在按下一次,LED 熄灭。
IV
相关文档
最新文档