微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 中断之外部中断

中断之外部中断

时间:11-19 来源:互联网 点击:
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>中断线上发生了选择的边沿事件时置119位

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()

分组情况:

优先级组别抢占式优先级副优先级
44位/16级0位/0级
33位/8级1位/2级
22位/4级2位/4级
11位/2级3位/8级
00位/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_EX

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top