【STM32】EXTI与NVIC标准库使用框架

news2024/11/15 21:24:13

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

目录

EXTI简介

EXTI配置

使能AFIO的时钟

配置GPIO端口为外部中断 

外部中断初始化

NVIC介绍与配置

NVIC中断优先级分组

 NVIC初始化

NVIC框架

 EXTI配置图

中断函数

中断函数配置

获取中断挂起位

清楚中断挂起标志位 

 中断函数框架

EXTI框架


EXTI简介

EXTI(Extern Interrupt),外部中断,也可配置事件,又可称事件控制器

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件触发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

中断通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

后个主要用于低功耗的停止模式下使用外部中断唤醒

触发响应方式:中断响应/事件响应,中断由CPU响应,事件由外设响应

EXTI配置

使能AFIO的时钟

外部中断需要写事件控制寄存器(AFIO_EVCR),外部中断配置寄存器(AFIO_EXTICRX)

对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO 的时钟。

事件控制寄存器(AFIO_EVCR)

故要开启AFIO的时钟,而AFIO在APB2外设总线上

 再由RCC时钟树,需要使能APB2外设的AFIO时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

配置GPIO端口为外部中断 

有关GPIO的详细配置请阅读这篇博客,这里不再赘述

【STM32】GPIO和AFIO标准库使用框架-CSDN博客

外部中断的GPIO_Mode为输入模式,设置为输入信号的默认电平对应的模式,更多见STM32F10xxx参考手册8.1.11 外设的GPIO配置

输入电平默认为高电平,上拉输入;输入电平默认为低电平,下拉输入。输入电平不确定选浮空输入

相同的Pin不能同时触发中断,比如GPIOX0只能有一个可以触发中断,GPIOA0映射到中断了,GPIOB0就不可以了

GPIO_PortSourceGPIOX  ,X为A,B,C... 

GPIO_PinSourcexX,             X为0,1,2 ...

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);

GPIO_EXTILineConfig函数将指定端口配置到中断通道

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度,输入无用
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);

外部中断初始化

中断

要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个 中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

事件

如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存 器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。 通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。

使能中断线

要产生中断,必须先配置好并使能中断线。

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

触发边沿选择

这个配置的是进入中断函数的电平变化边沿

 上升沿EXTI_Trigger_Rising
下降沿EXTI_Trigger_Falling
双边沿EXTI_Trigger_Rising_Falling
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

选择模式

中断模式EXTI_Mode_Interrupt
事件模式EXTI_Mode_Event
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

 选择中断通道

对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于STM32F10xxx其它产品(小容量、中容量和大容量),则有19个能产生事件/中断请求的边沿检测器

那我这个有19个能产生事件/中断请求的边沿检测器

 EXTI_LineX,  X为0到19

EXTI_InitStructure.EXTI_Line = EXTI_Line12;

 EXTI初始化

	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line12;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);

● EXTI线0~15连接到GPIO口

● EXTI线16连接到PVD输出

● EXTI线17连接到RTC闹钟事件

● EXTI线18连接到USB唤醒事件

● EXTI线19连接到以太网唤醒事件(只适用于互联型产品)

后四个主要用于低功耗的停止模式下使用外部中断唤醒

NVIC介绍与配置

NVIC是CPU的助手,管理中断,使中断有序执行

NVIC在内核里,不是外设,标准库函数声明在 misc.h 文件

NVIC特性

68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);

● 16个可编程的优先等级(使用了4位中断优先级);

● 低延迟的异常和中断处理;

● 电源管理控制;

● 系统控制寄存器的实现; 嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地 处理晚到的中断。

嵌套向量中断控制器管理着包括内核异常等中断

NVIC中断优先级分组

NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级,抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

具体中断号见参考手册中断向量表

中断个数比较少的话,就比较随意了,这个函数整个文件只需配置一次,多次配置会覆盖

 示例代码为分组二

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 NVIC初始化

中断通道接入NVIC

NVIC_IRQChannel,参数在stm32f10x.h 文件

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;

 使能NVIC通道

NVIC_IRQChannelCmd,指定NVIC_IRQChannel中定义的IRQ通道是启用还是禁用

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

抢占优先级

NVIC_IRQChannelPreemptionPriority

	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

响应优先级

NVIC_IRQChannelSubPriority

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

 NVIC初始化框架

	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStructure);

NVIC框架

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//多个中断只配置一次
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStructure);

 EXTI配置图

 图片来源:STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

中断函数

中断函数位置不固定

中断函数配置

中断函数名要与启动文件内中断向量名一样

中断函数快进快出,尽量不要加延时,不要在主函数和中断函数同时使用OLED等外设,易导致错误

中断函数不在主函数内使用,空闲时,不执行。检测到通道对应的边沿,立刻跳转,跳转后清除中断标志位,执行完中断函数,返回主函数里中断函数执行前的位置。

获取中断挂起位

FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//main中调用
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//中断函数中调用

清楚中断挂起标志位 

void EXTI_ClearFlag(uint32_t EXTI_Line);//main中调用
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//中断函数中调用

 中断函数框架

	
	void EXTI15_10_IRQHandler(void)
	{
		if(EXTI_GetITStatus(EXTI_Line12) == SET)
		{
			
			EXTI_ClearITPendingBit(EXTI_Line12);
		}
}

EXTI框架

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度,输入无用
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
	
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line12;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStructure);
	
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
	
	
	
	void EXTI15_10_IRQHandler(void)
	{
		if(EXTI_GetITStatus(EXTI_Line12) == SET)
		{
			
			EXTI_ClearITPendingBit(EXTI_Line12);
		}
}

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

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

相关文章

GPU as Code:趋动OrionX产品的创新之路

在当今快速发展的云计算和DevOps领域,IaC (Infrastructure as Code) 已经成为提升IT基础设施管理效率的关键实践。趋动科技的OrionX产品,通过软件定义GPU硬件,为开发者和运维团队提供了一种全新的AI算力资源管理方式。本文将深入探讨OrionX如…

习题2.32

这个题目 粗看起来好像是很简单,但是我在实现的时候,真的是废了好大的力气,主要原因有三点,第一,对clojure语言的属性程度不够高,第二,课本语言与clojure语言的差异点,我自以为理解的很透彻,导致了出现很奇异的现象,我找不到解释,一点思路都没有。第三,也就是最关键…

Vue 3+Vite+Eectron从入门到实战系列之(二)一Elementplus及VueRouter的配置

为了后续开发方便,在没有 UI 设计师配合的情况下,让我们的界面更加美观,我们使用 elementplus 组件库,并配置路由。 删除不需要的默认文件夹及文件,src 配置如下 实现效果 安装 elementplus,vue-router npm install element-plus --save npm install vue-router --save在…

25考研数据结构复习·8.1插入排序·8.2交换排序

目录 排序的基本概念 插入排序 直接插入排序/折半插入排序 希尔排序 交换排序 冒泡排序 算法原理 性能 👩‍💻 快速排序 排序的基本概念 排序:将各元素按关键字递增/或递减顺序重新排列评价指标 稳定性:关键字相同的元素…

【Langchain大语言模型开发教程】基于Langchain的私人助手

终于学习完了Langchain框架的核心内容,最后基于langchain技术实现一个个人知识库助手的小项目,将这些内容串联起来,在实际中进行应用。 工具清单: 1、langchain框架 2、chroma向量数据库 3、embedding模型(bge-larg…

qt下载安装

1.在目录栏输入CMD,然后按回车 2. 输入以下内容回车启动在线安装程序 镜像源: 清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/ 北京理工大学:http://mirror.bit.edu.cn/qtproject/ 中国互联网络信息中心:http…

Android之复制文本(TextView)剪贴板

效果图&#xff1a; 功能简单就是点击“复制”&#xff0c;将邀请码复制到 剪贴板中 布局 <androidx.constraintlayout.widget.ConstraintLayoutandroid:id"id/clCode"android:layout_width"dimen/dp_0"android:layout_height"dimen/dp_49"…

贝壳找房:基于OceanBase构建实时字典服务的实践 | OceanBase案例

贝壳找房作为领先的居住服务综合平台&#xff0c;一直在推进居住产业的数字化与智能化升级。该平台通过汇聚并赋能优质的服务者&#xff0c;旨在为中国广大家庭带来涵盖二手房买卖、新房交易、房屋租赁、家装、家居以及家庭服务等全方位、高质量且高效的居住服务体验。 在贝壳…

Linux学习记录(二)-------文件IO

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言文件IO1.函数open2.函数close3.函数lseek4.函数read5.函数write 前言 文件IO Linux 自带的工具&#xff1a;man手册 man 1 是普通的shell命令&#xff0c;比如…

最新CSS3横向菜单的实现

横向菜单 原始代码&#xff1a; <nav class"list1"><ul><li><a href"#">Shirts</a></li><li><a href"#">Pants</a></li><li><a href"#">Dresses</a>…

零基础STM32单片机编程入门(二十五) 内部FLASH模拟EEPROM实战含源码

文章目录 一.概要二.FLASH模拟EEPROM的优势三.FLASH模拟EEPROM的原理四.数据读写步骤五.数据转移流程图六.FLASH模拟EEPROM读写例程七.CubeMX工程源代码下载八.小结 一.概要 STM32F103C8T6是一款强大而灵活的微控制器&#xff0c;它的片内Flash存储器可以用来存储有关数据&…

sqli-labs-php7-master第5-10关

第五关&#xff1a; 根据提示输入ID,随便来个一 输入100&#xff0c;因为数据库没有&#xff0c;所以这里没输出内容 还是先找注入点&#xff1a;输入单引号试试 注入点找到了‘ 查询数据库列数&#xff1b;&#xff1f;id1 order by 4 -- 测试发现order by 3时页面正常&…

C++笔试练习笔记【5】:最小花费爬楼梯(有题目链接) 初识动态规划

文章目录 题目思路代码 动态规划简介**一、什么是动态规划****二、动态规划的应用场景****三、动态规划的基本步骤****四、动态规划的优缺点** 题目 题目链接&#xff1a;https://www.nowcoder.com/practice/9b969a3ec20149e3b870b256ad40844e?tpld230&tpld39751&ru/…

探索人工智能技术的发展导致知识崩溃危险的可能性

概述 本文分析了人工智能&#xff08;AI&#xff09;技术的发展在缩小人类知识库方面的潜力。 作者认为&#xff0c;如果大语言模型&#xff08;LLMs&#xff09;等人工智能技术迅速发展&#xff0c;人工智能生成的内容成为人类接触的大部分信息&#xff0c;那么长尾知识&…

python图表没有正确显示中文,这通常是因为matplotlib的默认设置不支持中文字符,或者相应的字体没有正确加载。

如果图表没有正确显示中文&#xff0c;这通常是因为matplotlib的默认设置不支持中文字符&#xff0c;或者相应的字体没有正确加载。你可以通过指定支持中文的字体来解决这个问题。下面是如何设置matplotlib以确保能够在图表中显示中文的步骤&#xff1a; 方法1&#xff1a;全局…

python的多线程

python的threading模块&#xff0c;它提供了丰富的接口来创建和管理线程。 定义一个函数print_numbers&#xff0c;这个函数将由线程执行。在这个函数中&#xff0c;我们使用一个循环来打印数字&#xff0c;并使用time.sleep(1)来模拟每个数字打印之间有1秒的延迟。 在 if __…

Windows应急响应-排查方式

目录 Windows应急响应排查流程一、账户排查排查方法&#xff08;1&#xff09;查看用户信息&#xff08;2&#xff09;lusrmgr.msc手动查&#xff08;比较麻烦&#xff09;&#xff08;3&#xff09;检测克隆账户 ---可使用安全工具D盾进行检测&#xff0c;同时可以直接查看端口…

群辉NAS利用AList搭建混合云盘⑥挂接腾讯微云

目录 ……接前文 5、挂接腾讯微云 未完待续…… ……接前文 5、挂接腾讯微云 登录AList后台→管理→存储→驱动供选择“腾讯微云”→填写挂接路径 打开“配置文档”(详见前文) 打开配置文档→简体中文→开始→找到腾讯微云部分,可以看到关于Cookie的设置方法。 手工用…

第十二章 元数据管理10分

12.1 引言 如果没有元数据&#xff0c;组织可能根本无法管理其数据。 ISO/IEC11179 元数据注册标准。 元数据管理原则&#xff1a;应归尽归&#xff0c;应收尽收。衡量标准&#xff1a;目录是否完整。&#xff08;去第十二章 元数据管理&#xff09;。 主数据管理&#xff1a;主…

(Javaweb)Ajax,Axios,Vue

目录 一.Ajax 二.Axios 三.前端工程化 四.接口文档的管理平台YAPI 五.Vue项目 六.Vue项目开发流程 一.Ajax 1.通过Ajax从服务器端获取数据 Ajax---JavaScript&#xff08;网页行为&#xff09;XML&#xff08;标记语言--用来存储数据&#xff09; 客户端--浏览器 服务…