STM32F4X之中断二

一、外部中断

外部中断:外部中断的中断是相对于外部中断控制器(EXTI)来说,如下图所示:

EXTI掌管着23根中断线,具体分布图下:

16根连接GPIO口,如下图:

所有的0口连接到中断线0,所有的1口连接到中断线1,以此类推。
具体的哪个IO口连接到相应的中断线,通过寄存器:SYSCFG_EXTICRx决定(x = 1~4)。
其余7根呢??
另外七根 EXTI 线连接方式如下:
● EXTI 线 16 连接到 PVD 输出
● EXTI 线 17 连接到 RTC 闹钟事件
● EXTI 线 18 连接到 USB OTG FS 唤醒事件
● EXTI 线 19 连接到以太网唤醒事件
● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
● EXTI 线 21 连接到 RTC 入侵和时间戳事件
● EXTI 线 22 连接到 RTC 唤醒事件 
上面7根来自片内外设
外部中断框图分析
下图为外部中断控制器框架结构,上面讲的外部中断线上的每个中断源都会经过这样的一个结构。

框图分成了两个部分,红色代表产生的是中断,绿色代表产生的是事件。
补充:
中断:当一定的条件满足后(比如串口接收到数据)一定会进入中断服务函数。
事件:当一定的条件满足后(比如串口接收到数据)自动触发硬件工作。例如:将某一个寄存器的某一个位置位1或将某一个位清成0,接收数据标志位置1等。
相同点:中断与事件的产生条件一致。
不同点:中断过程需要CPU参与,事件不需要CPU参与。
(1)中断(重点掌握)
编号①代表外部中断线(外部中断的信号来源),外部中断线一共有23根,其中16根来源为GPIO口,另外7根来源为片上外设。需要从这23根中选择其中一个作为输入线。
编号②是边沿检测电路,这个边沿检测电路的信号来源来自外部中断线,通过对上升沿触发选择寄存器和下降沿触发选择寄存器的配置来决定这个边沿检测电路检测哪种边沿信号(上升沿、下降沿、双边沿)。当编号①输入了对应的边沿信号时,边沿电测电路就会输出有效信号‘1’,否则输出‘0’。
编号③是一个或门电路,这个或门电路有两个信号源,一个来自边沿检测电路的输出端,一个来自软件中断事件寄存器。当边沿检测电路输出有效信号‘1’或者软件中断事件寄存器对应位为1时,或门电路就输出有效信号‘1’。其实,这里可以直接通过设置软件中断事件寄存器来产生中断信号而不需要检测到对应边沿,这个就是所谓的软件中断。
编号④是一个与门电路,这个与门电路有两个信号源,一个来自或门电路的输出端,一个来自中断屏蔽寄存器。当或门电路输出有效信号‘1’同时中断屏蔽寄存器也输出有效信号‘1’时,这个与门电路才输出有效信号‘1’。其实就是可以通过对中断屏蔽寄存器的配置来决定是否响应该中断。(模块级中断使能)
编号⑤:当与门电路输出了有效信号‘1’到挂起请求寄存器时,挂起请求寄存器就会告诉NVIC当前产生了外部中断信号,请求NVIC响应。
注意:产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数.

产生外部中断原理框图

外部中断配置流程:
SYSCFGEN时钟打开
选择对应的外部中断线SYSCFG_EXTICRx
配置边沿触发器
使能中断屏蔽寄存器(模块级中断使能)
配置NVIC控制器(核心级中断使能)
编写中断服务函数
事件
绿色部分是产生了事件
编号①②③与前面的分析一样。
编号⑥与编号④的原理一样,就是可以通过对事件屏蔽寄存器的配置决定是否可以产生事件。
编号⑦是脉冲发生器,当编号⑥电路输出有效信号‘1’时,可以触发脉冲发生器产生一个脉冲信号触发其他模块工作,不需要CPU参与。

注意:
当脉冲发生器输入端是一个有效信号1时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。
脉冲信号,事件的最终的结果,这个脉冲信号可以给其他外设电路使用,比如定时器TIM、模拟数字转换器ADC等等。
相关寄存器

中断屏蔽寄存器

位 22:0 MRx:x 线上的中断屏蔽 (Interrupt mask on line x)

0:屏蔽来自 x 线的中断请求

1:开放来自 x 线的中断请求

事件屏蔽寄存器

位 22:0 MRx:x 线上的事件屏蔽 (Event mask on line x)

0:屏蔽来自 x 线的事件请求

1:开放来自 x 线的事件请求

上升沿触发选择寄存器

位 22:0 TRx:线 x 的上升沿触发事件配置位 (Rising trigger event configuration bit of line x)

0:禁止输入线上升沿触发(事件和中断)

1:允许输入线上升沿触发(事件和中断)

下降沿触发选择寄存器

位 22:0 TRx:线 x 的下降沿触发事件配置位 (Falling trigger event configuration bit of line x)

0:禁止输入线下降沿触发(事件和中断)

1:允许输入线下降沿触发(事件和中断)

软件中断事件寄存器

位 22:0 SWIERx:线 x 上的软件中断 (Software Interrupt on line x) (关闭软件中断通过写0操作)

当该位为“0”时,写“1”将设置 EXTI_PR 中相应的挂起位。

如果在 EXTI_IMR 和 EXTI_EMR 中允许产生该中断,则产生中断请求。

通过清除 EXTI_PR 的对应位(写入“1”),可以清除该位为“0”。

挂起寄存器

位 22:0 PRx:挂起位 (Pending bit) (产生中断的标志位,清中断标志位)

0:没有发生触发请求

1:发生了选择的触发请求

当在外部中断线上发生了选择的边沿事件,该位被置“1”。

在此位中写入“1”可以清除它, 也可以通过改变边沿检测的极性清除。

外部中断线中断源选择相关寄存器

SYSCFG 外部中断配置寄存器 1 (SYSCFG_EXTICR1)

位 15:0 EXTIx[3:0]:EXTI x 配置(x = 0 到 3)(EXTI x configuration (x = 0 to 3))

这些位通过软件写入,以选择 EXTIx 外部中断的源输入。

0000:PA[x] 引脚

0001:PB[x] 引脚

0010:PC[x] 引脚

0011:PD[x] 引脚

0100:PE[x] 引脚

0101:PF[C] 引脚

0110:PG[x] 引脚

0111:PH[x] 引脚

1000:PI[x] 引脚

注意高16位是保留位

例:需要将PB7作为外部中断的信号源。

SYSCFG_EXTICR2EXTI7位写入0001

SYSCFG 外部中断配置寄存器 2 (SYSCFG_EXTICR2)

SYSCFG 外部中断配置寄存器 3 (SYSCFG_EXTICR3)

SYSCFG 外部中断配置寄存器 4 (SYSCFG_EXTICR4)

RCC APB2 外设时钟使能寄存器 (RCC_APB2ENR)

位 14 SYSCFGEN:系统配置控制器时钟使能 (System configuration controller clock enable)

由软件置 1 和清零。

0:禁止系统配置控制器时钟

1:使能系统配置控制器时钟

软件设计

配置流程:

  • 按键能正常工作(PA0配置成浮空输入)
  • 输入线选择(把PA0映射到EXTI0中)
  • 设置边沿检测电路(上升沿检测)

④屏蔽软件中断,屏蔽事件

⑤模块级中断使能(配置中断屏蔽寄存器)

⑥配置NVIC(设置优先级、系统级中断使能)

⑦编写中断服务函数(清标志)

  1. 按键初始化
    • 开启GPIO的时钟
    • 配置GPIO的模式(普通输入)
    • 配置GPIO的无上下拉
  2. 初始化外部中断
    • 开启syscfg的时钟
    • 配置syscfg-exticr1寄存器对应的外部中断线。
    • 配置上升沿检测,关闭下降沿检测
    • 关闭软件中断事件
    • 关闭事件屏蔽
    • 开启中断屏蔽
    • 开启NVIC控制器
    • 清除一次标志位
  3. 编写中断服务函数
    • 判断是哪一个中断
    • 清中断标志
    • 功能代码

二、软件中断

软件中断简介

软件中断:完全不需要硬件的参与,通过代码(软件)就可以产生中断的方式。

软件中断框图

软件中断--相关寄存器

中断屏蔽寄存器 (EXTI_IMR)

软件中断事件寄存器 (EXTI_SWIER)

软件设计:

  1. 初始化外部中断
    • 开启中断屏蔽(模块级中断使能)
    • 开启NVIC控制器(核心级中断使能)
    • 初始化先关闭软件中断功能(在需要的是开启,标志位就会置一)
  2. 编写中断服务函数
    • 清中断标志
    • 具体代码
#include "exti.h"
//PE3->EXTI3
void EXTI_Init(void)
{/*1IO配置*/RCC->AHB1ENR |= 1<< 4;GPIOE->MODER &=~(0X3<< 6);//输入模式GPIOE->PUPDR &=~(0X3<< 6);//没有上下拉/*2选择外部中断线的输入*/RCC->APB2ENR |=1 << 14;//打开系统配置控制器的时钟(APB2)SYSCFG->EXTICR[0]|=4<< 12;//选择外部中断线3的中断来源是PE3/*3选择触发边沿*/EXTI->FTSR |=1<< 3;//外部中断线3设置为下降沿触发中断/*4允许中断产生*/EXTI->IMR |=1<< 3;//开放来自 x 线的中断请求/*5配置EXTI3 的NVIC*/NVIC_SetPriority(EXTI3_IRQn, NVIC_EncodePriority (7-2, 0, 2));NVIC_EnableIRQ (EXTI3_IRQn);//核心级中断使能}#include "stdio.h"
/*编写中断服务函数*/
void EXTI3_IRQHandler (void)
{//请标志是写入一清除标志EXTI->PR |=1<< 3;//清除一次标志/*功能代码*/printf("w外部中断线3的中断来了\r\n");
}void EXTI8_Init(void)
{/*4允许中断产生*/EXTI->IMR |=1<< 8;//开放来自 x 线的中断请求/*5配置EXTI8 的NVIC*/NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority (7-2, 3, 2));NVIC_EnableIRQ (EXTI9_5_IRQn);//核心级中断使能}/*编写中断服务函数*/
void EXTI9_5_IRQHandler (void)
{//请标志是写入一清除标志EXTI->PR |=1<< 8;//清除一次标志/*功能代码*/printf("外部中断线8的中断来了\r\n");
}
#ifndef EXTI_H
#define EXTI_H
#include "stm32f4xx.h"
#include "io_bit.h"
void EXTI_Init(void);
void EXTI8_Init(void);
#endif
/************************************
*  @brief :主函数
*  @param :none
*  @return:none
*  @note  程序入口
*************************************/
int main(void)
{NVIC_SetPriorityGrouping (7-2);//抢占2响应4-2u8 key = 0;//硬件初始化配置KEY_Init();EXTI_Init();EXTI8_Init();while(1)//让CPU卡主,单片机的程序架构{if(KeyScan()){EXTI->SWIER|=1<< 8;//软件产生一个中断}}	
}

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

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

相关文章

ORACLE表空间说明及操作

ORACLE 表空间作用 数据存储&#xff1a;表空间是数据库中存储数据的逻辑结构。它提供了用于存储表、索引、视图、存储过程等数据库对象的空间。通过划分数据和索引等对象的存储&#xff0c;可以更好地管理和组织数据库的物理存储结构。性能管理和优化&#xff1a;通过将不同类…

餐饮外卖小程序商城的作用是什么

随着互联网及线上餐饮的发展趋势&#xff0c;行业洗牌正在加速&#xff0c;并且对餐饮连锁门店提出更高要求&#xff0c;餐饮数字化转型加快&#xff0c;积极发展线上经营是不少餐饮商家的首选。这其中&#xff0c;餐饮外卖商城成为很多餐饮品牌的线上经营品牌&#xff0c;也是…

内核进程初始化和创建

task_struct 1.进程的状态 分时技术进行多进程调度 重点&#xff1a;进程的创建是如何的&#xff1f; linux在初始化的过程中那个会进行0号进程的创建&#xff0c;fork sched_init(); 做了什么 内核态 不可抢占 用户态 可以抢占 move_to_user_mode(); 把内核状态切换到…

JackSon工具类

JackSon工具类 一、简介 Jackson 是当前用的比较广泛的&#xff0c;用来序列化和反序列化 json 的 Java 的开源框架。 Jackson 的核心模块由三部分组成&#xff1a; jackson-core&#xff0c;核心包&#xff0c;提供基于"流模式"解析的相关 API&#xff0c;它包括…

VR全景应用广泛体现在哪里?有何优势?

VR全景作为一种新型营销方式&#xff0c;正在逐渐走进人们的视线&#xff0c;它区别于以往单一角度的照片和视频&#xff0c;VR全景制作显得更加直观、更加真实、更加生动。VR全景通过VR技术将所拍摄的图片变成720度可观看的场景模式&#xff0c;把产品的特色以及魅力整体呈现展…

封装axios的两种方式

作为前端工程师&#xff0c;经常需要对axios进行封装以满足复用的目的。在不同的前端项目中使用相同的axios封装有利于保持一致性&#xff0c;有利于数据之间的传递和处理。本文提供两种对axios进行封装的思路。 1. 将请求方式作为调用参数传递进来 首先导入了axios, AxiosIn…

对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中的所有值为x的数据元素

对长度为n的顺序表L&#xff0c;编写一个时间复杂度为O(n)&#xff0c;空间复杂度为O(1)的算法&#xff0c;该算法删除线性表中的所有值为x的数据元素 算法思路&#xff1a; 用count标记遇到x的次数&#xff0c;每次遇到x&#xff0c;count 遇到非x的元素&#xff0c;把它前移…

vue3后台管理系统之顶部tabbar组件搭建

1.1静态页面搭建 <template><div class"tabbar"><div class"tabbar_left"><!-- 面包屑 --><Breadcrumb /></div><div class"tabbar_right"><!-- 设置 --><Setting /></div></di…

自动驾驶的未来展望和挑战

自动驾驶技术是一项引人瞩目的创新&#xff0c;将在未来交通领域产生深远影响。然而&#xff0c;随着技术的不断演进&#xff0c;自动驾驶也面临着一系列挑战和障碍。本文将探讨自动驾驶的未来发展方向、技术面临的挑战&#xff0c;以及自动驾驶对社会和环境的潜在影响。 自动驾…

封装一个vue3 Toast组件,支持组件和api调用

先来看一段代码 components/toast/index.vue <template><div v-if"isShow" class"toast">{{msg}}</div> </template><script setup> import { ref, watch } from vue const props defineProps({show: {type: Boolean,def…

docker搭建个人镜像仓库

docker搭建个人镜像仓库 安装registry mkdir docker-registry cd docker-registry mkdir registry mkdr auth vim docker-compose.ymldocker-compose.yml的内容如下&#xff1a; version: 3 services:registry:image: registrycontainer_name: registryvolumes:- ./registry…

GPT带我学-设计模式-10观察者模式

1 请你介绍一下观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象&#xff08;被观察者&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;观察者&…

Canvas的缓冲区

Canvas的缓冲区 canvas的绘制缓冲区和显示缓冲区理解为两个容器&#xff0c;它们用于存储绘制结果。绘制缓冲区是用于存储渲染管线生成的像素数据&#xff0c;而显示缓冲区是绘制缓冲区最终的存储位置。 绘制缓冲区&#xff08;Drawing Buffer&#xff09;: 它是在 canvas 元…

JVM 类的加载子系统

文章目录 类的加载过程加载阶段链接阶段初始化 类的加载器测试代码中获取对应的加载器获取加载器加载的路径不同类对应的加载器自定义加载器自定义加载器的方式 获取类的加载器的方式双亲委派机制双亲委派机制的好处 Java 的 SPI 机制1. 接口定义2. 具体实现3. 配置 META-INF/s…

Redis中设置Hash数据类型的过期时间

1 方案 可以先对key进行赋值&#xff0c;然后对key设置一个过期时间。 &#xff08;1&#xff09;依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.3</version></dependency>…

Kubernetes (K8S)概述

目录 1、K8S 是什么&#xff1f; 1.1 作用 1.2 由来 1.3 含义 1.4 官网 2、为什么要用 K8S? 2.1 K8S 解决了裸跑Docker 的若干痛点 2.2 K8S主要功能如下 2.3 K8S 的特性 3、Kubernetes 集群架构与组件 3.1 核心组件 3.1.1 Master 组件 3.1.2 控制器主要包括 3.1…

Spring Cloud Gateway 路由构建器的源码分析

Spring Cloud Gateway 路由构建器的源码分析 文章目录 1. 路由构建器的入口2. 创建路由规则3. 设置路由规则和属性4. 路由过滤器的设置5. 构建和获取路由规则&#xff1a;6. 实例化路由构建器&#xff1a;8. 路由构建器的源码分析8.1 RouteLocator接口8.2 RouteLocatorBuilder…

判断日期区间或季节等

使用JavaScript的Date对象来获取当前日期&#xff0c;并通过比较判断是否在指定的日期范围内&#xff08;如3月16日-9月15日&#xff09;。以下是一个示例代码&#xff1a; var currentDate new Date(); // 获取当前日期 var startRange new Date(currentDate.getFullYear()…

springBoot与Vue共同搭建webSocket环境

欢迎使用Markdown编辑器 你好&#xff01; 这片文章将教会你从后端springCloud到前端VueEleementAdmin如何搭建Websocket 前端 1. 创建websocket的配置文件在utils文件夹下websocket.js // 暴露自定义websocket对象 export const socket {// 后台请求路径url: ,websocketCo…

Android前台服务和通知

前台服务 Android 13及以上系统需要动态获取通知权限。 //android 13及以上系统动态获取通知权限 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {checkPostNotificationPermission(); } private void checkPostNotificationPermission() {if (ActivityCompat.chec…