本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断

文章目录

  • 1 前言
  • 2 STM32的外部中断
  • 3 中断服务函数的映射关系
  • 4 外部中断的配置
  • 5 寄存器的操作
    • 5.1 硬件中断选择
    • 5.2 硬件事件选择
    • 5.3 软件中断/事件的选择
  • 6 总结

1 前言

打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。

2 STM32的外部中断

下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器;

  • 中断屏蔽寄存器(EXTI_IMR)
  • 事件屏蔽寄存器(EXTI_EMR)
  • 上升沿触发选择寄存器(EXTI_RTSR)
  • 下降沿触发选择寄存器(EXTI_FTSR)
  • 软件中断事件寄存器(EXTI_SWIER)
  • 挂起寄存器(EXTI_PR)

    EXTI支持配置20个中断和事件屏蔽位;
  • GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0EXTI_Line15
  • EXTI_Line16 连接到PVD输出 ;
  • EXTI_Line17连接到RTC闹钟事件;
  • EXTI_Line18连接到USB唤醒事件;
  • EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

GPIO的映射关系图如下所示;

3 中断服务函数的映射关系

GPIO IRQn IRQHandler
GPIO_Pin0 EXTI0_IRQn EXTI0_IRQHandler
GPIO_Pin1 EXTI1_IRQn EXTI1_IRQHandler
GPIO_Pin2 EXTI2_IRQn EXTI2_IRQHandler
GPIO_Pin3 EXTI3_IRQn EXTI3_IRQHandler
GPIO_Pin4 EXTI4_IRQn EXTI4_IRQHandler
GPIO_Pin5 — GPIO_Pin9 EXTI9_5_IRQn EXTI9_5_IRQHandler
GPIO_Pin10 — GPIO_Pin15 EXTI15_10_IRQn EXTI15_10_IRQHandler

4 外部中断的配置

宏定义,抽象一下接口,方便后面修改;

#define Z_GPIO_PIN    GPIO_Pin_5
#define Z_GPIO_PORT   GPIOE
#define Z_PortSource  GPIO_PortSourceGPIOE
#define Z_PinSource   GPIO_PinSource5
#define Z_Line        EXTI_Line5
#define Z_IRQ         EXTI9_5_IRQn

GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示;
GPIO的配置代码如下;

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);

不要忘记外设总线时钟的配置;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |RCC_APB2Periph_GPIOG, ENABLE);

EXTI的配置,EXTI_Trigger这里支持三种模式;

  • EXTI_Trigger_Rising 上升沿触发;
  • EXTI_Trigger_Falling 下降沿触发;
  • EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发;
GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);EXTI_InitStructure.EXTI_Line = Z_Line;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC的配置

 NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

中断服务函数

void EXTI9_5_IRQHandler(void)
{//中断服务函数
}

以上就完成了检测下降沿信号的GPIOE5的外部中断;
也参考官方DEMO
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\EXTI\EXTI_Config。

5 寄存器的操作

以下摘自**《STM32参考手册》**
产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。
产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在
中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。

  • 中断屏蔽寄存器(EXTI_IMR)
  • 事件屏蔽寄存器(EXTI_EMR)
  • 上升沿触发选择寄存器(EXTI_RTSR)
  • 下降沿触发选择寄存器(EXTI_FTSR)
  • 软件中断事件寄存器(EXTI_SWIER)
  • 挂起寄存器(EXTI_PR)

IMR如下图所示,其他几个类似;

5.1 硬件中断选择

通过下面的过程来配置20个线路做为中断源:

  • 配置20个中断线的屏蔽位(EXTI_IMR)
  • 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
  • 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

5.2 硬件事件选择

通过下面的过程,可以配置20个线路为事件源

  • 配置20个事件线的屏蔽位(EXTI_EMR)
  • 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)

5.3 软件中断/事件的选择

20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

  • 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
  • 设置软件中断寄存器的请求位(EXTI_SWIER)

6 总结

本文参考stm32手册对于外部中断的概念以及配置进行了介绍,本人能力有限,难免存在错误和纰漏,请大佬不吝赐教。

STM32 外部中断详解(原理+配置代码)相关推荐

  1. STM32开发 -- 外部中断详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/87376865 在讲三轴加速度计的时候,提到外部中断.接下来就看看中断为什么这 ...

  2. STM32F4_外部中断详解(EXTI)

    目录 1. EXTI 是什么? 2. EXTI主要特性 3. EXTI框图 3.1 外部中断/事件线映射 4. EXTI寄存器 4.1 中断屏蔽寄存器 EXTI_IMR 4.2 事件屏蔽寄存器 EXT ...

  3. 【STM32】 中断详解

    NVIC 嵌套中断向量控制器(Nested Vectored Interrupt Controller) 1.中断优先级分组 STM32 中断优先级分为两种:抢占式优先级(可嵌套).子优先级(不可嵌套 ...

  4. 【嵌入式STM32-05】STM32 外部中断 EXTI 基本原理|库函数程序代码|寄存器

    STM32外部中断 1.中断基本原理 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断 ...

  5. 【STM32学习笔记】(13)——外部中断详解

    EXTI 简介         EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20 个中断/事件线.每个输入线可以独立地配置 ...

  6. STM32入门笔记03_EXTI外部中断详解+案例:红外对射计数、旋转编码器计数

    EXTI外部中断 中断的相关概念 中断源: 可以引起中断的事件称为中断源 中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成 ...

  7. 【stm32】中断详解

    stm32中断的顺序: 1)初始化 IO 口. 2)开启 AFIO 时钟 3)EXTI配置. 4)NVIC配置. 5)编写中断服务函数. 1 NVIC中断优先级管理 CM3 内核支持 256 个中断, ...

  8. 单片机中段程序_单片机外部中断详解及程序

    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来 ...

  9. DS18B20温度传感器原理详解及例程代码、漏极开路

    [常用传感器]DS18B20温度传感器原理详解及例程代码_Z小旋的博客-CSDN博客_ds18b20温度传感器 传感器引脚及原理图 DS18B20传感器的引脚及封装图如下: DS18B20一共有三个引 ...

最新文章

  1. 微信小程序 - 富文本图片宽度自适应(正则)
  2. 使用echo输出一绝对路径,使用egrep取出其基名
  3. matplotlib实践过程总结
  4. 【渝粤题库】国家开放大学2021春1443卫生信息与文献检索题目
  5. 字典按照值或键进行排序
  6. html嵌入audio格式不支持,html5中audio支持音频格式的解决方法
  7. uniapp路由传多个参数_2020年家用路由器购买推荐(20200921更新)
  8. java实现订单物品计算佣金,java三角形、NextDay、佣金问题代码
  9. java字符串数字统计_对字符串进行简单的字符数字统计 探索java中的List功能
  10. shell date mysql_shell脚本定时备份mysql数据库
  11. java新手笔记18 类比较
  12. Luogu P1131 [ZJOI2007]时态同步 树形DP
  13. C# 判断字符中是否包含中文
  14. Java Swing实现高仿电脑版微信
  15. 双11购书大优惠!独家优惠券,折后再减,赶紧来抢啊!
  16. 【系统优化】解决windows11桌面切换卡顿(非重装以及关闭特效)
  17. 报错:RuntimeError: expected scalar type Double but found Float
  18. 5-VOSviewer项目密度图含义解析
  19. word怎么根据点画曲线_用word怎么画曲线图 word里如何绘制曲线图
  20. 声网首席科学家钟声:感知实时互联网

热门文章

  1. 第5 部分 EIGRP
  2. 【遥感卫星】Landsat 卫星
  3. 照明控制系统在呼和浩特商场楼宇的应用
  4. 易语言可以编译c语言,刷屏软件?其实易语言也可以做这种软件
  5. 火车头采集之采集内容获取
  6. 手写springboot自动装配 autoConfiguration
  7. 【IoT】14.Identify Customer Need 拿捏住客户的想法
  8. FITC修饰药物;CY3荧光标记氟维司群/依西美坦/齐多夫定/丁二酸(琥珀酸)/醋酸卡泊芬净的定制合成
  9. 从线下棋牌室到棋牌游戏开发平台 棋牌游戏行业发生了太多变化
  10. 人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID