一、外部中断介绍

1.1 EXTI简介

  EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或 边沿触发),还可独立地被屏蔽。(stm32f103有19个)

1.2 EXTI结构框图

1.3 外部中断/事件线映射

  STM32F10x的EXTI具有20个中断/事件线,如下:(stm32f103有19个以太网唤醒事件没有;stm32f107有20个)

  STM32F10x 的 EXTI 供外部 IO 口使用的中断线有 16 根,但是我们使用的 STM32F103 芯片却远远不止 16 个 IO 口,那么 STM32F103 芯片怎么解决这个问题的呢?
  因为 STM32F103 芯片每个 GPIO 端口均有 16 个管脚,因此把每个 端 口 的 16 个 IO 对 应 那 16 根 中 断 线 EXTI0-EXTI15 。 比 如 :GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 EXTI0-EXTI15,这样一来每个中断线就对应了最多 7 个 IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。但是中断线每次只能连接一个在 IO 口上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的 EXTIx[3:0]位来决定对应的中断线映射到哪个 GPIO 端口上,对于中断线映射到 GPIO 端口上的配置函数在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使用到外部中断时要把这个文件加入到工程中,在创建库函数模板的时候我们默认已经添加。EXTI 的 GPIO 映射图如图 18.1.3 所示:

二、外部中断配置步骤

  要使用外部中断我们就需要先配置它,通常都需经过这几步:

(1)使能IO口时钟,配置IO口模式为输入

(2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO时钟

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);  //设置IO 口与中断线的映射关系即哪个io口哪一个管脚作为中断输入线

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);  //这里以配置GPIOA口 GPIOA的第0管脚作为中断输入线

(3)配置中断分组(NVIC),使能中断

(4)初始化EXTI,选择触发方式

1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
2 typedef struct
3 {
4 uint32_t EXTI_Line; //中断/事件线
5 EXTIMode_TypeDef EXTI_Mode; //EXTI模式
6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI触发方式
7 FunctionalState EXTI_LineCmd; //中断线使能或失能
8 }EXTI_InitTypeDef;

(5)编写EXTI中断服务函数(中断函数固件库中已经定义必须使用下列函数名不能自己定义)

EXTI0_IRQHandler

EXTI1_IRQHandler

EXTI2_IRQHandler

EXTI3_IRQHandler

EXTI4_IRQHandler

EXTI9_5_IRQHandler

EXTI15_10_IRQHandler

三、编写外部中断控制程序 要实现外部中断方式控制LED,程序框架如下:

(1)初始化对应端口的EXTI(第三部分中的1-4小步)

(2)编写EXTI中断函数

(3)编写主函数

 1 /*******************************************************************************
2 * 函 数 名 : My_EXTI_Init
3 * 函数功能 : 外部中断初始化
4 * 输 入 : 无
5 * 输 出 : 无
6 *******************************************************************************/
7 void My_EXTI_Init(void)
8 {
9   NVIC_InitTypeDef NVIC_InitStructure;
10   EXTI_InitTypeDef EXTI_InitStructure;
11
12   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能
13   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择GPIO管脚用作外部中断线路
14 //EXTI0 NVIC 配置
15   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道
16   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
17   NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
18   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
19   NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
20 //初始化EXTI 配置
21   EXTI_InitStructure.EXTI_Line=EXTI_Line0;
22   EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
23   EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
24   EXTI_InitStructure.EXTI_LineCmd=ENABLE;
25   EXTI_Init(&EXTI_InitStructure);
26 }
 1 /*******************************************************************************
2 * 函 数 名 : EXTI0_IRQHandler
3 * 函数功能 : 外部中断0函数
4 * 输 入 : 无
5 * 输 出 : 无
6 *******************************************************************************/
7 void EXTI0_IRQHandler(void)
8 {
9   if(EXTI_GetITStatus(EXTI_Line3)==1) //判断EXTI中断标志位状态函数
10   {
11     //填写中断中需要完成的程序
12    }
13    EXTI_ClearITPendingBit(EXTI_Line3); //在结束中断服务函数前,清楚中断标志位
14
15 }

(stm32f103学习总结)—stm32外部中断的更多相关文章

  1. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  2. STM32学习笔记(九) 外部中断,待机模式和事件唤醒

    学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...

  3. stm32 外部中断学习

    今天我们看看STM32的外部中断实验. STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一 ...

  4. STM32外部中断初理解

    PA0,PB0...PG0--->EXTI0 PA1,PB1...PG1--->EXTI1 ....... PA15,PB15...PG15--->EXTI15 以上为GPIO和中断 ...

  5. STM32外部中断具体解释

      一.基本概念 ARM Coetex-M3内核共支持256个中断,当中16个内部中断,240个外部中断和可编程的256级中断优先级的设置.STM32眼下支持的中断共84个(16个内部+68个外部), ...

  6. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  7. STM32 外部中断

    1)STM32一般有19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断.线 16:连接到 PVD 输出. 线 17:连接到 RTC 闹钟事件. 线 18:连接到 USB 唤醒事件. 2) ...

  8. STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...

  9. STM32——外部中断EXIT实现

    外部中断实现步骤: 一.初始化,包括:1.AFIO时钟中断和GPIO时钟使能:                          2.GPIO初始化                           ...

随机推荐

  1. 给bootstrap-table填坑

    由于设计变更,需要把数据由分页展示改为全部展示(才3500条数据),结果chrome浏览器页面卡顿,火狐浏览器直接卡死! console.time分析之后,竟然是bootstrap-table插件的坑 ...

  2. Django的orm(一)

    Django的orm一 1.创建表 1.1 创建普通表 class UserType(models.Model): ''' 用户类型 ''' title=models.CharField(max_le ...

  3. 01-Servlet 回顾

    通过url访问资源有三个步骤: 接收请求 处理请求 响应请求 web服务器:将某个主机上的资源映射为一个URL供外界访问,完成接收和响应请求 servlet容器:存放着servlet对象(由程序员编程 ...

  4. 国产化之Arm64 CPU+银河麒麟系统安装.NetCore

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,银河麒麟就是一个Linux发行版,数据库使用达梦V8,这个数据库很多概念和Oracle相似,CPU平台的范围:龙芯.飞腾.鲲鹏等. ...

  5. tp6微信公众号开发者模式token认证

      微信公众号开发完整教程(一) PHP7.0版本,TP5.0框架 技术标签: 微信公众号开发         因为工作的需要,这一两年对微信公众号和小程序,项目制作的比较多.所以我才打算写一篇全面的 ...

  6. mysql sql_mode=only_full_group_by问题临时解决

    执行代码 set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZER ...

  7. 'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件

    记录在配置环境变量中被 Path 环境坑的一次前提:保证自己电脑中jdk环境配置都没有问题,即JAVA_HOME.Path.CLASSPATH均配置成功. 在这里我就不操作如何配置环境变量了,百度上面 ...

  8. elasticsearch高亮之highlight原理

    一.highlight简介 highlight是提升用户体验的重要手段,搜索引擎通过高亮突出命中关键字等方式,方便用户通过关键字周围的信息快速的确认是否是自己希望的结果: highlight功能通常包 ...

  9. [源码解析] TensorFlow 分布式环境(4) --- WorkerCache

    [源码解析] TensorFlow 分布式环境(4) --- WorkerCache 目录 [源码解析] TensorFlow 分布式环境(4) --- WorkerCache 1. WorkerCa ...

  10. (leetcode)二叉树的前序遍历-c语言实现

    给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 前序遍历 前序遍历首先 ...