Stm32学习记录之中断

news2024/9/21 14:51:02

1、前言

该系列文章用于记录个人学习stm32单片机的过程,欢迎指导讨论~。


2、中断知识点梳理

中断 { N V I C ( 内嵌向量中断控制器 ) { 中断向量表 优先级 { 抢占优先级 响应优先级 自然优先级 优先级分组 E X T I ( 外部中断 ) { 触发方式 { 上边沿 下边沿 双边沿 I O 映射关系 回调处理 { 中断服务函数 ( 硬件 ) 中断回调函数 ( 软件 ) 中断 \left\{ \begin{array}{lr} NVIC (内嵌向量中断控制器) \left\{ \begin{array}{lr} 中断向量表 \\\\ 优先级 \left\{ \begin{array}{lr} 抢占优先级 \\\\ 响应优先级 \\\\ 自然优先级 \end{array} \right. \\\\ 优先级分组 \end{array} \right. \\\\ EXTI(外部中断) \left\{ \begin{array}{lr} 触发方式 \left\{ \begin{array}{lr} 上边沿\\ 下边沿 \\ 双边沿 \end{array} \right. \\\\ IO映射关系 \end{array} \right. \\\\ 回调处理 \left\{ \begin{array}{lr} 中断服务函数(硬件) \\\\ 中断回调函数(软件) \end{array} \right. \end{array} \right. 中断 NVIC(内嵌向量中断控制器) 中断向量表优先级 抢占优先级响应优先级自然优先级优先级分组EXTI(外部中断) 触发方式 上边沿下边沿双边沿IO映射关系回调处理 中断服务函数(硬件)中断回调函数(软件)

3、中断优先级

正点原子官方资料ppt
中断优先级决定了中断的执行顺序。当多个中断源同时发生时,根据中断的抢占优先级和响应优先级来确定优先级顺序。

抢占优先级用于决定是否打断正在执行的中断源,如果一个中断源的抢占优先级高于正在处理的中断源,会立即中断当前中断源的处理,转而处理高优先级的中断源。

响应优先级用于决定多个中断源具有相同抢占优先级时的执行顺序。已经排序好响应优先级的中断源不能被其他响应优先级打断。

自然优先级是中断的基本优先级,不受抢占优先级和响应优先级的影响。较低优先级的中断源在存在较高优先级中断源的情况下会被延迟处理。

4、中断代码解释

4.1 GPIO初始设置

void MX_GPIO_Init(void)
{
/* PC5的按键初始化*/
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP; 
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
  1. HAL_NVIC_SetPriority:设置中断的抢占优先级、响应优先级,此处将EXTI9_5_IRQn的抢占优先级、响应优先级设置为0。

  2. HAL_NVIC_EnableIRQ:设置使能中断,此处使能EXTI9_5_IRQn的中断线。

4.2 中断触发处理

void EXTI9_5_IRQHandler(void)
{
 if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != RESET)
  {
    buttonPressed = 1; 
	  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5); 
  }
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
	HAL_Delay(10);
    if (buttonPressed)
    {
      if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5)==0)
      HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); 
      buttonPressed = 0; 
    }
  }
}
  1. EXTI9_5_IRQHandler:中断服务函数,用于处理外部中断线 的中断事件,当外部中断线
    的中断事件发生时,会执行这个函数。

  2. __HAL_GPIO_EXTI_GET_IT:用于检查指定的 GPIO
    引脚是否触发了外部中断事件,此处观察GPIO_PIN_5是否触发。

  3. HAL_GPIO_EXTI_IRQHandler:调用中断处理公用函数。

  4. __HAL_GPIO_EXTI_CLEAR_IT:用于清除指定 GPIO
    引脚的外部中断标志位,此处用来清除GPIO_PIN_5。

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

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

相关文章

wazuh安装、Rootkit原理解析与检测实践

目录 1.wazuh 1)什么是wazuh 2)安装wazuh 方法一:仓库安装(跟着官方文档走) 方法二:虚拟机OVA安装 2.Rootkit原理解析与检测实践 Rootkit主要分为以下2种 解压并编译这个文件 利用chkrootkit检查rootk…

看了这么多热闹,AI帮助你解决实际问题了吗?

经历了近两个月的日更之后,这个星期发文频率有所下降,日更需要花费更多的时间精力,而这恰恰是一个人忙起来之后无法保证的。后续发文频率稍做调整,内容会继续保持更新。 前几日小米发布会(雷老板2023年度演讲&#xff…

EndNote-文献管理工具【安装篇】

下载:(文末附安装包,建议使用这一个,官网都需要付费) 打开安装包,双击: 安装完了之后不要直接运行,因为EndNote软件少了一个类型的软件:GB/T17714。 因此我们需要把这个…

实现两个栈模拟队列

实现两个栈模拟队列 思路:可以想象一下左手和右手,两个栈:stack1(数据所在的栈) ,stack2(临时存放)。 入队:需要将入队 num 加在 stack1 的栈顶即可; 出队&am…

plt绘制箱型图+散点图

import numpy as np import matplotlib.pyplot as plt# 创建示例数据 np.random.seed(1) data [np.random.normal(0, std, 100) for std in range(1, 4)]# 绘制箱型图 plt.boxplot(data, patch_artistTrue,zorder0)# 添加数据点的散点图,并设置参数以避免重叠 for …

[四次挥手]TCP四次挥手握手由入门到精通(知识精讲)

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…

Pytorch的torch.utils.data中Dataset以及DataLoader等详解

在我们进行深度学习的过程中,不免要用到数据集,那么数据集是如何加载到我们的模型中进行训练的呢?以往我们大多数初学者肯定都是拿网上的代码直接用,但是它底层的原理到底是什么还是不太清楚。所以今天就从内置的Dataset函数和自定…

【Go】Go 文本匹配 - 正则表达式基础与编程中的应用 (8000+字)

正则表达式(Regular Expression, 缩写常用regex, regexp表示)是计算机科学中的一个概念,很多高级语言都支持正则表达式。 目录 何为正则表达式 语法规则 普通字符 字符转义 限定符 定位符 分组构造 模式匹配 regexp包 MatchString…

websocker无法注入依赖

在公司中准备用websocker统计在线人数,在WebSocketServer使用StringRedisTemplate保存数据到redis中去,但是在保存的时候显示 StringRedisTemplate变量为null 详细问题 2023-08-20 10:37:14.109 ERROR 28240 --- [nio-7125-exec-1] o.a.t.websocket.po…

【AI】文心一言的使用

一、获得内测资格: 1、点击网页链接申请:https://yiyan.baidu.com/ 2、点击加入体验,等待通过 二、获得AI伙伴内测名额 1、收到短信通知,点击链接 网页Link:https://chat.baidu.com/page/launch.html?fa&sourc…

LeetCode_Java_2236. 判断根结点是否等于子结点之和

2236. 判断根结点是否等于子结点之和 给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。 示例1 输入:roo…

【CMake保姆级教程】CMake的使用

文章目录 前言CMake的使用注释注释行注释块 CMake操作共处一室VIP 包房 前言 在上节课我们已经讲了CMake的安装和简单使用,本节课我们来讲解CMake的命令和他的含义 CMake的使用 CMake支持大写、小写、混合大小写的命令。如果在编写CMakeLists.txt文件时使用的工具…

vue3中的router和useRouter的区别

结论:从vue-router的官方文档中发现,useRouter需要在setup中使用,而router可以在任何组件中使用。二者是等价的,适用场景不同。 问题:使用useRouter创建的实例,未能成功调用方法push()。会报错:…

gdb 常用命令

gdb 常用命令 文章目录 gdb 常用命令gdb 调试一般步骤常用命令infostep、next、continue、finish、untilexaminebreakinfo 、enable、disable和delete命令 backtrace和framebacktraceframe listprintwhatis和ptypethreadnext、stepreturn、finishuntiljumpdisassembleset args …

攻防世界-can_has_stdio?

原题 解题思路 这使用的是brainfuck语言,语言介绍如下:Brainfuck详解。 使用网站解码即可:CTF在线工具。

《HeadFirst设计模式(第二版)》第十一章代码——代理模式

代码文件目录: RMI: MyRemote package Chapter11_ProxyPattern.RMI;import java.rmi.Remote; import java.rmi.RemoteException;public interface MyRemote extends Remote {public String sayHello() throws RemoteException; }MyRemoteClient packa…

前端Vue自定义等分底部菜单导航按钮 自适应文字宽度 可更改组件位置

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…

Windows 平台下微软开发的神器 PowerToys 使用笔记

文章目录 Part.I IntroductionPart.II 安装Part.III 常用操作Chap.I 快捷键Chap.II 分屏示例 Reference Part.I Introduction PowerToys 是一款来自微软的系统增强工具,就像是一个神奇的 Win10 外挂,整套软件由若干子组件构成,包括&#xff…

从零开始创建 Spring Cloud 分布式项目,不会你打我

目录 一、Spring Cloud 和 分布式 二、创建新项目 三、导入 Spring Cloud 依赖 四、配置 Spring Cloud 一、Spring Cloud 和 分布式 Spring Cloud是一个基于Spring框架的开源微服务框架,它提供了一系列工具和组件,用于帮助开发人员构建分布式系统中…

EndNote极简入门【如何使用】

在开始菜单栏打开: (点左下角忽略即可) 第一次打开呢就如下图所示: 空白的,只有一个灰色的界面: 新建一个自己库: 然后就会弹出东西啦: 导出endnote学术期刊的引文:&…