STM32单片机学习5--STM32中断

文章目录

  • 一、前言
  • 二、NVIC中断控制器
    • 2.1、NVIC结构体成员
    • 2.2、抢占优先级和响应优先级
    • 2.3、NVIC的优先级组
  • 三、EXTI外部中断
  • 四、中断实战
    • 4.1、确定连线
    • 4.2、配置中断控制端口
    • 4.3、配置中断端口
    • 4.4、配置中断服务函数
    • 4.5、主函数调用

一、前言

单片机无系统执行逻辑:main函数–>while死循环

EXTI(External Interrupt):外部中断,通过GPIO检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后再返回到中断之前的代码中执行。

在这里插入图片描述


二、NVIC中断控制器

Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常中断,并把他们用一个表管理起来,编号为0 ~ 15的称为内核异常,而16以上的则称为外部中断,这个表称为中断向量表。

这个表可以从《STM32参考手册》找到,但是已办结建议从启动文件startup_stm32f10x_hd.s中查找,因为不同型号的STM32芯片,中断向量表稍微有点区别,在启动文件中,已经有相应芯片可用的全部中断向量。而且在编写中断服务函数时,需要从启动文件中定义的中断向量表查找中断服务函数名。

STM32的中断如此之多,配置起来并不容易,因此我们需要一个强大二方便的中断控制器:NVIC(Nested Vectored Interrupt Controller)

NVIC属于Cortex内核的器件,不可屏蔽中断(NMI)和外部中断都由它来处理。


2.1、NVIC结构体成员

对NVIC进行初始化,首先要定义一个NVIC_InitTypeDef类型的结构体:

结构体成员名称描述
NVIC_IRQChannel需要配置的中断向量
NVIC_IRQChannelCmd使能或关闭相应中断向量的中断响应,ENABLE or DISABLE
NVIC_IRQChannelPreemptionPriority配置相应中断向量抢占优先级
NVIC_IRQChannelSubPriority配置相应中断向量的响应优先级

2.2、抢占优先级和响应优先级

STM32的中断向量具有两个属性:一个为抢占属性,一个为响应属性

其属性编号越小,表明它的优先级别越高

抢占:打断其它中断的属性

响应:当抢占属性相同的情况下,如果中断同时到达,则优先处理响应优先级高的中断

例如:现在有3个中断向量,如下图所示:

在这里插入图片描述

  • 如果内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断;
  • 由于B和C的抢占优先级相同,所以C不能被B打断;
  • 但如果B和C中断是同时到达的,内核就会优先执行响应优先级更高的B中断;

2.3、NVIC的优先级组

在配置优先级的时候,还要注意一个很重要的问题,即中断向量的数量。

NVIC只可以配置16种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4位的数字来决定;

把这个4位数字的位数分配成抢占优先级部分和响应优先级部分,有5组分配方式:

分配说明
第0组0位抢占优先级,4位响应优先级,NVIC_PriorityGroup_0
第1组1位抢占优先级,3位响应优先级,NVIC_PriorityGroup_1
第2组2位抢占优先级,2位响应优先级,NVIC_PriorityGroup_2
第3组3位抢占优先级,1位响应优先级,NVIC_PriorityGroup_3
第4组4位抢占优先级,0位响应优先级,NVIC_PriorityGroup_4

要配置这些优先级组,可以采用库函数:NVIC_PriorityGroupConfig(),可输入参数为NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4

STM32单片机的所有I/O端口都可以配置为EXTI中断模式,用来捕捉外部信号,可以配置为:

  • 下降沿中断(EXTI_Trigger_Falling
  • 上升沿中断(EXTI_Trigger_Rising
  • 上升下降沿中断(EXTI_Trigger_Rising_Falling

三、EXTI外部中断

STM32的所有GPIO都引入到EXTI外部中断线上,使得所有的GPIO都能作为外部中断的输入源,它们以下图的方式连接到16个外部中断/事件线上:
在这里插入图片描述

PAx ~ PGx端口的中断事件都连接到了EXTIx外部中断线上,同一时刻只能响应一个端口的事件触发,不能同时响应所有GPIO端口的事件,但可以分时复用;

EXTI最普通的应用就是:接上一个按键,设置为下降沿触发,用中断来检测按键;


四、中断实战

4.1、确定连线

在这里插入图片描述
如上图所示:我将PA1配置为中断端口,将PB0配置为中断控制端口

期望效果:单片机上电,PB0小灯默认亮,按下PA1按钮,进入中断函数,翻转PB0电位,实现开-关小灯


4.2、配置中断控制端口

#include "led.h"void LED_GPIO_Config(void)
{//定义一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDef GPIO_InitStructure;//开启GPIOB和GPIOC的外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC,ENABLE);//选择要控制的GPIOC引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;//设置引脚模式:通用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚速率:50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//调用库函数,初始化GPIOC13GPIO_Init(GPIOC,&GPIO_InitStructure);//选择要控制的GPIOC引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//设置引脚模式:通用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚速率:50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//调用库函数,初始化GPIOC13GPIO_Init(GPIOB,&GPIO_InitStructure);}

在这里插入图片描述


4.3、配置中断端口

#include "exit.h"//NVIC初始化
static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;//设置优先级组为高1位为抢占优先级,低3位为响应优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置中断源NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;	//因为我们使用的是PA1,所示是EXTI1_IRQnNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能NVIC_Init(&NVIC_InitStructure);								//初始化NVIC控制器
}void EXIT_PA1_Config(void)
{//定义结构体//-------------------------------------GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;//开启外设时钟//-------------------------------------RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//配置NVIC//-------------------------------------NVIC_Configuration();//中断端口GPIO配置(PA1)//-------------------------------------GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//中断线模式配置//-------------------------------------GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);EXTI_InitStructure.EXTI_Line = EXTI_Line1;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;	//下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}

4.4、配置中断服务函数

中断服务函数必须定义在stmf10x_it.c文件中,中断服务函数的名字必须要与启动文件startup_stm32f10x_hd.s中的中断向量表定义一致

一般来说:

  • EXTI0对应的中断函数为EXTI0_IRQChannel;
  • EXTI1对应的中断函数为EXTI1_IRQChannel;
  • EXTI2对应的中断函数为EXTI2_IRQChannel;
  • EXTI3对应的中断函数为EXTI3_IRQChannel;
  • EXTI4对应的中断函数为EXTI4_IRQChannel;
  • EXTI5 -> EXTI9对应的中断函数为EXTI9_5_IRQHandler;
  • EXTI10 ->EXTI15对应的中断函数为EXTI15_10_IRQHandler;

在这里插入图片描述

//定义中断服务函数
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) != RESET){GPIO_WriteBit(GPIOB, GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0))));EXTI_ClearITPendingBit(EXTI_Line1);}
}

在这里插入图片描述


4.5、主函数调用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于使用jdk8自带的日期类getDayOfWeek()的详细解释

问题引入 我们会发现getDayOfWeek()这个函数和其他自带函数不一样 直接写会报错 但是如果我们将他变成getDayOfWeek().getValue() 又能够正常运行,我们这次就来看看是为什么 解释 进入getDayOfWeek()源码查看 我们进入getDayOfWeek()的源码中查看 我们可以发现他给我们返回的…

vivado:关联notepad++

网上好多都要下插件,看了野火视频,直接在vivado里面加路径弄好的 2 3(那个fonts and colors也经常用 改字体) 4 5 以下是我的路径 D:/gongjuruanjian/notepad/Notepad/notepad.exe [file name] -n[line number] 把[file name] -…

上位机图像处理和嵌入式模块部署(自定义算法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们在使用opencv的时候,虽然大部分算法都不需要我们自己重头开始编写,但是总有一些关于我们自己产品的know-how&#xff0…

控制项目风险

一、风险预算 暴雪公司经理艾莉森,暴雪公司是一家小型工业企业,该公司的高管为了降低生产成本,决定搬迁工厂。项目经理明白实际情况与初始计划之间常常会有很大的出入。项目经理需要事先为一些事情做好准备,并在项目运作或预算方面…

python报错:TypeError: ‘str‘ object is not callable

错误打印: python 代码: datalist [];datadictTmp (};mch 48;for i in range(1,10):datadict.clear()mch 48 ## 报错位置 datadict[parent_ID] str(i)chr(mch)mch 1datadict[paymentMethod] str(i)chr(mch)mch 1datadict[payer] str(i)chr(mc…

【服务器】安装宝塔面板

目录 🌺【前言】 🌼【前提】连接服务器 🌷方式一 使用工具登录服务器如Xshell 🌷方式二 阿里云直接连接 🌼 1. 安装宝塔 🌷获取安装脚本 方式一 使用下面提供的脚本安装 方式二 使用官网提供的脚本…

notepad++ v8.5.3 安装插件,安装失败怎么处理?下载进度为0怎么处理?

notepad v8.5.3 安装插件,安装失败?下载进度为0,怎么处理? 安装 进度 进度条没有进度 ,然后就退出了,自动打开程序,不知道什么问题,插件管理下面也没有插件显示 找到问题了&#x…

2024年最全春节攻略,外贸人看这一篇就够了

凡事预则立,不预则废--《礼记•中庸》 不知不觉春节将至,很多外贸公司以及工厂也都公布了放假时间,虽然放假时间有长有短。很多人应该都有点迫不及待想要快点放假,回家过春节。春节毕竟是我们每年最重大的节日,也是家…

梯度下降算法实现原理

文章目录 什么是梯度梯度下降算法(通过迭代解决目标函数最小值)代码实现拓展: 什么是梯度 在了解梯度之前,我们先了解一下导数: 用于描述曲线变换快慢的一个量,在几何意义上表示为函数的斜率,数学定义为: f ′ ( x ) lim ⁡ △ x → 0 f ( x △ x ) − f ( x ) △ x f(x) \…

【Python进阶编程】python编程高手常用的设计模式(持续更新中)

Python编程高手通常熟练运用各种设计模式,这些设计模式有助于提高代码的可维护性、可扩展性和重用性。 以下是一些Python编程高手常用的设计模式: 1.单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供全局…

幻兽帕鲁服务器搭建,包教包会

服务器搭建 幻兽帕鲁服务器搭建,包教包会,不会评论区评论手把手帮忙搭建 一、steamCMD安装 1、安装screen: yum install screen -y 2、切换用户: su -ls /bin/bash steam 3、切换至steam用户目录: cd ~ 4、下载ste…

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 订单金额满多少,一次性订单金额满多少,充值多少升级

“订单金额满多少”或“一次性订单金额满多少”进行升级的商业逻辑。这种策略通常是为了激励用户增加消费额度、提高客单价或者提升用户的活跃度与忠诚度,具有以下好处: 刺激消费增长:商家设置一定的门槛,如一次性订单金额满300元…

C++基础语法和用法

文章目录 1.hello world2.引入namespace(命名空间/域问题)3.输入输出4.缺省参数/默认参数5.函数重载6.引用7.内联函数8.auto关键字&#xff0c;基于范围的for循环&#xff0c;空指针NULL8.1 auto8.2 基于范围的for循环8.3 nullptr 1.hello world #include <iostream> us…

世界经济论坛发布《2024年全球风险报告》和《2024年全球网络安全展望》:网络攻击是2024世界5大风险之一,网络安全经济增速是全球经济的四倍

在近日举行的世界经济论坛 (WEF)上&#xff0c;发布了《2024 年全球风险》报告和《2024年全球网络安全展望》两份重磅报告&#xff0c;分别揭示了全球经济今年和未来几年可能面临的一些关键风险和问题&#xff0c;以及网络安全与全球经济之间的逻辑关系。 2024年全球风险报告 今…

CloudPanel RCE漏洞复现(CVE-2023-35885)

0x01 产品简介 CloudPanel 是一个基于 Web 的控制面板或管理界面,旨在简化云托管环境的管理。它提供了一个集中式平台,用于管理云基础架构的各个方面,包括虚拟机 (VM)、存储、网络和应用程序。 0x02 漏洞概述 由于2.3.1 之前的 CloudPanel 具有不安全的文件管理器 cook…

MyBatis第四课动态SQL

目录 引言&#xff1a; 一、动态SQL书写方式 二、会帮我们处理多余的字符 方法2:使用where也可以进行消除and&#xff0c;但是出现的问题 三、标签 四、foreach(循环操作) ​编辑 Mybatis传递List集合报错 Available parameters are [collection, list] 和 引言&…

Linux: make/Makefile 相关的知识

背景&#xff1a; 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c…

良心推荐!五个超好用的Vue3工具

vue3-dnd 是用来做drag and drop的&#xff0c;也就是拖放&#xff0c;很多人多 Vue 的拖放库已经断代了&#xff0c;其实 Vue3 也有拖放库的&#xff0c;那就是 vue3-dnd。 v-wave 这可库可以通过自定义指令的形式&#xff0c;让目标点击节点具备波纹的效果&#xff0c;如下…

MySQL两个表的亲密接触-连接查询的原理

MySQL对于被驱动表的关联字段没索引的关联查询&#xff0c;一般都会使用 BNL 算法。如果有索引一般选择 NLJ 算法&#xff0c;有 索引的情况下 NLJ 算法比 BNL算法性能更高。 关系型数据库还有一个重要的概念&#xff1a;Join&#xff08;连接&#xff09;。使用Join有好处&…

学会使用ubuntu——ubuntu22.04使用WebCatlog

Ubuntu22.04使用WebCatlog WebCatlog是适用于Gnu / Linux&#xff0c;Windows或Mac OS X系统的桌面程序。 引擎基于铬&#xff0c;它用于在我们的桌面上处理Web服务。简单点就是把网页单独一个窗口出来显示&#xff0c;当一个app用。本文就是利用WebCatlog安装后的notion编写的…