STM32中断编程指南:NVIC和中断优先级
在STM32微控制器编程中,中断是实现多任务处理和实时响应的关键技术。NVIC(Nested Vectored Interrupt Controller)是STM32中的中断控制器,负责管理中断请求、优先级和中断向量。本文将详细介绍STM32的NVIC配置和中断优先级设置,以及如何编写中断服务函数。
NVIC概述
NVIC是STM32中的一个硬件模块,它提供了中断优先级管理、中断使能/禁止和中断向量表管理等功能。NVIC允许STM32响应各种事件,如外设请求、错误或外部中断。
中断优先级管理
STM32支持可编程的中断优先级,允许开发者为每个中断分配不同的优先级。中断优先级分为抢占优先级和响应优先级:
- 抢占优先级(Preemption Priority):决定了中断之间的抢占关系。高抢占优先级的中断可以打断低抢占优先级的中断。
- 响应优先级(Sub Priority):在抢占优先级相同的情况下,决定了中断的响应顺序。
中断优先级分组
STM32的中断优先级可以通过NVIC的优先级分组寄存器进行配置。STM32可以将中断分成5个组,每个组有不同的优先级分配方式。例如,分组2将4位优先级分为2位抢占优先级和2位响应优先级。
代码实现
以下是STM32中断编程的步骤和示例代码:
1. NVIC配置
首先,需要配置NVIC的优先级分组和中断优先级。
#include "stm32f10x.h"void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;// 设置中断优先级分组为分组2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断通道的抢占优先级和响应优先级NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 外部中断线9-5NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
2. EXTI配置
配置外部中断线(EXTI),使其能够触发中断。
void EXTI_Configuration(void) {EXTI_InitTypeDef EXTI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置PA1为输入浮空模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 连接EXTI线到PA1GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);// 初始化EXTI线EXTI_InitStructure.EXTI_Line = EXTI_Line1;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}
3. 编写中断服务函数
编写中断服务函数,以处理中断事件。
void EXTI1_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line1) != RESET) {// 清除中断标志位EXTI_ClearITPendingBit(EXTI_Line1);// 执行中断处理逻辑}
}
4. 主函数
在主函数中调用NVIC和EXTI的配置函数。
int main(void) {NVIC_Configuration();EXTI_Configuration();while (1) {// 主循环中的代码}
}
总结
通过上述步骤,可以实现STM32的中断编程,包括NVIC的配置、中断优先级的设置和中断服务函数的编写。正确配置中断优先级和NVIC对于确保系统的实时响应和稳定性至关重要。在实际应用中,开发者应根据具体需求合理配置中断优先级,以实现高效的中断处理。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
点击领取更多详细资料
相关文章:
STM32中断编程指南:NVIC和中断优先级
在STM32微控制器编程中,中断是实现多任务处理和实时响应的关键技术。NVIC(Nested Vectored Interrupt Controller)是STM32中的中断控制器,负责管理中断请求、优先级和中断向量。本文将详细介绍STM32的NVIC配置和中断优先级设置&am…...

ThreadLocal底层原理及数据结构详解
ThreadLocal允许为每个线程创建独立的变量副本,使得同一个ThreadLocal对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供线程隔离,避免多个线程共享同一个变量,从而减少线程间的相互干扰。 ThreadLocal的核心在于为每个线程维…...

Android Framework AMS(02)AMS启动及相关初始化5-8
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多,因此拆成2个章节,本章节是第二章节&…...
速盾:游戏被攻击怎么办?
随着游戏行业的发展,游戏被攻击的情况也越来越多见。游戏被攻击可能导致游戏服务器崩溃、用户数据泄露、游戏体验受影响等问题。作为游戏开发者或运营商,面对游戏被攻击的情况,应该采取一系列的措施来应对。 首先,要及时发现游戏…...

BUU刷题-Pwn-shanghai2018_baby_arm(ARM_ROP_csu_init,ARM架构入门)
解题思路: 泄露或修改内存数据: 堆地址:无需栈地址:无需libc地址:无需BSS段地址:无需 劫持程序执行流程:ARM_ROP && mprotect函数(运行内存权限修改) && [[ARM_ROP_csu_init]…...

flutter_鸿蒙next(win)环境搭建
第一步 拉取鸿蒙版本flutterSDK仓库 仓库地址:OpenHarmony-SIG/flutter_flutter 第二步 找到拉取的仓库中的README.md 并根据说明配置环境 第三步 配置好环境变量之后 用管理员开启cmd 输入:flutter dcotor 并查看此时flutter所支持的系统 包括&…...

腾讯一面-LRU缓存
为了设计一个满足LRU(最近最少使用)缓存约束的数据结构,我们可以使用哈希表(HashMap)来存储键值对,以便在O(1)时间复杂度内访问任意键。同时,我们还需要一个双向链表(Doubly Linked …...

k8s实战-1
k8s实战-1 一、资源创建方式1.命令行2.yaml 二、命名空间三、Pod总结 一、资源创建方式 1.命令行 就是直接通过命令的方式创建,比如我要创建namespace, kubectl create namespace hello删除: kubectl delete -f hello2.yaml 简单来说&am…...
Python进程池:提升你的并发性能
引言 在现代编程中,多核处理器的普及使得并发编程变得尤为重要。Python,作为一种广泛使用的编程语言,提供了多种并发和并行编程的工具。其中,multiprocessing库中的进程池(Pool)是一个强大的工具ÿ…...

内存占用估算方法
优质博文:IT-BLOG-CN 通过掌握每种数据类型的大小,就可以更准确地预测对象和数据的内存消耗。 一、基础数据类型 Java基础数据类型结构,在64位系统开启指针压缩情况下的内存占用字节数: booleanbytecharshortintlongfloatdoub…...

拓扑排序简介
拓扑排序(Topological Sort)是一种重要的图算法,用于对有向无环图(DAG, Directed Acyclic Graph)中的节点进行排序。拓扑排序的结果是一种线性序列,使得对于图中的任意一条有向边(u, v),顶点u都在顶点v之前。这种排序常用于任务调度、编译器依赖关系分析等领域。 拓…...
使用iTextPDF库时,设置文字为中文格式
在使用iTextPDF库时,设置文字为中文格式主要涉及选择合适的中文字体,并确保该字体能够正确渲染中文字符。由于iTextPDF的内置字体通常不支持中文,因此你需要加载一个支持中文的字体文件(如TrueType字体,.ttf文件&#…...

Windows环境下使用Docker配置MySQL数据库
用Docker配置数据库,无论是做开发,还是做生产部署,都非常的方便 它不需要单独安装数据库,也不用担心出现各种环境的配置问题。 本文将分享用Docker配置数据库的步骤,这里用MySQL举例。 其他的数据库如MSSQL…...

快速上手C语言【上】(非常详细!!!)
目录 1. 基本数据类型 2. 变量 2.1 定义格式 和 命名规范 2.2 格式化输入和输出(scanf 和 printf) 编辑 2.3 作用域和生命周期 3. 常量 4. 字符串转义字符注释 5. 操作符 5.1 双目操作符 5.1.1 算数操作符 5.1.2 移位操作符 5.1.3 位操作符…...

[深度学习][python]yolov11+deepsort+pyqt5实现目标追踪
【算法介绍】 YOLOv11、DeepSORT和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本,它在保持高检测速度的同时,通过改进网络结构、优化损失函数等方式,提高了检测精度,能够同时处理多个尺…...
【CSDN入门级教程】
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...
二叉搜索树 (BST) 节点插入、查找、删除、获取最大值、最小值和中序遍历排序等功能
二叉搜索树 (BST) 实现总结 本程序实现了一个简单的二叉搜索树 (BST),支持节点插入、查找、删除、获取最大值、最小值和中序遍历排序等功能。以下是各部分的详细说明。 数据结构 节点定义 struct BinTreeNode {int data; // 节点存储的数…...

unity ps 2d animation 蛇的制作
一、PS的使用 1.打开PS 利用钢笔工具从下往上勾勒填充 2.复制图层,Ctrl T,w调为-100% 3.对齐图层并继续用钢笔工具进行三角勾勒 3.画眼睛,按U快捷键打开椭圆工具,按住Shift可以画圆,填充并复制图层对称。 4.画笔工具,打开小…...

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch
目录 1 什么是枚举 2 定义枚举类型 2.1 语法格式 2.2 枚举元素的特点 2.3 案例演示 3 枚举变量 3.1 什么是枚举变量 3.2 定义枚举变量的多种方式 3.3 案例演示 1:标准版枚举类型 3.4 案例演示 2:简化版枚举类型 3.5 案例演示 3:匿…...

LabVIEW程序怎么解决 Bug?
在LabVIEW开发过程中,发现和解决程序中的Bug是确保系统稳定运行的关键环节。由于LabVIEW采用图形化编程方式,Bug的排查和处理与传统编程语言略有不同。以下是解决LabVIEW程序中Bug的常见方法和技巧,涵盖从问题发现到解决的多个步骤和角度&…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...