stm32学习笔记——外部中断

2023-10-30

stm32的每个IO口都可以作为外部中断输入。

stm32的中断控制器支持19个外部中断/事件请求。

线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。

每个外部中断线都可以独立地配置触发方式(上升沿,下降沿,双边沿),触发/屏蔽,专用的状态位。

但stm32地IO口多达上百个,如zet6有7组GPIO每组16位,共112个IO口,中断线却只有16根。


IO口与中断线的连接

GPIOx.n与中断线EXTIn相连,且同一时间EXTIn只能与一个GPIOx.n相连。

比如GPIO1.0和GPIO2.0都可以与EXTI0相连,但同一时间外部中断输入要么是GPIO1.0要么是GPIO2.0。


中断服务函数的分配

IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数。

位置 优先级 优先级类型 名称 说明 地址
6 13 可设置 EXTI0 EXTI线0中断 0x0000_0058
7 14 可设置 EXTI1 EXTI线1中断 0x0000_005C
8 15 可设置 EXTI2 EXTI线2中断 0x0000_0060
9 16 可设置 EXTI3 EXTI线3中断 0x0000_0064
10 17 可设置 EXTI4 EXTI线4中断 0x0000_0068
23

30

可设置 EXTI9_5 EXTI线[9:5]中断 0x0000_009C
40 47 可设置 EXTI15_10 EXTI线[15:10]中断 0x0000_00E0

从上图可以看出,线0~4这五根中断线各自单独控制一个中断函数,线5~9这五根中断线共用一个中断函数,线10~15这六根中断线共用一个中断函数。


设置外部中断的一般步骤

代码主要分布在固件库的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件中。

1、初始化IO口为输入

使能IO口为下拉或上拉输入。并使能GPIO时钟。

参考按键初始化。

2、开启IO口复用时钟

开启IO口复用时钟。参考复用功能。

3、设置IO口和中断线的映射关系

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//使用范例

4、对中断线进行初始化

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//初始化函数


//初始化结构体成员
typedef struct
{
 uint32_t EXTI_Line; //指定中断线
 EXTIMode_TypeDef EXTI_Mode; //指定是事件还是中断
 EXTITrigger_TypeDef EXTI_Trigger; //指定触发方式
 FunctionalState EXTI_LineCmd; //是否使能
}EXTI_InitTypeDef;

//配置范例
 EXTI_InitTypeDef EXTI_InitStructure;
 EXTI_InitStructure.EXTI_Line=EXTI_Line4;
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的
//参数初始化外设 EXTI 寄存器

5、配置中断分组并使能中断。

详情参考NVIC配置内容

//使用范例
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC

6、编写中断服务函数,清除中断标志位

和NVIC的中断服务函数名称有要求,EXTI外部中断服务函数也要按照指定函数名编写

//常见中断服务函数编写
void EXTI3_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生 
    {
        中断逻辑…
        EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位 
    }
}

//中断函数编写范例
void EXTI3_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//该例子并没有写判断中断发生这一步,我擅自添加的 
    {
        delay_ms(10);//消抖
        if(KEY1==0) //按键 KEY1
        {
            LED1=!LED1;
        }
        EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE3 上的中断标志位 
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32学习笔记——外部中断 的相关文章

  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么

随机推荐

  • 毕业设计-基于机器学习的软件漏洞挖掘方法

    目录 前言 课题背景和意义 实现技术思路 一 基于机器学习的软件漏洞挖掘流程 二 代码的表征形式 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近
  • getopts 可选参数_linux shell命令行选项与参数用法详解--getopt

    本文介绍了linux shell中使用命令行选项与命令行参数的方法 在bash中 可以用以下三种方式来处理命令 行参数 每种方式都有自己的应用场景 问题描述 在linux shell中如何处理tail n 10 access log这样的命
  • gsoap学习笔记一

    本文章是对gsoap中生成的cpp类型的代码框架的应用 因为要实现一些ONVIF规范中的一些功能 所以选择了gsoap生成代码框架 但是发现好多博客上都是生成的C的代码框架 使用起来很麻烦 而且引用插件功能的时候 什么时候需要修改文件内容
  • Vue各种标签的使用方法

    1 内容绑定 事件绑定 v text v html v on 1 v text 绑定内容 作用 设置标签的内容 无论内容是什么 它只会解析文本 div style color red h2 h2 h1 h1 div
  • RuoYi框架微服务版本(windows环境)二次开发环境搭建详解【小白版】

    1 需要准备的依赖环境服务 JDK gt 1 8 推荐1 8版本 Mysql gt 5 7 0 推荐5 7版本 Redis gt 3 0 Maven gt 3 0 NodeJS gt 10 以上安装配置不赘述 nacos gt 1 1 0
  • 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之二

    我们在之前依次介绍openfire部署以及smack常用API的使用 这一节中我们着力介绍如何基于asmack开发一个Android的客户端 本篇的重点在实践 讲解和原理环节 大家可以参考前面我所发布的OpenFire和Smack的相关文章
  • FLOPS的计算

    参考 https blog csdn net qq 42309265 article details 123098538 概念 FLOPS 浮点运算数 是floating point operations per second的缩写 意指每
  • C51子函数

    子函数 将完成某一种功能的程序代码单独抽取出来形成一个模块 在其它函数中可以随时调用此模块 以达到代码的复用和优化程序结构的目的 void Function unsigned char x 返回值 函数名 形参 函数体
  • 爬虫的异常处理办法

    爬虫是一种自动化程序 用于从互联网上收集数据 然而 由于互联网的不确定性和复杂性 爬虫程序可能会遇到各种异常情况 这些异常情况可能会导致爬虫程序停止工作或者收集到错误的数据 因此 异常处理是爬虫程序开发中非常重要的一部分 本文将介绍爬虫程序
  • mysql视图总结

    1 概述 视图是指计算机数据库中的视图 是一个虚拟表 其内容由查询定义 同真实的表一样 视图包含一系列带有名称的列和行数据 但是 视图并不在数据库中以存储的数据值集形式存在 行和列数据来自由定义视图的查询所引用的表 并且在引用视图时动态生成
  • au人声处理_如何消去人声保留伴奏?

    因为有做混剪视频 经常需要把声音和背景音乐分离 所以我尝试过很多的办法 下面分享2种我觉得分离效果还行的方法 PS 先声明 目前技术只能优化声音 音乐分离 还不能完成剥离 所以人声和音乐分离后 音质肯定会有些许的损失 01 Au中置声道提取
  • 一个小时内学习SQLite数据库

    1 介绍 SQLite 是一个开源的嵌入式关系数据库 实现自包容 零配置 支持事务的SQL数据库引擎 其特点是高度便携 使用方便 结构紧凑 高效 可靠 与其他数据库管理系统不同 SQLite 的安装和运行非常简单 在大多数情况下 只要确保S
  • 使用Typora编辑markdown上传CSDN时图片大小调整麻烦问题

    文章目录 一 问题来源 二 解决方案 一 创建工程项目 二 代码 一 问题来源 我日常写博客时 首先使用 typora 编辑 markdown 文件 然后在 CSDN 的 markdown 编辑器中导入 md 文件 但是使用 typora
  • 攻防世界web题总结A

    题1 思路 题目说右键用不了 因为打开右键可以查看网页的代码 所以我们要想办法打开网页大源代码 复制链接在浏览器上打开 因为右键用不了 我们可以按一下快捷键 1 可以直接按 F12 不过有些电脑不可以 需要按 Fn F12 2 直接按 Ct
  • 初识java——熟悉java代码格式

    CD145 整数的二进制数表达中有多少个1 求一个整数 在内存当中存储时 二进制1的个数 方法一 一个整型的数字共32个比特位 每个比特位如何判断是否为1 只需让这一位和1进行按位与即可 import java util Scanner p
  • TARS-PHP:PHP构建高性能RPC框架

    内容来源 2018 年 5 月 19 日 阅文集团高级开发工程师梁晨在 PHPCon China 2018 技术峰会 进行 TARS PHP PHP构建高性能RPC框架 演讲分享 IT 大咖说 微信id itdakashuo 作为独家视频合
  • activiti-Cancel activity属性(cancelActivity)作用

    流程设计工具 activiti explorer activiti版本 5 22 在使用边界计时器事件时 事件有一个参数 Cancel activity 作用上图 如下 Cancel activity选中 在事件中设置5秒计时 当开始流程后
  • Error: Failed to download resource "python"

    最近在mac 部署flutter开发环境遇到一些IOS开发工具安装的问题 为解决问题到处寻找答案 浪费了大量时间 故在此记录一下避免再次入坑 执行flutter doctor检测环境 开始安装缺失工具 taodeMacBook Pro ta
  • osgEarth的Rex引擎原理分析(二十四)TileNode节点下的场景树分析

    目标 十八 中的问题54 osgEarth Drivers RexTerrainEngine TileNode是rex引擎下的一个重要节点 这个节点还不是真正在Earth中看到的瓦片 其内部还有场景树 具体包括一个SurfaceNode和四
  • stm32学习笔记——外部中断

    stm32的每个IO口都可以作为外部中断输入 stm32的中断控制器支持19个外部中断 事件请求 线0 15 对应外部IO口的输入中断 线16 连接到PVD输出 线17 连接到RTC闹钟事件 线18 连接到USB唤醒事件 每个外部中断线都可