【江科大】STM32:外部中断(Extern Interrupt)

文章目录

  • EXTI(Extern Interrupt)外部中断
    • EXIT的基本结构
    • EXIT框图
  • 旋转编码器简介
  • 代码展示:
    • 注意:

EXTI(Extern Interrupt)外部中断

  • 功能:
    EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
  • 支持的触发方式:上升沿/下降沿/双边沿/软件触发
  • 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
  • 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
  • 触发响应方式:中断响应/事件响应
    中断响应:电平引脚发生变化,发生中断
    触发事件:那么外部信号就不会通信CPU,而是通向其他外设,用来触发其他外设的操作,如触发ADC转换,DMA等)(不会触发中断,而是触发别的外设操作。)

EXIT的基本结构

请添加图片描述

EXIT框图

请添加图片描述
白10:可以通过读取请求挂起寄存器;来判断哪个通断出发了中断。
中断挂起置为1就会继续向左运行。
白110:中断屏蔽给的就是1,看请求挂起给的是几。这个与门就相当于开关

旋转编码器简介

  • 旋转编码器:
    用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
    类型:机械触点式/霍尔传感器式/光栅式
    在这里插入图片描述

代码展示:

#include "stm32f10x.h"                  // Device header

uint16_t CountSensor_Count;
void CountSensor_Init(void)
{
	//配置RCC
	//配置GPIO
	//配置AFIO
	//配置EXIT 触发方式,不需要开启时钟
	//配置NVIC              不需要开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	/*1. GPIO口产生电平变化时
	  2. 需要AFIO(AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择(相同的Pin不能同时触发中断,所以只能选择多个GPIO(A-G)中的一个))
	  3. 接下来EXTI将立即向NVIC发出中断申请                                               
	  4. 经过NVIC裁决后即可中断CPU主程序
	*/ 
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//配置AFIO的数据选择器
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	//初始化
	EXTI_InitTypeDef  EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line14 ; 
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;   //触发响应方式  中断/事件
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; //支持的触发方式:上升沿/下降沿/双边沿触发
                                                                             //上升沿:拿出来的时候也计数加1
																			 //下降沿:遮挡的时候+1
	 EXTI_Init(&EXTI_InitStruct);                                           //双边沿触发:遮挡的时候+1,拿出来的时候也加1
    
	
	//响应中断,
    //用来中断分组,参数是中断分组的方式
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   
	NVIC_InitTypeDef NVIC_InitStruct;                                       //EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;      //EXIT_LINE14 所以STM32F10X_MD_VL型号下的IRQC选EXTI15_10_IRQn,
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =  1;  //抢占优先  ,因为中断分组选的是NVIC_PriorityGroup_2 所以 在0-3之间选一个
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;         //响应优先
	
	NVIC_Init(&NVIC_InitStruct);
	
}
//获取计数
uint16_t CountSensor_Get(void)
{
	return CountSensor_Count;
}
void  EXTI15_10_IRQHandler()
{
	//获取中断标志位 //返回值是set 和 reset,表示中断标志为已被设置
                 //中断标志位是否为1
	if(EXTI_GetITStatus(EXTI_Line14)==SET)             
	{                  //如果是 ,执行中断程序           
	  //如果已经设置就加1
		CountSensor_Count++;                            //如果是set,说明获取中断标志位
		EXTI_ClearITPendingBit(EXTI_Line14);     //每次中断程序结束后,都要清除挂起的中断标志位 
	}
}

注意:

最好不要在中断函数和主函数调用相同的函数或者操作同一个硬件,尤其是硬件相关的函数,比如,OLED显示函数,OLED就会显示错误,啪,进中断了,结果中断里还是OLED显示函数,需要继续原来的显示, 就出问题了!!!!!!!!!!!
为什么呢?因为在主程序中,OLED刚显示一半,程序中断结束后,所以再回来的时候,继续显示的内容跟着跑到其他地方去了,这就出现问题了。
虽然在进入中断和退出的时候会现场保护和现场恢复,但只能保证CPU程序正常返回时不出问题。对于外部硬件,并没有在进入中断时,进行现场保护。因此最好不要在主程序和中断程序里,操作可能冲突的硬件。
在实现的功能的时候,在中断函数里操作变量或者标志位,在其他地方,大家也可以多用变量和标志位来减少代码的耦合性,让部分代码相互独立,仅使用变量,标志位,或者函数作为接口。

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

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

相关文章

正信晟锦:亲戚借了钱一直不还怎么办

在生活中&#xff0c;我们难免会遇到一些经济上的困难&#xff0c;这时候向亲戚借钱可能是一个不错的选择。然而&#xff0c;有些亲戚在借了钱之后却迟迟不还&#xff0c;这让借款人感到非常无奈。那么&#xff0c;面对这种情况&#xff0c;我们应该怎么办呢? 我们要明确自己的…

基于taro搭建小程序多项目框架,记重点了!!!

前言 为什么需要这样一个框架&#xff0c;以及这个框架带来的好处是什么&#xff1f; 从字面意思上理解&#xff1a;该框架可以用来同时管理多个小程序&#xff0c;并且可以抽离公用组件或业务逻辑供各个小程序使用。当你工作中面临这种同时维护多个小程序的业务场景时&#…

Pandas.DataFrame.abs() 绝对值 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.1.2 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 Pandas稳定版更新及变动内容整合专题&#xff1a; Pandas稳定版更新及变动迭持续更新。 Pandas API参…

实战项目(一)内容管理系统

一、实现技术 前端技术&#xff1a;html、javascript(jquery、ajax、json)、css 后端技术&#xff1a;java、mysql、servlet 开发工具&#xff1a;eclipse、vscode 二、项目描述 首页仿写某大学网页&#xff0c;上面有各种栏目及栏目内容&#xff0c;管理员能登录进去对首…

[pip] pip 包管理及虚拟环境的使用

文章目录 &#x1f4e6;Python & pip&#x1f680;pip 常用功能&#x1f528; Flask 应用示例&#xff1a;常用功能&#x1f528;Flask 应用示例&#xff1a;用虚拟环境管理 Flask 的不同版本 &#x1f680;总结 &#x1f4e6;Python & pip https://www.python.org/htt…

AtCoder Beginner Contest 221 H. Count Multiset(容斥 dp 拆分数 差分 数形结合)

题目 给定m,n(m<n<5e3)&#xff0c; 求大小为k的多重集合&#xff0c;满足元素和为n&#xff0c; 且每种数在集合中出现的次数都小于等于m的集合数有多少个 答案对998244353取模 思路来源 官方题解 「解题报告」[ABC221H] Count Multiset - K8He - 洛谷博客 Solu…

【RT-DETR有效改进】遥感旋转网络 | LSKNet动态的空间感受野网络(轻量又提点)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

掌上单片机实验室 – 低分辨率编码器测速方式完善(24)

一、背景 本以为“掌上单片机实验室”这一主题已告一段落&#xff0c;可最近在测试一批新做的“轮式驱动单元”时&#xff0c;发现原来的测速算法存在问题。 起因是&#xff1a;由于轮式驱动单元的连线较长&#xff0c;PCB体积也小&#xff0c;导致脉冲信号有干扰&#xff0c;加…

Linux系统监控:保障稳定性与性能的关键

Linux操作系统作为广泛应用于服务器和嵌入式设备的开源操作系统&#xff0c;对于系统监控的需求尤为重要。通过对Linux系统进行有效的监控&#xff0c;管理员可以实时了解系统的运行状态、识别潜在问题并采取相应的措施。本文将介绍Linux系统监控的基本原理、常用工具和关键指标…

央视推荐的护眼台灯是哪款?学生专用台灯第一品牌

近视问题在我国十分严重&#xff0c;据相关调查数据显示&#xff0c;我国有7亿近视人口。特别是在现代&#xff0c;青少年成为近视高发人群&#xff0c;其中大部分近视的原因与长时间不正确用眼导致的眼睛疲劳有关。台灯作为许多家庭中的小家电&#xff0c;不论是上班族还是孩子…

一文搞懂Microsoft Copilot品种及定价说明

Microsoft Copilot 是一个 AI 助手&#xff0c;提供跨 Microsoft Cloud 的创新解决方案。Copilot 使复杂的任务更易于管理&#xff0c;从而促进协作环境并增强用户体验。 目前Copilot一共有这么几种&#xff1a; 一、必应中的copilot 在edge浏览器侧边栏中使用&#xff0c;这…

ESP32-TCP服务端(Arduino)

将ESP32设置为TCP服务器 介绍 TCP&#xff08;Transmission Control Protocol&#xff09;传输控制协议&#xff0c;是一种面向连接的&#xff08;一个客户端对应一个服务端&#xff09;、可靠的传输层协议。在TCP的工作原理中&#xff0c;它会将消息或文件分解为更小的片段&a…

通俗易懂理解小波池化/WaveCNet

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 github代码&#xff1a;WaveCNet 通俗易懂理解小波变换(Wavelet Transform) 二、相关介绍 关于小波变换的详细介绍&#xff0c;请参考另一篇博客&…

大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测

基于OpenCompass大模型评测 关于评测的三个问题Why/What/How Why What 有许多任务评测&#xff0c;包括垂直领域 How 包含客观评测和主观评测&#xff0c;其中主观评测分人工和模型来评估。 提示词工程 主流评测框架 OpenCompass 能力框架 模型层能力层方法层工具层 支持丰富…

使用Go发送HTTP GET请求

在Go语言中&#xff0c;我们可以使用net/http包来发送HTTP GET请求。以下是一个简单的示例&#xff0c;展示了如何使用Go发送HTTP GET请求并获取响应。 go复制代码 package main import ( "fmt" "io/ioutil" "net/http" …

用BK7251播放音乐

单片机的第一道难关无疑是烧录&#xff0c;如果烧录解决了&#xff0c;那么就有资格挑战各种坑了。 BK7251播放MP3 一、折腾材料 1、软件SDK&#xff1a; bk7251_audio_release_20190826_0701&#xff08;BK7251 rtt sdk&#xff09;&#xff0c;可以从github&#xff0c;gite…

HCIP网络的类型

一.网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 -- 在一个MA网络中同时存在广播&#xff08;泛洪&#xff09;机制 NBMA&#xff1a;非广播型多路访问 -- 在一个MA网络中&#xff0c;没有泛洪机制-----不怎么使用了 MA&#xff1a;多路访问 -- 在一个…

基于光口的以太网 udp 回环实验

文章目录 前言一、系统框架整体设计二、系统工程及 IP 创建三、UDP回环模块修改说明四、接口讲解五、顶层模块设计六、下载验证前言 本章实验我们通过网络调试助手发送数据给 FPGA,FPGA通过光口接收数据并将数据使用 UDP 协议发送给电脑。 提示:任何文章不要过度深思!万事万…

电工技术实验-电路元件伏安特性测绘

一、 实验目的 1、学会识别常用电路元件的方法 2、验证线性电阻、非线性电阻元件的伏安特性 3、熟悉实验台上直流电工仪表和设备的使用方法 二、实验器材 可调直流稳压电源、直流数字毫安表、直流数字电压表、万用表 二极管、稳压管、白炽灯、线性电阻 三、实验原理 任…

低压防雷箱综合选型应用方案

低压防雷箱是一种用于保护低压配电系统免受雷电过电压的影响的装置&#xff0c;它主要由防雷箱模块、浪涌保护器SPD、接地线等组成。本文将介绍低压防雷箱的作用原理和行业应用解决方案&#xff0c;以及低压防雷箱的选型方法。 低压防雷箱的作用原理 低压防雷箱的作用原理是利…