STM32中断——外部中断

目录

一、概述

二、外部中断(Extern Interrupt简称EXTI)

三、实例-对射式红外传感器

1、配置中断:

2 、完整代码


一、概述

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。

STM32中有68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设;使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级.

NVIC就是STM32中用来管理中断、分配优先级,被称为内嵌向量中断控制器。

可以根据医院中叫号的例子进行理解。如上图EXIT、TIM等等当作病人,NVIC当作叫号系统,CPU当作医生。根据病人的等级分配一个优先级,叫号系统看一下现在在排队的病人,优先叫紧急的病人,叫号系统会把该病人的号进行提前,然后医生就可以看病了。

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

根据上面看病例子,响应优先级高的可以优先排队,就是病人很紧急的可以优先看病,可以插队看病。抢占优先级高的可以中断嵌套,就是,一个病人A正在看病,病人中来了个很紧急的病人B,这时病人B直接进到医生屋里,直接打断病人A看病,然后医生给病人B看,看完后,再给病人A看。

二、外部中断(Extern Interrupt简称EXTI)

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

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

3、支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(这个就是如PA1和PB1或PA1、PB1、PC1,这种Pin一样的不能同时用,只能选择一个作为中断) 

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

5、触发响应方式:中断响应/事件响应。触发引脚是中断响应,事件响应就是外部中断的信号就不会通向CPU了,而是通向其他外设,用来触发其他外设的操作。

如下图,经过AFIO中断引脚选择后,只有一个16位通道,所以相同的Pin不能同时触发中断,只能选择其中一个。EXTI总共有20个输入信号(加了下面绿色蹭饭的四个),经过EXTI电路之后,分为两种输出,一种是NVIC,另一种是其他外设,在NVIC中外部中断5~9,10~15放在了一个通道中,也就是说,外部中断5~9,10~15可以触发同一个中断函数,在编程中,需要根据标志位来区分到底哪个中断进来。

最下面有20条输出线路到了其他外设,用来触发其他外设,也就是前面所说的事件响应

AFIO复用IO口

  • AFIO主要用于引脚复用功能的选择和重定义
  • 在STM32中,AFIO主要:复用功能引脚重映射、中断引脚选择

外部中断一些应用场景,其实是由突发信号来产生中断。

三、实例-对射式红外传感器

工作原理:

  • 有遮挡,输出高电平;无遮挡,输出低电平
  • 有输出状态指示灯,输出高电平灯灭,输出低电平灯亮

本实验是通过该红外传感器进行计数,计数值在OLED屏显示。

1、配置中断:

  • 配置时钟外设
//使用的是B端
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//AFIO外设,也是在RCC_APB2Periph总线中的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  • GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
  • 配置AFIO
//通过AFIO,选出中断通道
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
  • 配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;                //B14
EXTI_InitStructure.EXTI_LineCmd=ENABLE;                  //使能
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;        //中断响应
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;    //下降沿EXTI_Init(&EXTI_InitStructure);  //EXTI初始化
  • 配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //先进行分组,用得分组2NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;  //选10_15,用的是14NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;       //使能NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;  //抢占优先,中断少,可以随便设置NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;         //响应优先NVIC_Init(&NVIC_InitStruct);                     //NVIC初始化
  • 最后配置中断服务函数

中断服务函数格式和函数名是固定的,可以在起始文件进行查看。如下,一个是5—9通道,另外一个是10-15通道,这里用到的是10-15:

代码如下:

void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14)==SET)     //14通道发生中断时,会产生中断标志位,也就是高电平,通过EXTI_GetITStatus()读取{Delay_ms(10);                          //延时,防止抖动CountSensor_Num++;EXTI_ClearITPendingBit(EXTI_Line14);   //清除中断标志位,如果不清除,会不断发生中断}}}

2 、完整代码

分模块文件进行编程,如下:

CountSensor.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"uint16_t CountSensor_Num=0;void CountSensor_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStruct;//配置外设RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //EXIT和NVIC是不需要开启始终,NVIC是内核的GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//配置EXITEXTI_InitStructure.EXTI_Line=EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);  //EXTI初始化//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);}uint16_t CountSensor_Get(void)
{return CountSensor_Num;
}void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14)==SET)  //判断14通道是否中断{if(EXTI_GetITStatus(EXTI_Line14)==SET){Delay_ms(10);CountSensor_Num++;EXTI_ClearITPendingBit(EXTI_Line14);   //清除中断标志位}}

CountSensor.h:

#ifndef _COUNTSENSOR_H
#define _COUNTSENSOR_Hvoid CountSensor_Init(void);uint16_t CountSensor_Get(void);#endif

main.c:

#include  "stm32f10x.h"                  // Device header
#include  "OLED.h"
#include  "delay.h"
#include  "CountSensor.h"uint16_t CountSensor_GetNum=0;int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1,1,"Count:");while(1) {CountSensor_GetNum=CountSensor_Get();OLED_ShowNum(1,8,CountSensor_GetNum,4);}}

OLED驱动代码和延时函数代码可以查看我之前写的文章。

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

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

相关文章

linux下创建软链接失败

最近在研究isce to stamps,在走流程的过程中,看了b站上Dr.Liu的视频和David Bakert的manual,按照manual进行了参数的设置,接着执行了make_single_reference_stack_isce命令,但是一直报错,发现这个报错还是国庆出去旅游的时候,想着在酒店把这个问题解决掉,但是每天早出晚…

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速 2024/10/5 14:06 对于荣品RD-RK3588-AHD开发板,eth1位置上的PCIE转RJ458的以太网卡是默认好用的! PCIE TO RJ45:RTL8111HS 被识别成为eth0了。inet addr:192.…

QT学习笔记1(QT和QT creator介绍)

QT学习笔记1(QT和QT creator介绍) Qt 是一个跨平台的应用开发框架,主要用于图形用户界面(GUI)应用的开发,但也支持非GUI程序的开发。Qt 支持多种平台,如Windows、macOS、Linux、iOS和Android&a…

【源码+文档+调试讲解】宜家宜业物业管理系统node.js框架

摘 要 近年来,科技飞速发展,在经济全球化的背景之下,互联网技术将进一步提高社会综合发展的效率和速度,互联网技术也会涉及到各个领域,而宜家宜业物业管理系统在网络背景下有着无法忽视的作用。信息管理系统的开发是…

浙江所有省级医院体检报告查询上线浙里办!

在医院完成体检后不知道什么时候出报告 体检报告出来后又要跑一次医院去拿报告 历年体检报告没保管好 往年体检报告找不到了 ………… ​编辑 为解决这些问题,浙江省卫生健康委结合“两卡融合、一网通办”工作的推进,不断丰富电子健康医保卡的功能&#…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中,很多场景中需要图形和详细信息的融合展示,那么在图表中可以新增普通列表与分组列表的配置。如下图所示: 配置说明 1、新增组件:配置入口如下图所示,新增组件时,选择普通列表与分…

用策略性文本序列影响大模型的输出

大型语言模型(LLMs)正越来越多地被集成到搜索引擎中,以提供针对用户查询的自然语言响应。用户也越来越依赖这些模型来做出快速而简便的购买决策。在本研究中,我们探讨了LLMs的推荐是否可以被操控以提升产品的可见性。 我们证明&a…

经纬恒润荣登2024北京民营企业科技创新百强榜单

9月底,北京市工商业联合会联合有关部门正式发布了2024年北京民营企业“14”百强榜单,经纬恒润凭借其在科技创新领域的卓越表现,再次荣获“北京民营企业科技创新百强”称号,彰显了公司在技术创新和研发实力方面的强劲竞争力。 此次…

《深度学习》循环神经网络RNN 结构及原理解析

目录 一、关于RNN 1、传统神经网络存在的问题 2、什么是循环神经网络 3、RNN特点 二、RNN基本结构 1、RNN基本结构 2、推导方式 注意: 3、循环的由来 4、RNN的局限性 一、关于RNN 1、传统神经网络存在的问题 无法训练出具有顺序的数据,模型搭…

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候,您会被锁定在自己的 Android 设备之外,而且似乎不可能重新进入。 一个例子就是你买了一部二手手机,后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见,但确实会发生&…

A股牛市来袭,资本涌动:加密市场的出路与机遇

近期,随着A股的强劲反弹,不少加密市场的投资者,尤其是一些KOL(关键意见领袖),开始转移资金并公开建议进军A股。这种趋势反映出部分投资者对加密市场的信心动摇,尤其是在全球宏观经济不确定性加剧…

Qt应用程序logo那些事儿

前言 软件的logo一般跟公司的版权、商标、创意、设计密切相关,一般软件在开发之初都会特意设计好,以提高应用软件的辨识度 1 安装包logo EXE压缩包的logo,可以在Inno Setup Compiler的脚本里边设定,这个可以参考文章 2 可执行…

PyTorch单机多卡训练(无废话)

目前大家基本都在使用DistributedDataParallel(简称DDP)用来训练,该方法主要用于分布式训练,但也可以用在单机多卡。 第一步:初始化分布式环境,主要用来帮助进程间通信 torch.distributed.init_process_g…

深圳市步步精科技有限公司荣获发明专利,彰显技术研发实力

2024年8月13日,深圳市步步精科技有限公司(BBJconn)正式获得了其新开发的防水连接器专利,授权公告号为CN 118352837 B。这项技术的突破标志着公司在连接器领域的持续创新,进一步巩固了其行业领先地位。 专利技术概述 此…

成都睿明智科技有限公司真实可靠吗?

在这个日新月异的电商时代,抖音作为短视频与直播电商的佼佼者,正以前所未有的速度重塑着消费者的购物习惯。而在这片充满机遇与挑战的蓝海中,成都睿明智科技有限公司以其独到的眼光和专业的服务,成为了众多商家信赖的合作伙伴。今…

力扣 中等 46.全排列

文章目录 题目介绍题解 题目介绍 题解 代码如下&#xff1a; class Solution {List<List<Integer>> res new ArrayList<>();// 存放符合条件结果的集合List<Integer> path new ArrayList<>();// 用来存放符合条件结果boolean[] used; // 标记…

【D3.js in Action 3 精译_031】3.5.2 DIY实战:在 Observable 平台实现带数据标签的 D3 条形图并改造单元测试模块

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

DAY13

面试遇到的新知识点 char str[10],只有10个字符的空间&#xff0c;但是只能存储9个字符&#xff0c;最后一个字符用来存储终止符\0 strlen只会计算\n,不会计算\0 值传递&#xff1a; void test2(char * str) {str "hello\n"; }int main() {char * str;test2(str);…

红米Turbo 3工程固件预览 修复底层 体验原生态系统 默认开启diag端口

红米Turbo 3机型代码:peridot 国外版本:POCO F6 用于以下型号的小米机型:24069RA21C, 24069PC21G, 24069PC21I。搭载1.5K OLED屏、骁龙8s处理器、5000mAh电池+90W快充、5000万像素主摄。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝�…

移动技术开发:文件的读取

1 实验名称 文件的读写 2 实验目的 掌握Android中读写文件的实现方法。 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…