中断之外部中断

发布者:eta17最新更新时间:2016-05-30 来源: eefocus关键字:中断  外部中断 手机看文章 扫描二维码
随时随地手机看文章
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); 
 
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 }

关键字:中断  外部中断 引用地址:中断之外部中断

上一篇:S3C6410中断以及外部中断
下一篇:s3c2440外部中断

推荐阅读最新更新时间:2024-03-16 14:55

【STM32CubeMX】HAL库中断方式UART串口通信
HAL库下,利用STM32CubeMX生成源代码,确实比较简单,比用标准库简单很多。 现在总结自己学习的过程: 硬件平台:正点原子探索者(STM32F407ZET6) 1、配置STM32CubeMX (1)打开STM32CubeMX,选择相应的芯片型号,并配置调试信息为:Serial Wire (2)配置RCC主频,选择外部高速晶振(HSE):Crystal/Ceramic Resonator(译文:水晶/陶瓷谐振器) 然后开始配置时钟树: 外部晶振为8MHz,配置PLL使主频为168MHz,如下图: (3)配置USART1:选择异步通信模式 (4)配置串口:115200
[单片机]
【STM32CubeMX】HAL库<font color='red'>中断</font>方式UART串口通信
STM32初学笔记3之外部中断
学习的第三部分,我选择了外部中断,因为个人觉得除了时序问题,我们应用的最多的就要数中断了,当然还有一个定时器还没学,呵呵,只能往后放一下了。当然,我不打算花太多时间去搞GPIO,所以就自己看了一下手册,能用就行了。 反正学习这些东西还是根据个人的习惯吧,我学习主要也就是参考ST给的示例程序,反正还是很有用的。今天花了差不多两个小时的时间根据EXTI的示例程序自己编写了一个程序,最后在ALIENTEK上面运行成功,下面将示例代码展示如下: 笔者将跟硬件平台有关的配置放在一个板级支持包的源文件里面,具体请查看: 板级支持包的应用 一文。 一、GPIO的配置 二、嵌入向量中断控制器配置 三、中断服务程序 说
[单片机]
STM32初学笔记3之<font color='red'>外部中断</font>
STM32关总中断的语句
1 __set_PRIMASK(1);//关总中断 2 3 /************ 4 **********/ 5 __set_PRIMASK(0);//开总中断
[单片机]
单片机的中断系统(一)
想总结中断由来已久,但是总感觉一章的东西,太多,无从下手。 前几天看到一句话“能把自己学会的东西说出来,才是真的学会”。今天,就要会一会这中断系统。 图片和文字内容来自:普中科技的ppt,百度文库,《操作系统》,《组成原理》我整理整理。 先不谈中断,先看看cpu可以如何处理输入输出。比如,现在我的键盘在输入,试问cpu如何知道我输入完成,以将输入的内容送入内存进行处理?最简单的是,cpu原地等待,cpu进行不断的查询,查询键盘是否输入完成。但是这样,cpu就不能去做其他事情,严重影响cpu的速度。 此时可以引入中断的方式。cpu工作自己的。键盘输入自己的。当键盘输入完成,发出中
[单片机]
单片机的<font color='red'>中断</font>系统(一)
STM32单片机是怎样执行中断函数中的应用的
在STM32单片机的编程当中,中断函数的名称都是xxx_IRQHandler格式的。那当编译程序的时候是怎么知道这是一个中断函数的呢? 每个中断都是有入口地址的。程序在执行过程中遇到中断的时候,会先判断这个中断的类型,根据类型再到中断向量表中查找,找到之后,根据表中指明的地址,程序就跳到该地址开始执行代码。 ST提供的固件库当中,有提供一个stm32f10x_it.c文件,打开之后会发现里面放的都是些空函数,但是名字都是“xxx_Handler()”格式,需要使用某个中断的时候,在代码中使能该中断,并到这个文件中将中断服务函数添加上,就可以了。 而这些名字就是一个个的中断函数入口地址。在启动代码中便有这些定义。如下图所示:
[单片机]
STM32单片机为什么要中断
STM32中断主题: 1什么是中断 暂停原先的程序或事情,执行另外一些程序或事情,执行完成后返回原来的程序。 2为什么要中断 因为另一些程序或事情比你原先正在做的事情要重要,或者这些突发事情你是无法控制它的来临的。 3 中断的分类 按不同方法进行分类 3.1 内部中断,外部中断 (向量表中灰色为内部) 3.2 可设置中断,固化中断 3.3 中断向量表 (cl级别的芯片有10个内部 ,0~67个外部,一些没用到,其中通用化 中断编号0~17,个性化中断编号18~67) 3.4 优先级别 (由主优先级和从优先级组成,主从优先级可以通过4个位进行设置) 4 中断的组成 具体中断的名称 中断的地址 用来保存一条跳转指令,跳到哪里去
[单片机]
单片机中断问题30例及解决办法
1、单片机外中断INT0为下降沿触发,当中断被触发后cpu执行中断程序,若本次中断的程序还未执行完INT0又来了一个相同的下降沿中断信号怎么办?cpu会怎么处理?若是定时器中断呢?串口中断呢?求解释 答:再来一个INT0信号不会执行。相同的优先级不会打断正在执行的中断。 一. 如果是高优先级的中断来了,会打断低优先级的正在执行的中断而执行高优先级的中断。 51单片机的默认(此时的IP寄存器不做设置)中断优先级为: 外部中断0 定时/计数器0 外部中断1 定时/计数器1 串行中断; 当同时有几种中断到达时,高优先级中断会先得到服务。 例如:当计数器0中断和外部中断1(优先级 计数器0中断 外部中断1)同时到达时,会进入计时
[单片机]
从LCD电极读数的单片机接口技术
   摘要 以测量仪表中常见的时分割驱动法驱动的段式LCD显示器为例,分析LCD显示器的电极连接结构和驱动信号波形;介绍单片机读取仪表LCD读数的接口电路。此接口电路应用于笔者开发的自动血压监控仪的研制及临床应用项目中,由8031单片机读取血压计的收缩压、舒张压、心率以及充气和放气时瞬时压强。实验证明,此接口电路工作稳定、可靠。    关键词 LCD电极 读数 时分割驱动法 接口设计   通过测量仪表拾取被测信号是单片机前向通道设计中常用的数据采集方式。通常,接口电路从仪表电路中取得相关的模拟信号,经过A/D转换或V/F 转换送入单片机;或者取得一个频率信号,经整形后送入单片机 。然而,有些测量仪表电路中可能找不到这样的信号。
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved