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;
	//设置引脚速率:50MHz
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	//调用库函数,初始化GPIOC13
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	//选择要控制的GPIOC引脚
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	//设置引脚模式:通用推挽输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	//设置引脚速率:50MHz
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	//调用库函数,初始化GPIOC13
	GPIO_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_IRQn
	NVIC_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.mfbz.cn/a/344744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity之Cinemachine教程

前言 Cinemachine是Unity引擎的一个高级相机系统,旨在简化和改善游戏中的相机管理。Cinemachine提供了一组强大而灵活的工具,可用于创建令人印象深刻的视觉效果,使开发人员能够更轻松地掌控游戏中的摄像机行为。 主要功能和特性包括&#x…

Linux代码行数统计工具cloc

这里推荐个Perl语言开发的开源代码统计工具cloc,全称为Count Lines of Code。支持多平台使用、多编程语言识别。 在Ubuntu下安装cloc: sudo apt-get install cloc运行cloc可以cd到指定目录运行: cloc . # 或者例如统计src目录下的代码行数 …

微信小程序跳转第三方网站链接

很简单&#xff0c;先定义一个跳转外网的页面&#xff0c;利用 web-view 标签&#xff0c;通过src设置你要跳转的外网地址 <web-view src"https://www.baidu.com"></web-view>然后在你的跳转按钮写跳转函数即可 wx.navigateTo({url: /pages/webView/inde…

微信小程序(十一)表单组件(进阶)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a;&#xff08;涉及内容较多&#xff0c;建议细看源码&#xff09; 1.radio-group的使用与数据处理 2.checkbox-group的使用与数据处理 3.picker的使用与数据同步处理(此处示范了地域与日期) 源码&#xff1a; form…

使用API有效率地管理Dynadot域名,使用API进行域名注册

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

国标GB28181协议EasyCVR启动失败报错“Local Machine Check Error”的解决方法

国标GB28181安防监控系统EasyCVR平台采用了开放式的网络结构&#xff0c;可支持4G、5G、WiFi、有线等方式进行视频的接入与传输、处理和分发。安防视频监控平台EasyCVR还能支持GIS电子地图模式&#xff0c;基于监控摄像头的经纬度地理位置信息&#xff0c;将场景中的整体安防布…

如何设计性能测试用例!一文1000字详解(建议收藏)

性能测试是确保软件应用在各种负载和条件下都能保持良好性能的关键活动&#xff0c;涉及到系统的响应时间&#xff0c;还包括吞吐量、资源利用率、可靠性和系统的可伸缩性。 性能测试用例设计需要对业务需求和系统行为有深刻理解&#xff0c;设计过程涉及确定测试目标、选择相…

基于无线脉冲,超宽带技术的高精度人员定位系统源码,可实现人员、物资的精准定位

随着工业4.0深入推进信息化&#xff0c;智能化&#xff0c;数据化管控成为企业不可或缺的竞争力&#xff0c;其中人员物资等实时位置信息成为变革关键&#xff0c;因此&#xff0c;uwb超宽带高精度定位系统应运而生&#xff0c;高精度的位置数据作为智能工厂数据流的重要组成部…

【EI会议征稿】第三届光电信息与功能材料国际学术会议(OIFM 2024)

第三届光电信息与功能材料国际学术会议&#xff08;OIFM 2024&#xff09; The 3rd International Conference on Optoelectronic Information and Functional Materials 第三届光电信息与功能材料国际学术会议&#xff08;OIFM 2024&#xff09;将于2024年4月5-7日在武汉召开…

编辑图片加文字的软件?分享4款!

在数字时代&#xff0c;图片和文字的结合已经成为信息传递的重要方式。为了满足广大自媒体人和内容创作者的需求&#xff0c;本文将为您推荐几款编辑图片加文字的软件&#xff0c;帮助您轻松实现创意表达。 魔法抠图大师 作为一款专业的图片编辑软件&#xff0c;还提供了多种编…

MySQL 8.3 发布, 它带来哪些新变化?

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能&#xff0c;更多是修复bug )&#xff0c;本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

GPSR路由算法的MATLAB实现

GPSR基于节点地理位置路由信息&#xff0c;采用贪婪策略和右手准则的结合在邻居节点中选择下一跳节点进行数据转发。节点在进行路由选择时&#xff0c;只需知道自己、邻居和目标节点的地理位置信息&#xff0c;无需维护全局网络的链路状态&#xff0c;这在很大程度上降低了网络…

【JavaEE进阶】 MyBatis使用注解实现增删改查

文章目录 &#x1f343;前言&#x1f334;传递参数&#x1f38b;增(Insert)&#x1f6a9;返回主键 &#x1f384;删(Delete)&#x1f332;改(Update)&#x1f333;查(Select)&#x1f6a9;起别名&#x1f6a9;结果映射&#x1f6a9;开启驼峰命名(推荐使用) ⭕总结 &#x1f343…

电源模块测试项目:输入低压点循环测试及测试方法

输入低压点循环测试是什么? 电源输入低压点循环测试是检测电源在低压条件下的性能和稳定性&#xff0c;它是一次电源模块的输入欠压点保护的设置回差测试。当输入电压较低&#xff0c;接近一次电源模块欠压点关断时&#xff0c;带载时欠压; 断后由于电源内阻原因&#xff0c;负…

初识Docker(架构、安装Docker)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中。这些容器可以在不同的计算平台上运行&#xff0c;如Linux和Windows&#xff0c;并且可以实现虚拟化。Docker 的设计目标是提供一种快速且轻量…

智能机器人与旋量代数(12)

Chapt 4. 旋量代数在机器人学中的应用 4.1 串联机器人正运动学的指数积(PoE, Product of Exponetial)公式 4.1.1 回顾&#xff1a;机器人正运动学的Denavit-Hartenberg (D-H)参数公式 D-H 建模法: D-H 建模方法是由 Denavit 和 Hartenberg (ASME, 1955) 提出的一种建模方法&…

谷歌浏览器新增3个重磅生成式AI!自动生成文本、壁纸等

1月24日&#xff0c;谷歌在官网宣布&#xff0c;在谷歌浏览器&#xff08;Chrome最新版本M121&#xff09;中新增自动生成文本、壁纸以及自动管理标签3个全新生成式AI功能&#xff0c; 这也是为数不多支持生成式AI的浏览器。需要注意的是&#xff0c;由于这三项功能处于预览测…

33、WEB攻防——通用漏洞文件上传中间件解析漏洞编辑器安全

文章目录 一、中间件文件解析——IIS&Apache&Nginx1、IIS2、Apache3、Nginx 二、web编辑器 一、中间件文件解析——IIS&Apache&Nginx 1、IIS IIS爆过漏洞的版本&#xff1a;IIS6.0&#xff08;windows server 2003&#xff09;、IIS7.0和IIS7.5&#xff08;w…

如何在CentOS使用docker-compose部署Apache Superset并实现公网访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

【云原生】Docker的安装和镜像操作

目录 什么是Docker&#xff1f; 容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; Docker与虚拟机的区别&#xff1a; 容器在内核中支持2种重要技术&#xff1a; Docker核心概念&#xff1a; 安装Docker 安装依赖包 设置阿里云镜像源 安装 Docker-CE并设置为开机…