STM32微控制器的中断优先级设置中,抢占优先级和子优先级如何影响中断响应?

news2024/9/23 20:02:16

在STM32微控制器中,中断优先级设置是一个关键的概念,它决定了在发生多个中断时,哪些中断能够优先被处理。STM32的中断优先级系统包括抢占优先级(Preemption Priority)和子优先级(Subpriority),这两个优先级共同决定了中断的响应顺序。在本文中,我们将详细探讨这两个优先级如何影响中断响应,并提供相应的代码示例。
在这里插入图片描述

抢占优先级与子优先级的基本概念

抢占优先级决定了中断之间的嵌套关系。当一个高抢占优先级的中断发生时,如果当前正在处理一个低抢占优先级的中断,那么高优先级的中断会抢占低优先级中断的执行,直到高优先级中断处理完成。这种机制确保了关键任务能够及时得到处理。

子优先级则在具有相同抢占优先级的中断中起作用。如果两个中断具有相同的抢占优先级,那么子优先级高的中断会先被处理。子优先级的存在使得系统能够在多个同等重要的中断中做出选择,优先处理某些中断。

如何设置抢占优先级和子优先级

在STM32微控制器中,可以通过NVIC(Nested Vectored Interrupt Controller)来设置抢占优先级和子优先级。以下是设置这两个优先级的步骤:

  1. 选择优先级分组:STM32提供了几种不同的优先级分组模式,通过NVIC_PriorityGroupConfig()函数来设置。这个函数决定了抢占优先级和子优先级的位数分配。

  2. 初始化中断:使用NVIC_InitTypeDef结构体来配置特定中断的优先级。通过HAL_NVIC_Init()函数来应用这些配置。

代码示例

以下是一个代码示例,展示了如何为两个不同的中断设置不同的抢占优先级和子优先级。

#include "stm32f1xx_hal.h"

// 定义中断优先级
#define PREEMPTION_PRIORITY_HIGH    (0x0F << NVIC_PRIORITYGROUP_0_PREEMPTION_PRIORITY_POS)
#define SUB_PRIORITY_HIGH          (0x0F << NVIC_PRIORITYGROUP_0_SUB_PRIORITY_POS)
#define PREEMPTION_PRIORITY_MEDIUM (0x07 << NVIC_PRIORITYGROUP_0_PREEMPTION_PRIORITY_POS)
#define SUB_PRIORITY_MEDIUM         (0x07 << NVIC_PRIORITYGROUP_0_SUB_PRIORITY_POS)
#define PREEMPTION_PRIORITY_LOW     (0x00 << NVIC_PRIORITYGROUP_0_PREEMPTION_PRIORITY_POS)
#define SUB_PRIORITY_LOW             (0x00 << NVIC_PRIORITYGROUP_0_SUB_PRIORITY_POS)

// 初始化NVIC
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStruct = {0};

    // 设置优先级分组为0,4位抢占优先级,0位子优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    // 设置高优先级中断
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; // 假设TIM2为高优先级中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = PREEMPTION_PRIORITY_HIGH;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = SUB_PRIORITY_HIGH;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    HAL_NVIC_Init(&NVIC_InitStruct);

    // 设置中等优先级中断
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; // 假设USART1为中等优先级中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = PREEMPTION_PRIORITY_MEDIUM;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = SUB_PRIORITY_MEDIUM;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    HAL_NVIC_Init(&NVIC_InitStruct);

    // 设置低优先级中断
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // 假设EXTI0为低优先级中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = PREEMPTION_PRIORITY_LOW;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = SUB_PRIORITY_LOW;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    HAL_NVIC_Init(&NVIC_InitStruct);
}

// 定时器中断处理函数
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim2);
}

// USART中断处理函数
void USART1_IRQHandler(void)
{
    HAL_UART_IRQHandler(&huart1);
}

// 外部中断处理函数
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI0_IRQHandler();
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    NVIC_Configuration();

    // 其他初始化代码...

    while (1)
    {
        // 主循环代码...
    }
}

void SystemClock_Config(void)
{
    // 系统时钟配置代码...
}

在这个示例中,我们首先定义了不同的优先级宏,然后在NVIC_Configuration()函数中设置了三个不同优先级的中断。TIM2被设置为最高优先级,USART1为中等优先级,EXTI0为最低优先级。这样,当这些中断同时发生时,TIM2的中断将首先被处理,然后是USART1,最后是EXTI0。

结语

STM32微控制器的中断优先级设置是确保系统响应性和实时性的关键。通过合理配置抢占优先级和子优先级,开发者可以确保关键任务得到及时处理,同时避免低优先级任务长时间阻塞高优先级任务的执行。在设计STM32应用程序时,了解和正确使用中断优先级是非常重要的。通过本文的介绍和代码示例,希望能够帮助读者更好地理解和应用STM32的中断优先级设置。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

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

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

相关文章

Java22已发布,支持SpringBoot3.3.0正式版

Java22已发布&#xff0c;支持SpringBoot3.3.0正式版 文章目录 Java22已发布&#xff0c;支持SpringBoot3.3.0正式版1. JDK22现已推出&#xff01;2. Java22的新功能1. 语言改进1. 语言预览 2. 库文件3. 性能4. 工具 3. 资源 Java 22现已发布 下一个Java版本提高了Java应用程序…

使用pandas进行数据清洗

采集到原始的数据中会存在一些噪点数据&#xff0c;噪点数据是对分析无意义或者对分析起到偏执作用的数据。如何清洗&#xff1a; 清洗空值/缺失值清洗重复值清洗异常值 import pandas as pd from pandas import DataFrame,Series import numpy as np pandas处理空值操作 i…

EasyPOI操作Excel从零入门

教程介绍 我们不造轮子&#xff0c;只是轮子的搬运工。&#xff08;其实最好是造轮子&#xff0c;造比别人好的轮子&#xff09;开发中经常会遇到excel的处理&#xff0c;导入导出解析等等&#xff0c;java中比较流行的用poi&#xff0c;但是每次都要写大段工具类来搞定这事儿…

Python6:Socket编程初步学习笔记

Socket协议概要 创建socket的时候&#xff0c;需要一些选项来说明本次使用协议具体是什么&#xff0c;常用的两个&#xff1a; 由此产生的不同组合&#xff1a; 但目前TCP(IPV4)是主流&#xff0c;SOCK_STREAMAF_INET 创建和使用Socket socket模块中有socket类&#xff1a…

macOS访问samba文件夹的正确姿势,在哪里更改“macOS的连接身份“?还真不好找!

环境&#xff1a;路由器上需要身份认证的Mini NAS macOS Sonoma 14 这是一个非常简单的问题&#xff0c;但解决方法却藏得比较深&#xff0c;不够直观&#xff0c;GPT也没有给出明确的解决提示&#xff0c;特意记录一下。 macOS很多地方都很自动&#xff0c;有时候让人找不到设…

深度学习pytorch——多分类问题(持续更新)

回归问题 vs 分类问题&#xff08;regression vs classification&#xff09; 回归问题&#xff08;regression&#xff09; 1、回归问题的目标是使预测值等于真实值&#xff0c;即predy。 2、求解回归问题的方法是使预测值和真实值的误差最小&#xff0c;即minimize dist(p…

opencv各个模块介绍(2)

Features2D 模块&#xff1a;特征检测和描述子计算模块&#xff0c;包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类&#xff0c;这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector&#xff1a;特征检测器的基类&#xf…

java数据结构与算法刷题-----LeetCode452. 用最少数量的箭引爆气球

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;贪心算法&#xff0c;时间复杂度O( n ∗ l …

【计算机】——51单片机——持续更新

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

AI+软件工程:10倍提效!用ChatGPT编写系统功能文档

系统功能文档是一种描述软件系统功能和操作方式的文档。它让开发团队、测试人员、项目管理者、客户和最终用户对系统行为有清晰、全面的了解。 通过ChatGPT&#xff0c;我们能让编写系统功能文档的效率提升10倍以上。 ​《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记…

一文看懂,高端及大流量停车场如何选择合适的道闸管理系统?

在当今快速发展的城市环境中&#xff0c;停车场的管理和运营已成为城市基础设施建设的重要组成部分。不同类型的停车场&#xff0c;如大流量停车场和高端停车场&#xff0c;面临着各自独特的挑战和需求。为了确保停车场的高效运营和良好的用户体验&#xff0c;选择合适的道闸管…

在ubuntu22.04系统上用pycharm编写第一个ros2程序

1.打开终端&#xff08;快捷键altctrlt&#xff09;&#xff0c;创建工作空间&#xff0c;工作空间就是文件夹 2.创建一个功能包 打开pycharm的终端&#xff08;altf12&#xff09; 3.创建节点文件 在village_li文件夹右键新建li4.py 4.在li4.py编写代码 5.在setup.py里面添加…

Ubuntu Desktop 安装谷歌拼音输入法

Ubuntu Desktop 安装谷歌拼音输入法 1. Installation1.1. 汉语语言包​1.2. 谷歌拼音输入法1.3. 安装语言包1.4. 键盘输入方式系统1.5. 重启电脑1.6. 输入法配置 2. configuration2.1. Text Entry Settings… 3. ExecutionReferences 1. Installation 1.1. 汉语语言包 strong…

淘宝海外获取tglobal跨境商品原数据 API 返回值说明

一、应用场景 宝海外获取TGlobal跨境商品原数据API的应用场景相当广泛&#xff0c;涵盖了多个领域和行业。以下是一些主要的应用场景&#xff1a; 跨境电商平台&#xff1a;跨境电商平台可以通过此API获取全球范围内的商品信息&#xff0c;从而丰富平台上的商品种类&#xff…

边缘计算基础介绍及AKamai-linode产品分析

1、背景 随着互联网的发展&#xff0c;我们进入了大数据时代&#xff0c;这个时代也是移动互联网的时代&#xff0c;而且这个时代&#xff0c;大量的线下服务走到线上&#xff0c;随之而来的&#xff0c;比如外卖、叫车……于是&#xff0c;有各种各样的 App 和设备在收集你的…

如何打破SAST代码审计工具的局限性?

关键词&#xff1a;白盒测试&#xff1b;代码分析工具&#xff1b;代码扫描工具&#xff1b;静态代码检测工具&#xff1b; 在代码的世界里&#xff0c;安全问题如同潜伏的暗礁&#xff0c;随时可能让航行中的软件项目触礁沉没。SAST代码审计工具如同雷达一样&#xff0c;以其独…

Python - 深度学习系列30 - 使用LLaMA-Factory微调模型

说明 最实用的一种利用大语言模型的方式是进行微调。预训练模型与我们的使用场景一定会存在一些差异&#xff0c;而我们又不可能重头训练。 微调的原理并不复杂&#xff0c;载入模型&#xff0c;灌新的数据&#xff0c;然后运行再训练&#xff0c;保留checkpoints。但是不同项…

Cobalt Strike -- 各种beacon

今天来讲一下cs里面的beacon 其实cs真的功能很强大&#xff0c;自带代理创建&#xff0c;自带beacon通信&#xff01;&#xff01;&#xff01; 一张图&#xff0c;就能说明beacon的工作原理 1.Beacon 每当有一台机器上线之后&#xff0c;我们都会选择sleep时间&#xff0c;…

PCI产业概述和产业发展动态分享

atsec白海蔚 2024年3月底 关键词&#xff1a;支付卡产业、PCI DSS、数据安全、支付交易 本文为atsec和作者技术共享类文章&#xff0c;旨在共同探讨信息安全的相关话题。转载请注明&#xff1a;atsec和作者名称。 *如有兴趣了解早期产业信息请参见作者于2021年4月发布信息&a…

数据在内存里面的存储

学习流程 ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…