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

news2024/11/24 3:15:33

文章目录

  • 一、前言
  • 二、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.coloradmin.cn/o/1406041.html

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

相关文章

央视:人工智能规模达5000亿元,企业超4400家,生成式AI发展进入快车道

2023年,对世界和中国来讲都是非常不平凡的一年。新一代信息技术,如5G、大数据和云计算,正在引领全球科技和产业变革的潮流。这些技术已经深深地融入了经济社会发展的各个领域,推动信息通信业实现了跨越式的发展。 1、AI助力产业发…

教你三个方法去除图片上的涂鸦快收藏起来吧

在数字时代,我们经常需要在图片上进行各种编辑和修改,以使其符合我们的需求。然而,有时候我们会遇到一些图片上的涂鸦,这些涂鸦不仅影响了图片的美观度,还破坏了图片的整体效果。那么图片上的涂鸦怎么去掉,…

Hive 行列转换

行列转换 列转行 使用 lateral view explode(array|map) 或 lateral view inline(array_struct) 可以将列转换为行。 单列转多行,降维(单列数组或键值对) 示例1:explode(array(…)) select ..., A from T lateral view exp…

RT-DETR 模型改进 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

【Godot4自学手册】第三节设置主人公的动画

继续,今天是第三节,我们主要实现主人公的动画效果,共有两种方法实现动画效果 一、通过AnimationPlayer节点实现动画效果 我们首先在player场景下,player节点下添加AnimationPlayer节点,添加方法是,在play…

嵌入式学习-网络编程-Day6、7

嵌入式学习-网络编程-Day6 一、思维导图 二、作业 1.基于UDP的网络聊天室(2024.1.21号前上交) 项目需求: 1.如果有用户登录,其他用户可以收到这个人的登录信息 2.如果有人发送信息,其他用户可以收到这个人的群聊信息…

【论文代码】基于隐蔽带宽的汽车控制网路鲁棒认证-到达时间间隔通道的Java实现(二)

文章目录 五、TransmissionThread 抽象类5.1 IAT_thread类5.2 DLC_Thread 六、AttestationProtocol 接口6.1 HardCodedAttestation 七、FilterMash 类7.1 FilterValue 八、其他类8.1 CANAuthMessage8.2 USBtinException8.3 USBtinLibDemo8.4 CANMessage8.5 NoiseThread8.6 Filt…

Vulnhub靶机:FunBox 4

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:FunBox 4(10.0.2.29) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.com/funbo…

11.什么档次的原型模式和我写的一样

在《生化危机》系列电影中,克隆人是个频频出现的话题。保护伞公司为了需求复制出另一个战力相当的战士Alice,不惜克隆成百上千个Alice,然而直到最后,非但没有真正克隆出另一个完美的Alice,就连Alice自己也被证实是保护…

华为OD机试之阿里巴巴找黄金宝箱(IV) C++

题目背景 贫如洗的椎夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面有一人数字,箱子排列成一个环,编号最大的箱子的下一个是编号为0的箱子。请输出每个箱了贴的数字之…

REVIT二次开发万能刷

将这两个参数赋予其他参数 步骤2 将来做个可以调控的版本 using System; using System.Collections.Generic; using System.Lin

常用界面设计组件 —— 数字输入和显示组件

2.3 数字输入和显示组件2.3.1 QSpinBox 与 QDoubleSpinBox2.3.2其它数值输入和显示组件 2.3 数字输入和显示组件 2.3.1 QSpinBox 与 QDoubleSpinBox QSpinBox用于整数的显示和输入,一般显示十进制 数,也可以显示二进制、十六进制数,而且可以…

基于SpringBoot的智慧社区居家养老健康管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

Shell脚本------变量

目录 一、shell脚本的变量 1、shell脚本的变量是什么? 2、变量的作用 3、变量作用范围 3.1、临时设置 3.2永久设置,需要在/etc/profile文件里添加 4、删除变量 5、变量基础 6、变量命名要求 7、特殊符号 8、整数运算 9、expr算术表达式 二、…

如何在WordPress网站中添加多语言搜索(2种简单方法)

您想在WordPress网站中添加多语言搜索吗? 如果您有一个多语言 WordPress 网站,那么添加多语言搜索功能可以帮助用户通过使用自己的语言进行搜索来更快地找到信息。 在本文中,我们将向您展示如何在 WordPress 中轻松添加多语言搜索&#xff…

“深入理解RabbitMQ交换机的原理与应用“

深入理解RabbitMQ交换机的原理与应用 引言1. RabbitMQ交换机简介介绍1.1 什么是RabbitMQ?1.1.1 消息中间件的作用1.1.2 RabbitMQ的特点和优势 1.2 RabbitMQ的基本概念1.2.1 队列1.2.2 交换机1.2.3 路由键 1.3 交换机的作用和分类1.3.1 直连交换机(direct…

32、WEB攻防——通用漏洞文件上传二次渲染.htaccess变异免杀

文章目录 一、点过滤二、文件删除三、二次渲染四、.htaccess五、过滤php关键函数 一、点过滤 不能写带文件后缀的文件名;IP转数字 二、文件删除 文件依据规则进行删除,删除有两种删除的类型: 什么文件都删除,条件竞争进行绕过…

linux zabbix监控

zabbix总结 zabbix-server 10051 zabbix-agent 10050 zabbix-proxy 10051 1.监控项(模板):获取监控数据 #模板直接链接到新的主机 2.触发器:设置一个值 在非合理区间报警 3.动作:可以帮忙发送通知(告…

深入理解Python循环嵌套

循环嵌套是一种常见的编程技巧,它可以用于处理多维数据结构、模拟多层逻辑等场景。本文将深入探讨Python中的循环嵌套,包括基本语法、应用场景以及一些最佳实践。 循环嵌套的基本语法 在Python中,循环嵌套指的是在一个循环语句的内部再嵌套另…

Microsoft Remote Desktop for Mac(远程桌面连接)激活版

Microsoft Remote Desktop是一款由微软开发的远程桌面连接工具,它允许用户从另一台计算机或移动设备远程连接到Windows桌面或服务器。 以下是该软件的一些主要特点和功能: 跨平台支持:Microsoft Remote Desktop支持Windows、macOS、iOS和Andr…