中断之外部中断

.

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------->用于选择输入中断源  Pin 0..7

    AFIO_EXTxCR2------->用于选择输入中断源  Pin 8..11

     AFIO_EXTxCR2------->用于选择输入中断源  Pin 12..15

(说明:5个端口PORTA..E,每个端口各有16位可供选择)

2、中断屏蔽寄存器        EXTI_IMR----------->屏蔽线上的中断请求         共19路

3、事件屏蔽寄存器        EXTI_EMR----------->屏蔽线上的事件             共19路

4、上升沿触发选择寄存器  EXTI_RTSR---------->设置相应线为上升沿触发       19位

5、下降沿触发选择寄存器  EXTI_FTSR---------->设置相应线为上升沿触发       19位

6、挂起寄存器            EXTI_PR------------>中断线上发生了选择的边沿事件时置1   19位

7、软件中断事件寄存器    EXTI_SWIER--------->写该位可以将EXTI_PR中相应的位值高,如果EXTI_IMR或EXTI_EMR使能,则可以产生相应的中断

配置流程:中断在使用前必须对中断线进行配置并激活

       1、配置相应的IO口为输入,浮空输入时一定要加上拉或者是下拉

       2、开启IO口复用时钟,设置IO与中断线的映射关系---->AFIO_EXTxCR1

       3、设置相应中断触发条件---------->EXTI_IMR、EXTI_RTSR、EXTI_FTSR      

       4、在NVIC中开启并使能中断,对中断分组进行配置

       5、编写中断服务函数

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------>

编写中断程序的步骤:(库函数版)

1.初始化系统时钟和端口时钟,在此需注意设置完端口时钟外还须将端口设置为功能复用IO时钟。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)

2.初始化GPIO。

3.中断配置,包括两部分(两个函数),中断配置和中断优先级配置。

中断配置:结构体:EXTI_InitTypeDef 。清空中断线、中断线映射CPU、中断线选择、中断模式、触发方式、使能。

优先级配置:结构体:NVIC_InitTypeDef。选组、选择IRQ通道、设置抢占优先级、设置从优先级、使能。

EG:  EXTI_Configuration() 和 NVIC_Configuration()

分组情况:

优先级组别 抢占式优先级 副优先级
4 4位/16级 0位/0级
3 3位/8级 1位/2级
2 2位/4级 2位/4级
1 1位/2级 3位/8级
0 0位/0级 4位/6级

4.中断服务程序。比如0号中断线对应函数  void EXTI0_IRQHandler(void)

示例:按键改变LED的状态

1.主要功能是按键响应中断从而改变LED的状态。
2.按键所属端口:GPIOB,LED所属端口:GPIOB
3.按键管脚:PB0~PB7
4.LED管脚:PB8~PB15
5.PB0~PB5分别依次控制PB8~PB13

  1 #include "pbdata.h"
  2 #include "led.h"
  3 #include "key.h"
  4 #include "misc.h"
  5 #include "stm32f10x_exti.h"
  6
  7 void RCC_Configration(void)
  8 {
  9      SystemInit();
 10      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 11      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);      //功能复用IO时钟
 12 }
 13
 14 void GPIO_Configration(void)
 15 {
 16     GPIO_LED_Configration();
 17     GPIO_KEY_Configration();
 18 }
 19
 20 /*
 21   *中断配置*
 22             */
 23 void EXTI_Configuration(void)
 24 {
 25     EXTI_InitTypeDef EXTI_InitStructure;
 26
 27     EXTI_ClearITPendingBit(EXTI_Line0);     //清空中断线
 28     EXTI_ClearITPendingBit(EXTI_Line1);
 29     EXTI_ClearITPendingBit(EXTI_Line2);
 30     EXTI_ClearITPendingBit(EXTI_Line3);
 31     EXTI_ClearITPendingBit(EXTI_Line4);
 32     EXTI_ClearITPendingBit(EXTI_Line5);
 33     EXTI_ClearITPendingBit(EXTI_Line6);
 34     EXTI_ClearITPendingBit(EXTI_Line7);
 35
 36     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//映射
 37     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
 38     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
 39     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
 40     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);
 41     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5);
 42     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
 43     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
 44
 45     EXTI_InitStructure.EXTI_Line=EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5 | EXTI_Line6 | EXTI_Line7;       //选择中断线
 46
 47     EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;           //设置模式
 48     EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;       //设置触发方式
 49     EXTI_InitStructure.EXTI_LineCmd=ENABLE;                        //使能
 50
 51     EXTI_Init(&EXTI_InitStructure);
 52 }
 53
 54 void NVIC_Configuration0(void)         //优先级设置函数
 55 {
 56        NVIC_InitTypeDef NVIC_InitStructure;
 57
 58     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
 59
 60     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;       //选择IRQ通道
 61     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级设置
 62     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            //次优先级设置
 63     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 64     NVIC_Init(&NVIC_InitStructure);
 65 }
 66
 67 void NVIC_Configuration1(void)
 68 {
 69        NVIC_InitTypeDef NVIC_InitStructure;
 70
 71 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
 72
 73     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
 74     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 75     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 76     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 77     NVIC_Init(&NVIC_InitStructure);
 78 }
 79
 80 void NVIC_Configuration2(void)
 81 {
 82     NVIC_InitTypeDef NVIC_InitStructure;
 83
 84 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
 85
 86     NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
 87     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
 88     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 89     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 90     NVIC_Init(&NVIC_InitStructure);
 91 }
 92
 93 void NVIC_Configuration3(void)
 94 {
 95     NVIC_InitTypeDef NVIC_InitStructure;
 96
 97 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
 98
 99     NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
100     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
101     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
102     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
103     NVIC_Init(&NVIC_InitStructure);
104 }
105
106 void NVIC_Configuration4(void)
107 {
108     NVIC_InitTypeDef NVIC_InitStructure;
109
110 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
111
112     NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
113     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
114     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
115     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
116     NVIC_Init(&NVIC_InitStructure);
117 }
118
119 void NVIC_Configuration5(void)
120 {
121     NVIC_InitTypeDef NVIC_InitStructure;
122
123 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
124
125     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
126     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;
127     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
128     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
129     NVIC_Init(&NVIC_InitStructure);
130 }
131
132 int main(void)
133 {
134         RCC_Configration();
135         GPIO_Configration();
136         EXTI_Configuration();
137         NVIC_Configuration0();
138         NVIC_Configuration1();
139         NVIC_Configuration2();
140         NVIC_Configuration3();
141         NVIC_Configuration4();
142         NVIC_Configuration5();
143         while(1);
144 }

2014-08-23 23:12:45

时间: 2024-07-30 10:20:58

中断之外部中断的相关文章

STM32学习之路-按键中断测试(外部中断)

终于有时间再来学习STM32了~ 这几天都在忙着该死的考试.直接进入正题 开发板:奋斗V5 这个按键中断测试的要求是:按键2(K2)按下,LED2(V7)亮, 再一次按下就灭,循环.. 好,先看看按键和LED的原理图 好吧~ 虽然图截得不是很好看,但是能看到K2接的是PC2, LED2接的是PD6 ok,剩下的就是配置工作了.. 先来理一理思路: (1)初始化系统时钟 (2)初始化外部时钟(你所用到的东西) (3)配置LED (4)配置中断优先级 (5)配置外部中断线 (6)中断处理函数 恩,差

STM32F104VG (一)中断与外部中断

一.基础知识 1.ARM的中断优先级分硬件优先级和软件优先级两种 其中软件优先级又由抢占优先级和响应优先级组成 2.中断的优先级采用编号小优先的原则. 3.一般情况: 1).如果设定了软件优先级,先看软件优先级: 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断. 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之

LINUX内核中断(ioremap,内部watchdog中断,外部中断)

一:ioremap 在内核中有关与物理地址到虚拟地址的映射全都是有mmu,统一开启,而物理地址到虚拟地址的映射关系全都存在一张对应的表格里面,这张表,在开启mmu的时候一起建好,比如在建表的时候是将物理地址0x11111111映射到44444444,那么问题就是: 比如以后我们如果要将0x11111111的地址映射到66666666地址怎么办?在内核中,通过特定的物理地址到虚拟地址的自动对应映射通过ioremap()函数来实现 1 #include <linux/init.h> 2 #incl

STM32——外部中断EXIT实现

外部中断实现步骤: 一.初始化,包括:1.AFIO时钟中断和GPIO时钟使能:                          2.GPIO初始化                          3.设置EXTI线                          4.中断向量初始化 二.中断服务函数 采用PB9作为外部中断源,具体实现程序如下: 一.初始化 1 void EXTI_PB9_Init(void) 2 3 { 4 5 GPIO_InitTypeDef GPIO_InitStru

外部中断和计时器要点

一.51单片机的引脚与功能 P3.2: 外部中断0的输入引脚 P3.3:外部中断1的输入引脚 P3.4:定时器0的输入引脚 P3.5:定时器1的输入引脚 二.单片机的中断源 外部中断0: 外部中断1: 定时/计数器0 中断: 定时/计数器0 中断: 串行口发送或接收中断. 三.引起单片机外部中断的信号低电平信号和从高电平到低电平的下降沿信号. 四.与外部中断相关的寄存器有3个:中断允许寄存器IE,定时器控制寄存器TCOM,中断优先级寄存器IP. 中断允许寄存器IE EX0:外部中断0中断允许未位

ARM中外部中断

在整个ARM体系结构中,为了处理外部中断,依次学习了MMU,模式跳转,异常,GIC,看门狗程序,这些都是为了处理外部中断 具体如下: 处理外部中断有五个步骤: 30      //step 1: cpu cpsr 31       __asm__ __volatile__( 32           "mrs r0, cpsr\n" 33           "bic r0, r0, #0x80\n"//设置CPSR的I位,将IRQ位打开 34          

[Arduino] 外部中断

原文:http://www.arduino.cn/thread-2421-1-1.html 1.什么是中断?  试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情--吃饭. 打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人.关上门,你马不停蹄的又投入了于食物的作战中. 我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律--吃饭,就是你的主程序,而敲门声,就是一个中断信号,它让你不得不去执行

s3c2440外部中断

上文用到了pwm控制蜂鸣器,实现了蜂鸣器频率的改变,有一点不好就是蜂鸣器一直响,可以用一个交互的方式来关闭蜂鸣器.这里就选择按键,开发板上一共4个按键,对应这4个外部中断EINT0,EINT1,EINT2和EINT4(为什么不是EINT0~3呢,让人蛋疼) 要使用外部中断,首先要初始化外部中断.外部中断跟外部引脚F和G复用.要把相应的引脚配置为中断模式: 配置完引脚后,还需要配置具体的中断功能.我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK  有些位对应着多个外部中断

10.5 外部中断的处理过程

计算机组成 10 输入输出设备 10.5 外部中断的处理过程 我们之前已经学习了内部中断的处理方法,那么外部中断和内部中断总体上是很类似的.只是在一些具体的处理细节上和硬件的连接方式上有所不同.那我们现在就来看一看外部中断是如何处理的. 外部中断,也叫做硬件中断.这是由CPU外部的中断请求信号启动的中断.以x86 CPU为例,连到外部的中断请求信号一共有两个.一个信号叫做NMI,这就是非屏蔽中断的缩写.另一个信号叫INTR,这就是中断这个词的缩写,相对于非屏蔽中断,我们一般也称它为可屏蔽中断.不