CC2530的外部中断

中断介绍

什么是中断?

在C语言中是没有中断的,一个标准的C语言程序,是从main函数开始执行的,main函数退出或者标准库中定义的一些退出函数被调用,程序也就结束了。对于单片机系统,如果硬件发生了一些事件需要应用程序立即来处理,这就需要用到中断了。要CPU立即暂停执行即将执行的指令,去执行一些特定的指令,执行完成之后再回到暂停的位置继续执行,这种机制就叫中断。

中断的优势

  • 让硬件可以把事件通知到软件,提高了响应的实时性。
  • 实现异常处理,提高了系统的稳定性。
  • 提高CPU的效率。注意:如果中断太频繁,由于频繁的保存和恢复现场会导致CPU的效率下降。

中断相关的几个概念

中断源

发生中断的外设,例如定时器事件到了,那么中断源就是定时器。

全局中断开关或总中断

系统中有很多中断开关,如果需要一次性关闭所有的中断,那么就需要用全局中断才行,也就是一个总中断,可以理解为一个电路的总电源吧。

中断使能寄存器

控制是否允许产生中断,也就是这个模块的中断开关,使能就是打开的意思,只有打开状态才允许产生中断,可以理解为在总电源下面的一个小的支路。

中断标志

表示是一个外设的那个具体事件发生了,比如说串口UART1,只有一个中断服务程序,硬件可以产生发送数据完成中断和接收数据完成中断,那么需要有个标志在中断服务程序中让程序知道具体的事件。

中断服务程序

当中断发生的时候要执行的函数,通常需要扩展的语法来编写。

中断优先级

如果CPU当前在执行低优先级的中断,这时候有高优先级的中断发生了,那么CPU会保存当前上下文环境,去执行高优先级的中断服务程序,高优先级的执行完之后会返回来继续执行低优先级的中断服务程序。直到所有的中断服务程序都执行完了,才会返回到原来被中断的位置继续执行。

寄存器分析

中断优先级

根据下图,可以看出,中断被分为了5组,有4个优先级,IP1_xx是优先级的高位,IP0_xx是优先级的低位。

所有的中断源

根据下图可以看出共有18个中断源。

中断相关寄存器示意图

根据图片可以看出,外部中断的开关下面几个寄存器决定:

  • P0ICON 选择中断触发的边沿。0表示上升沿触发(低电平跳变为高电平);1表示下降沿触发(高电平跳变为低电平)。
  • P0IEN P0口的引脚中断开关,配置引脚是否允许触发中断。
  • P0IE P0口中断开关,配置P0端口的8个引脚是否允许中断。
  • EA 全局中断(总中断)开关。
  • P0IF P0口的中断标志,表示P0口是否发生了中断。
  • P0IFG 中断标志,表示那个引脚发生了中断。

具体实现

中断的初始化

//按键中断配置
PICTL |= 0x01;  //P0_1脚下降沿触发 0表示上升沿触发,1表示下降沿触发
P0IEN |= 0x02;  //P0_1脚中断使能
P0IE = 1;       //P0端口的中断使能
EA = 1;         //全局总中断使能

中断服务函数的实现

//定义中断服务程序
//打上断点调试,按下一次按键由于抖动会进入多次中断服务程序
#pragma vector = P0INT_VECTOR
__interrupt void KeyInterrupt(void)
{
    if ((P0IFG & 0x02) == 0x02) {
        P0IFG &= ~0x02; //清除这个引脚的中断标志
        LED1 = !LED1;
    }

    //注意:必须在P0IFG标志清除之后再清除
    P0IF = 0;   //清除P0端口的中断标志
}

注意事项

  • 中断服务函数中的实现,需要先清除引脚的中断标志P0IFG,然后再清楚端口的中断标志P0IF,不然可能发生不可预料的行为(见参考手册)。
  • 不要使用外部中断来实现按键检测,按键抖动会导致多次执行中断服务程序的。可以在中断服务程序中打上断点,测试一下就知道了。

原文地址:https://www.cnblogs.com/iotplus/p/12700710.html

时间: 2024-10-08 08:33:57

CC2530的外部中断的相关文章

【CC2530入门教程-03】CC2530的中断系统及外部中断应用

第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件:中断系统使得内核具备了应对突发事件的能力. 在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行. 这种程序在执行过程中由于外界的原因而被中间打断的

掌握所有IO口的外部中断

外部中断配置流程 1.初始化IO口工作在普通IO.上拉输入状态. 2.首先开IO口组中断(P0IE=1.P1IE=1.P2IE=1): 3.开组内对应的具体某IO口中断(P0IEM.P1IEM.P2IEM该寄存器里面的对应位对应相应的IO口): 4.上升沿还是下降沿触发(PICTL寄存器): 5.开CPU总中断EA=1; #include <cc2530.h> void main() { //步骤1 P0SEL &=0xDF;//P05口表示为普通IO口 P0DIR &=0xD

《零死角玩转STM32》-17-EXTI外部中断/事件控制器

/* * 本文中的相关图片来自火哥的教程,只作为随笔记录,无侵权之意 * 21:25:46, 2017-04-08 */ EXTI:外部中断/事件控制器.STM32F429共有23根,其中EXTI0~EXTI15,分别对应GPIO中的PX0 ~ PX15,另外7根线有如下用途: (中间省略了EXTI1 ~ EXTI15) EXTI功能框图如下所示: 按照图中的序号标识,可以清晰的看出外部GPIO引脚上的电平变化是如何传递到内核,即GPIO -> EXTI -> NVIC,并触发相应的中断/事件

STM32外部中断

0.STM32F103上测试 #include <stm32f10x.h> void GPIO_Config(void); void NVIC_Config(void); void EXTI_Config(void); int main(void) { GPIO_Config(); NVIC_Config(); EXTI_Config(); while(1): } void GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体,本类型在stm32f1

[ZYNQ-7]PS处理PL外部中断的简单实例的剖析 (参考米联miz702n)

Zynq的ARM通过GIC中断控制器来接收核仲裁所有的中断.由于中断向量表只有4Bytes大小,仅仅正好存放一条跳转语句,因此当产生一个外部中断时,中断处理的大致过程:PC内容保存到LR_IRQ用于中断返回,拷贝CPSR到SPSR_IRQ以反应中断模式,屏蔽其他中断,紧接着将PC设置为中断向量表入口.CPU完成现场保护.确认中断源,并调用相关的中断处理函数.恢复CPSR,恢复CPU现场,中断返回. main.c of simplified Interrupt instance (from miz

STM32F4——NVIC中断优先级及外部中断

NVIC中断优先级 一.简介: CM4内核可以支持256个中断,包括16个内核中断和240个外部中断,256级的可编程中断设置.对于STM32F4没有用到CM4内核的所有东西,只是用到了一部分,对于STM32F40和41系列共有92个中断,其中有10个内核中断和82个可屏蔽中断,常用的为82个可屏蔽中断. 二.相关寄存器: ISER[8]-中断使能寄存器组,用来使能中断,每一位控制一个中断,由于上面已经说明了控制82个可屏蔽的中断,因此利用ISER[0~2]这三个32位寄存器就够了.一下的几个寄

LPC1768外部中断与GPIO中断

LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 2 3,EXTINT寄存器表示中断是否发生,在发生中断的时候该寄存器会置位,可以通过写1清零,EXTMODE寄存器表示触发模式,有电平触发和变化沿触发两种,EXTPOLAR与EXTMODE,在电平触发模式下,决定高电平还是低电平触发,在变化沿触发的情况下决定上升沿还是下降沿触发 这三个中断分别相关

CC2540开发板学习笔记(三)&mdash;&mdash;外部中断

一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我们便选择跳过去执行优先级高的,完了之后再执行main函数,中断就类似这样一个概念,使用中断可以减少CPU的无效浪费,降低能耗. 3.寄存器调度 (1)LED1的初始化..同前两节,就是SEL,DIR,INP三个,还有附初始状态. (2)外部中断初始化(S1的外部中断初始化) 按键S1外部中断初始化方

中断之外部中断

. ARM Cortex M3共有256个中断. STM32F103CB共有43个外部中断和16个内部中断. 具有相同数值编号的IO口被分配为同一组,共用一条中断请求线,如下图: 所以共有15条中断线,另外 ●EXTI线16连接到PVD输出●EXTI线17连接到RTC闹钟事件●EXTI线18连接到USB唤醒事件 寄存器:1.外部中断配置寄存器    AFIO_EXTxCR1------->用于选择输入中断源  Pin 0..3 AFIO_EXTxCR2------->用于选择输入中断源  Pi