【嵌入式学习笔记】嵌入式入门2——中断(外部中断)

1.什么是中断

打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断

1.1.中断的作用与意义

  • 作用1:实时控制在确定时间内对相应事件作出响应——定时器中断
  • 作用2:故障处理检测到故障,需要第一时间处理——外部中断
  • 作用3:数据传输不确定数据何时会来——串口中断
  • 意义:高效处理紧急程序,不会一直占用CPU资源

【注】本篇博客重点介绍外部NVIC和外部中断,其他中断后面的博客再介绍

1.2.GPIO外部中断简图

在这里插入图片描述

2.NVIC

2.1.NVIC基本概念

Nested vectored interrupt controller,嵌套向量中断控制器,属于内核(M3/4/7),NVIC支持256个中断(16内核 + 240外部),支持256个优先级,允许裁剪,裁剪后具体到各个型号如下:
在这里插入图片描述

  • 中断向量表:定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数。
    在这里插入图片描述

2.2.NVIC相关寄存器介绍

在这里插入图片描述
NVIC还有中断挂起,解挂,激活标志等非常用功能,不做介绍。

2.3.NVIC工作原理

在这里插入图片描述

2.4.STM32中断优先级基本概念

  • 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断
  • 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
  • 抢占和响应都相同的情况下,自然优先级越高的,先执行
  • 自然优先级:中断向量表的优先级
  • 数值越小,表示优先级越高

举例:
在这里插入图片描述

2.5.STM32中断优先级分组

AIRCR寄存器的8-10位可以设置优先级分组(一般只设置一次),设置完成后优先级分组就固定了,随后就可以设置IPR的4-7位设置抢断优先级和相应优先级的数值,数值越小,优先级越高。

例如,AIRCR设置优先级分组为2(2位抢占,2位相应),则IPR的6-7位设置可设置0-3的抢占优先级,4-5位可以设置0-3的相应优先级。
在这里插入图片描述

2.6.STM32 NVIC的使用

  • 设置中断分组。AIRCR[10:8],HAL_NVIC_SetPriorityGrouping
  • 设置中断优先级。IPRx bit[7:4],HAL_NVIC_SetPriority
  • 使能中断。ISERx,HAL_NVIC_EnableIRQ

在HAL库开发中,中断分组一般在HAL_Init()函数中设置分组2。

3.EXTI

3.1.EXTI基本概念

External(Extended) interrupt/event Controller,外部(扩展)中断事件控制器,包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线(F1)
在这里插入图片描述

中断和事件的理解:

  • 中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
  • 事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC

3.2.EXTI主要特性

  • F1/F4/F7系列
    每条EXTI线都可以单独配置:选择类型(中断或者事件)、触发方式(上升沿,下降沿或者双边沿触发)、支持软件触发、开启/屏蔽、有挂起状态位
  • H7系列:
    由其它外设对 EXTI 产生的事件分为可配置事件和直接事件。
    可配置事件:简单概括,基本和F1/F4/F7系列类似
    直接事件:固定上升沿触发、不支持软件触发、无挂起状态位(由其它外设提供)

3.3.EXTI工作原理(F1/F4/F7)

在这里插入图片描述

3.4.EXTI工作原理(H7)

在这里插入图片描述
在这里插入图片描述

4.EXTI和IO映射关系

4.1.AFIO简介(F1)

Alternate Function IO,即复用功能IO,主要用于重映射和外部中断映射配置。

  • 调试IO配置AFIO_MAPR[26:24],配置JTAG/SWD的开关状态
  • 重映射配置AFIO_MAPR,部分外设IO重映射配置
  • 外部中断配置AFIO_EXTICR1-4,配置EXTI中断线0~15对应具体哪个IO口

特别注意:配置AFIO寄存器之前要使能AFIO时钟,方法如下:
__HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0

4.2.SYSCFG简介(F4/F7/H7)

System configuration controller,即系统配置控制器,用于外部中断映射配置等

  • 外部中断配置SYSCFG_EXTICR1-4,配置EXTI中断线0~15对应具体哪个IO口

特别注意:配置SYSCFG寄存器之前要使能SYSCFG时钟,方法如下:
__HAL_RCC_SYSCFG_CLK_ENABLE();

4.3.EXTI与IO的对应关系

在这里插入图片描述

5.如何使用中断

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.通用外设驱动模型(四步法)

在这里插入图片描述

7.HAL库中断回调处理机制介绍

HAL库中有很多回调机制,比如中断回调,定时器初始化回调等,HAL推荐在回调函数中写具体的语句,但是在回调函数中写可能会导致多中断冲突,建议在在中断服务函数中处理中断逻辑,不使用HAL库提供的回调机制。
在这里插入图片描述

8.编程实战:通过外部中断控制一个灯亮灭

与上一节GPIO输入相似,代码暂不贴出

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

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

相关文章

基于linux下的高并发服务器开发(第四章)- 多进程实现并发服务器(回射服务器)

1. socket // 套接字通信分两部分: - 服务器端:被动接受连接,一般不会主动发起连接 - 客户端:主动向服务器发起连接 2.字节序转换函数 当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误…

无涯教程-jQuery - Spinner组件函数

Widget Spinner 函数可与JqueryUI中的窗口小部件一起使用。Spinner提供了一种从一组中选择一个值的快速方法。 Spinner - 语法 $( "#menu" ).selectmenu(); Spinner - 示例 以下是显示Spinner用法的简单示例- <!doctype html> <html lang"en"…

CentOS 项目发出一篇奇怪的博文

导读最近&#xff0c;在红帽限制其 RHEL 源代码的访问之后&#xff0c;整个社区围绕这件事发生了很多事情。 CentOS 项目发出一篇奇怪的博文 周五&#xff0c;CentOS 项目董事会发出了一篇模糊不清的简短博文&#xff0c;文中称&#xff0c;“发展社区并让人们更容易做出贡献…

代码随想录算法训练营第五天| 242. 有效的字母异位词,349. 两个数组的交集,202快乐数,1. 两数之和

哈希表 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断…

29.利用fminbnd 求解 最大容积问题(matlab程序)

1.简述 用于求某个给定函数的最小值点。 使用方法是&#xff1a; xfminbnd(func,x1,x2) func是函数句柄&#xff0c;然后x1和x2就是函数的区间&#xff0c;得到的结果就是使func取最小值的x值 当然也可以使用[x,fv]fminbnd(func,x1,x2)的方式&#xff0c;这个时候fv就是函数…

Web3.0:已经开启的互联网革命!

1 痛点 2 web发展形态 只读、封闭式、协作式。 3 一个高度联系、全球统一的数字经济体 去中心化架构通过计算几余打破数据垄断&#xff0c;同时实现数字确权大量的功能依靠智能合约自动实现&#xff0c;运转效率大大提升DAO大量涌现&#xff0c;全球范围实现资源配置 4 特…

MAC电脑设置charles,连接手机的步骤说明(个人实际操作)

目录 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 2. 设置 Proxy-Proxy Settings 3. 设置 SSL Proxying 二、手机的设置 1. 安卓 2. ios 资料获取方法 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 Help-SSL Proxying-Inst…

我的第一个前端(VS code ,Node , lite-server简易服务器,npm 运行)

第一种方式&#xff1a;使用Visual Studio Code创建并运行 第一个前端项目的步骤&#xff0c;如下&#xff1a; 1. 下载和安装Visual Studio Code&#xff1a; 访问Visual Studio Code官方网站&#xff08;Visual Studio Code - Code Editing. Redefined&#xff09;并根据你…

基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言&#xff0c;.net core framework 3.1运行。 模型是读取3D Max的obj模型。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula g…

算法通关村第三关——双指针的妙用

双指针思想 快慢指针 所谓的双指针其实就是两个变量。双指针思想简单好用&#xff0c;在处理数组、字符串等场景下很常见。看个例子&#xff0c;从下面序列中删除重复元素[1,2,2,2,3,3,3,5,5,7,8]&#xff0c;重复元素只保留一个。删除之后的结果应该为[1,2,3,5,7,8]。我们可以…

应用程序接口(API)安全的入门指南

本文简单回顾了 API 的发展历史&#xff0c;其基本概念、功能、相关协议、以及使用场景&#xff0c;重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。 根据有记录的历史&#xff0c;随着 Salesforce 的销售自动化解决方案的推出&#xff0c;首个 Web A…

HCIP期中实验

考试需求 1 、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 OSPF 协议…

PostgreSQL中如何配置Huge page的数量

在了解如在PG中如何配置大页之前&#xff0c;我们先要对大页进行一定的了解&#xff0c;为什么要配置大页&#xff0c;配置大页的好处有哪些。 我们日常的操作系统中&#xff0c;程序不直接使用内存&#xff0c;而是使用虚拟内存地址来处理内存分配&#xff0c;避免计算的复杂…

1.3 eureka+ribbon,完成服务注册与调用,负载均衡源码追踪

本篇继先前发布的1.2 eureka注册中心&#xff0c;完成服务注册的内容。 目录 环境搭建 采用eurekaribbon的方式&#xff0c;对多个user服务发送请求&#xff0c;并实现负载均衡 负载均衡原理 负载均衡源码追踪 负载均衡策略 如何选择负载均衡策略&#xff1f; 饥饿加载…

windows下tomcat无故宕机,检测http或https服务,并自动重启Tomcat服务

一、问题描述及解决原理 把项目发布到windows服务器中&#xff0c;如tomcat工程不稳定&#xff0c;会有无故宕机的问题。如果通过程序无法解决&#xff0c;并且重启tomcat服务能够生效的话&#xff0c;可以做一个自动检测并重启的脚本。 脚本通过检测tomcat对应的工程链接&…

一文了解Angular、React 和 Vue.js的区别

前端开发人员在开始一个新项目时首先要回答的问题是&#xff1a;我应该选择哪个框架&#xff1f; 哪个框架更适合我的需求&#xff1f; 在本文中&#xff0c;我们将向您快速概述当前使用的最常见的前端框架&#xff0c;旨在帮助您选择最能满足您需求的框架。这些框架是 Angular…

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

PHP8的常量-PHP8知识详解

常量和变量是构成PHP程序的基础&#xff0c;在PHP8中常量的这一节中&#xff0c;主要讲到了定义常量和预定义常量两大知识点。 一、定义常量 定义常量也叫声明常量。在PHP8中&#xff0c;常量就是一个标识符&#xff08;名字&#xff09;&#xff0c;一旦定义&#xff08;声明&…

Java常用API:Math、Syetem、Runtime、BigDecimal

Math类 //目标:了解下Nath类提供的常见方法。 // 1、public static int abs(int a):取绝对值&#xff08;拿到的结果一定是正数&#xff09; //public static double abs(double a) system.out.println(Math.abs(-12)); // 12 system.out.println(Math.abs(123));// 123 system…

VScode远程不用再输入密码操作

安装插件remote development 1.先检查自己电脑上有没有生成一对公钥和私钥。&#xff08;一般会在这个目录&#xff09; 如果没有的话就自己生成一下。 打开命令行输入以下命令 ssh-keygen -t rsa2.在虚拟机中先看一下有没有公钥和私钥。如果没有的话就自己生成一下。 打开…
最新文章