STM32微控制器中,如何处理多个同时触发的中断请求?

news2024/11/15 16:38:01

在STM32微控制器中,处理多个同时触发的中断请求需要一个明确的中断优先级策略,以确保关键任务能够及时得到响应。STM32的中断控制器(NVIC)支持优先级分组,允许开发者为不同的中断设置抢占优先级和子优先级。本文将详细介绍如何在STM32微控制器中处理多个同时触发的中断请求,并提供相应的代码示例。

中断优先级的概念

STM32微控制器使用ARM Cortex-M内核,其中断控制器(NVIC)支持多达4个优先级级别。每个级别可以有不同的抢占优先级和子优先级位数。抢占优先级决定了中断之间的嵌套关系,而子优先级在具有相同抢占优先级的中断中决定了处理顺序。
在这里插入图片描述

处理多个中断请求的策略

  1. 优先级分组:通过NVIC_PriorityGroupConfig()函数设置优先级分组,决定抢占优先级和子优先级的位数分配。

  2. 中断优先级配置:为每个中断配置抢占优先级和子优先级,使用NVIC_InitTypeDef结构体和HAL_NVIC_Init()函数。

  3. 中断处理函数:编写中断处理函数来处理中断事件,并确保它们尽可能快速地完成任务,以避免长时间占用CPU。

  4. 中断嵌套:高优先级的中断可以打断低优先级中断的执行。如果必要,可以使用中断嵌套来处理紧急任务。

代码示例

以下是一个代码示例,展示了如何在STM32微控制器中配置和处理两个同时触发的中断请求。

#include "stm32f1xx_hal.h"

// 定义中断优先级
#define PREEMPTION_PRIORITY 0 // 最高抢占优先级
#define SUB_PRIORITY       0  // 最高子优先级

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

    // 设置优先级分组为2位抢占优先级,2位子优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    // 配置高优先级中断
    NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn; // 定时器1更新中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = PREEMPTION_PRIORITY;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = SUB_PRIORITY;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    HAL_NVIC_Init(&NVIC_InitStruct);

    // 配置中等优先级中断
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; // USART1中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = PREEMPTION_PRIORITY + 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = SUB_PRIORITY;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    HAL_NVIC_Init(&NVIC_InitStruct);
}

// 定时器中断处理函数
void TIM1_UP_IRQHandler(void)
{
    // 定时器中断处理代码
    // ...

    // 清除中断标志位
    __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);
}

// USART中断处理函数
void USART1_IRQHandler(void)
{
    // USART中断处理代码
    // ...

    // 清除中断标志位
    __HAL_UART_CLEAR_IT(&huart1, UART_IT_RXNE);
}

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

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

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

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

在这个示例中,我们首先设置了优先级分组,然后为TIM1和USART1中断配置了不同的抢占优先级和子优先级。TIM1的中断具有更高的优先级,因此在两个中断同时触发时,TIM1的中断将首先被处理。

处理多个中断请求的注意事项

  • 避免中断处理函数中的长时间操作:中断处理函数应该尽可能简短,以减少对CPU的占用时间。
  • 使用中断嵌套:在某些情况下,可能需要在高优先级中断处理函数中处理另一个低优先级的中断事件。
  • 合理分配优先级:确保关键任务(如实时控制)具有高优先级,而次要任务(如日志记录)具有低优先级。
  • 测试和验证:在实际应用中,应该对中断优先级设置进行充分的测试和验证,以确保系统在各种情况下都能可靠地工作。

结语

STM32微控制器提供了灵活的中断优先级设置机制,使得开发者能够有效地处理多个同时触发的中断请求。通过合理配置中断优先级,可以确保关键任务得到及时响应,提高系统的实时性和可靠性。开发者需要根据应用的具体需求,仔细设计和实施中断优先级策略。通过本文的介绍和代码示例,希望能够帮助读者更好地理解和应用STM32的中断处理机制。

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

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

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

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

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

点击领取更多详细资料

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

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

相关文章

【深度学习】pytorch,MNIST手写数字分类

efficientnet_b0的迁移学习 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader from torchvision import models import matplo…

【数据结构】五分钟自测主干知识(十)

上一节,我们讲述了二叉树的概念,二叉树又有什么基本操作呢?今天我们来讲述二叉树的应用~ 话不多说,书继上回 5.3二叉树的遍历及应用 二叉树由三个基本部分组成:根结点(D),左子树&a…

ZooKeeper 的常见应用场景

数据发布与订阅 发布与订阅即所谓的配置管理,顾名思义就是将数据发布到ZooKeeper节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使用。 数据发布/订阅的一个常见的…

Spring Boot:基础配置

Spring Boot 全局配置文件application.propertiesapplication.yml全局配置文件的优先级 从全局配置文件中获取数据的注解从外部属性文件中获取数据的注解全局配置文件的配置项通用配置项数据源配置项JPA 配置项日志配置项配置文件特定配置项Profile 特定配置项 配置类配置文件中…

【Emgu CV教程】10.4、轮廓之多边形近似拟合

文章目录 一、什么叫轮廓的多边形近似拟合二、轮廓的多边形近似拟合函数三、简单应用1.原始素材2.代码3.运行结果 一、什么叫轮廓的多边形近似拟合 轮廓一般都是光滑的曲线,多边形近似拟合的意思就是,利用少量的点组成的折线,近似逼近原始多…

AIGC实战——Transformer模型

AIGC实战——Transformer模型 0. 前言1. T52. GPT-3 和 GPT-43. ChatGPT小结系列链接 0. 前言 我们在 GPT (Generative Pre-trained Transformer) 一节所构建的 GPT 模型是一个解码器 Transformer,它逐字符地生成文本字符串,并使用因果掩码只关注输入字…

力扣98---验证二叉搜索树

题目描述: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 …

计算联合体union的大小

一:联合类型的定义 联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体) 比如:共用了 i 这个较大的空间 二: 联合的特点 …

YoloV8改进策略:Block改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文使用PKINet的Block替换YoloV8的Block,实现涨点。改进方法是我独创首发,给写论文没有思路的同学提供改进思路,欢迎大家订阅! 论文:《Poly Kernel Inception …

需求:实现一个类似打印的效果(文字一个字一个字的输出)

实现效果: 需求:最近接到这么一个需求,ai机器人回复的问题,后端是通过websocket每隔一段事件返回数据,前端拿到数据后直接渲染,现在需要做到一个效果,后端返回的结果前端需要一个一个文字的输出…

Unity Canvas的三种模式

一、简介: Canvas的Render Mode一共有三种模式:Screen Space -OverLay、Screen Space-Camera、World Space Screen Space - Overlay(屏幕空间 - 覆盖): 这是最简单的 Canvas 渲染模式。UI 元素在这个模式下将渲染在屏…

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用:https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后,需要将安装目录添加到环境变…

flutter3_douyin:基于flutter3+dart3短视频直播实例|Flutter3.x仿抖音

flutter3-dylive 跨平台仿抖音短视频直播app实战项目。 全新原创基于flutter3.19.2dart3.3.0getx等技术开发仿抖音app实战项目。实现了类似抖音整屏丝滑式上下滑动视频、左右滑动切换页面模块,直播间进场/礼物动效,聊天等模块。 运用技术 编辑器&#x…

C语言字节对齐关键字#pragma pack(n)的使用

0 前言 在进行嵌入式开发的过程中,我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作,有些是为了加速对内存的访问。因此,学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

微服务(基础篇-003-Nacos集群搭建)

目录 Nacos集群搭建 1.集群结构图 2.搭建集群 2.1.初始化数据库 2.2.下载nacos 2.3.配置Nacos 2.4.启动 2.5.nginx反向代理 2.6.优化 视频地址: 06-Nacos配置管理-nacos集群搭建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p29&…

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么?在计算机体系中扮演什么角色? 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

Springboot做分组校验

目录 分组校验 Insert分组 Upload分组 测试接口 测试结果 添加测试 更新测试 顺序校验GroupSequence 自定义分组校验 自定义分组表单 CustomSequenceProvider 测试接口 测试结果 Type类型为A Type类型为B 总结: 前文提到了做自定义的校验注解&#xff…

React高阶组件(HOC)

高阶组件的基本概念 高阶组件(HOC,Higher-Order Components)不是组件,而是一个函数,它会接收一个组件作为参数并返回一个经过改造的新组件: const EnhancedComponent higherOrderComponent(WrappedCompo…

小游戏-扫雷

扫雷大多人都不陌生,是一个益智类的小游戏,那么我们能否用c语言来编写呢, 我们先来分析一下扫雷的运行逻辑, 首先,用户在进来时需要我们给与一个菜单,以供用户选择, 然后我们来完善一下&#…

解决方案Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.

文章目录 一、现象二、解决方案 一、现象 当安装好JDK跟neo4j,用neo4j.bat console来启动neo4却报错: 部分报错信息: Starting Neo4j. WARNING! You are using an unsupported Java runtime. Please use Oracle Java™ 11, OpenJDK™ 11 t…