stm32中断

news2025/2/26 6:30:50

目录

简介

什么是NVIC

中断优先级

EXTI 简介

 总结

hal库初始化代码

标准库初始化代码


简介

        什么是中断?正常情况下,微处理器根据代码内容,按顺序执行指令。执行过程中,如果遇到其它紧急的事件需要处理,则先暂停当前任务,执行紧急事件,待紧急事件处理完后,再恢复到刚才暂停的地方继续执行。这个产生的紧急事件就叫做中断或异常

         通常把CPU内部产生的紧急事件叫做异常,来自CPU外部的片上外设产生的紧急事件叫做中断,异常和中断的效果基本一致,都是暂停当前任务,优先执行紧急事件,因此一般将中断和异常统称为中断

图一

什么是NVIC

        如果两个中断同时发生,应该先执行哪个中断任务?又比如一个中断发生了,又来了一个更紧急的中断,这是中断嵌套,这是继续执行原来的中断,还是执行新的紧急中断?

        针对问题,Cortex-M3内核有一个专门管理中断的外设NVIC( Nested Vectored Interrupt Controller,嵌套向量中断控制器) , 通过优先级控制中断的嵌套和调度。 NVIC是一个总的中断控制器, 无论是来在内核的异常还是外设的外部中断, 都由NVIC统一进行管理

        如图一,Reset( 复位) 、 NMI( Non Maskable Interrupt,不可屏蔽中断)、 HardFault( 硬件异常) 的优先级是固定的, 且优先级是负数,也就是最高的(优先级数字越小,优先级越高)。 剩下的异常或中断,都可以通过修改NVIC的寄存器调整优先级( 但不能设置为负数) 。

中断优先级

        中断优先级可以分为:抢占式优先级和响应优先级,响应优先级也称子优先级。每个中断源都需要被指定这两种优先级,具有高优先级的中断可以打断低优先级的中断,实现中断嵌套,只有抢占优先级才可能出现中断嵌套。两个或者多个中断优先级和子优先级相同时,自然优先级,看中断向量表的中断排序(图一),数值越小,优先级越高

        NVCI 的中断优先级分组: STM32F103 将中断分为 5 个组,组 0~4,分组的设置是
由 SCB->AIRCR 寄存器的 bit10~8 来定义。M3 芯片为了精简设计,只使用了PRI_n的Bits[7:0]中的Bits[7:4]设置优先级,低四位取零,这样以至于最多只有 16 级中断嵌套,即 2^4=16

图1

        通常中断优先级分组只会设置一次, 它针对的是系统中所有的中断。 后续设置某个中断的中断优先级时, 只需要在这个组规定的抢占优先级数和子优先级级数范围内分配优先级级数。 后续代码中,不应该再修改中断优先级分组,否则导致中断顺序不按预期触发。

EXTI 简介

        EXTI 即是外部中断和事件控制器,STM32F103系列的EXTI支持19个外部中断/事件请求,它是由产生事件/中断请求的边沿检测器组成.每个中断/事件都有独立的触发和屏蔽设置,支持中断模式和事件模式。这些都是信息输入端,也就是输入线具体如下:
        EXTI 线 0~15:对应外部 IO 口的输入中断
        EXTI 线 16:连接到 PVD 输出
        EXTI 线 17:连接到 RTC 闹钟事件
        EXTI 线 18:连接到 USB 唤醒事件
        EXTI 线 19:连接到以太网唤醒事件

        中断模式是指外部信号产生电平变化时, EXTI将该信号给NVIC处理, 从而触发中断,执行中断服务函数,完成对应操作。

        ​​​​​​​事件模式是指外部信号产生电平变化时, EXTI根据配置,联动ADC或TIM执行相关操作

        ​​​​​​​中断和事件的产生源是一样的,中断需要软件实现相应功能,而事件是由硬件触发后执行相应操作。前者需要CPU参与功能实现,可以实现的功能更多,后者无需CPU参与,具有更高的响应速度

        AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择(也就是选择引脚接入到EXTI)

图2

         STM32F103的GPIO挂载APB总线上,如果要使用GPIO引脚作为外部中断/事件功能,则必须使能APB总线上该引脚对应端口的时钟和AFIO复用功能,而且GPIO引脚众多,将引脚数字相同的作为一组,共享一个中断线,如EXTI0组, PA0作为了中断源,则PB0~PG0不能作为中断源

 总结

        假设中断A的抢占优先级比中断B的抢占优先级高,两个中断同时发生,那中断A优先执行

        假设中断A的抢占优先级和中断B的抢占优先级一样,两个中断同时发生,那么子优先级高的中断优先执行。

        假设中断A的抢占优先级比中断B的抢占优先级高,中断B先发生,随后A也发生,那么将暂停中断B,先执行中断A, A执行完后,再回来执行中断B,最后执行主程序,这种效果即中断嵌套。

        假设中断A的抢占优先级比中断B的抢占优先级一样,中断A的子优先级比中断B的子优先级高,中断B先发生,随后A也发生,那么中断A将等待中断B执行完后,才会执行中断A,即子优先级不能中断嵌套。

        假设中断A的抢占优先级和中断B的抢占优先级一样,且子优先级也一样,两个中断同时发生,那么根据前面图一顺序,排在前面的先执行。

hal库初始化代码


void exti_init(void)
{
    /*定义GPIO结构体*/
    GPIO_InitTypeDef gpio_init_exti_struct = {0};
    /*使能时钟*/
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /*配置io*/
    gpio_init_exti_struct.Mode = GPIO_MODE_IT_FALLING;/*下降沿触发模式*/
    gpio_init_exti_struct.Pull = GPIO_PULLUP;    /*上拉*/
    gpio_init_exti_struct.Speed = GPIO_SPEED_FREQ_HIGH; /*引脚反转速度快*/
    gpio_init_exti_struct.Pin = EXTI_GPIO_PIN;    /*选择引脚*/
    
    HAL_GPIO_Init(EXTI_GPIO_PORT,&gpio_init_exti_struct);/*初始化引脚(AFIO\EXTI)*/
    /*这已经默认设置中断分组,有需要开启下面*/
    //HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

    HAL_NVIC_SetPriority(EXTI0_IRQn,0, 0);/*设置中断优先级*/
    
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);/*使能中断*/
}
/*中断服务函数,由引脚号确定,公共处理函数*/
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(EXTI_GPIO_PIN);
}
/*回调函数*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /*需要分开是那个引脚引起的中断*/
    switch(GPIO_Pin)
    {
        case EXTI_GPIO_PIN:
        {
            /*执行处理的任务*/
        }
        default:break;
        
    }
}

标准库初始化代码

void exit_init(void)
{
    /*使能GPIOA时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    /*使能AFIO时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    
    /*初始化GPIO*/
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;/*上拉*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    /*配置中断源*/
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
    /*中断初始化*/
    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;/*设置中断输入线*/
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;/*使能对应的外部中断线*/
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;/*设置外部中断的模式为中断模式*/
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;/*设置外部中断的触发方式为下降沿触发*/
    EXTI_Init(&EXTI_InitStruct);
    /*配置中断优先级分组*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;/*配置中断的通道*/
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;/*使能中断的通道*/
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;/*抢占优先级*/
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;/*响应优先级*/
    NVIC_Init(&NVIC_InitStruct);
}

/*中断服务函数*/
void EXTI0_IRQHandler(void)
{
    /*检查 EXTI 对应引脚的中断是否已经被触发*/
    if(EXTI_GetITStatus(EXTI_Line0) == SET)
    {
        /*处理代码*/
    }
    EXTI_ClearITPendingBit(EXTI_Line0);/*清除中断标志位*/
}

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

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

相关文章

CodeWhisperer 初体验-手把手教导 给你飞一般的体验!

文章作者:燛衣 CodeWhisperer 有以下几个主要用途: 解决编程问题:CodeWhisperer 可以帮助您解决遇到的编程问题。您可以描述您的问题或需求,CodeWhisperer 将尽力提供相关的解决方案、代码示例或建议。无论您是遇到了语法错误、逻…

ardupilot开发 --- SLAM 篇

1. 视觉SLAM 1.1 深度相机的种类 结构光相机,如 Kinect1.0、RealSenseTOF相机,如 Kinect2.0双目相机,如 ZED详细参考:https://zhuanlan.zhihu.com/p/282776636 1.2 视觉SLAM算法 2D slam 与3D slam 应用场景有哪些不同&#x…

高通财报分析:恶劣环境将导致高通股价在财报后大幅下跌

来源:猛兽财经 作者:猛兽财经 总结: (1)根据我们的分析,高通(QCOM)的股价在上个季度下跌了近16%,预计在本季度财报后还将继续下跌。 (2)在恶劣的环境下,高通…

西门子精智触摸屏使用U盘下载程序时报错“出现严重错误,必须关机”处理办法

西门子精智触摸屏使用U盘下载程序时报错“出现严重错误,必须关机”处理办法 如下图所示,精智触摸屏使用U盘下载程序时报错: Application CTLPNL. EXE encountered a serious error and must shut down 出现这种情况时,可以尝试从以下几方面进行逐个排查: 断电重启,更换U盘…

知了汇智2024届“天府人才·校招行”启动,这些岗位急招...

知了汇智作为数字经济新业态下的产教融合服务型平台机构,大力构建企业与高校的交流平台,旗下全资子公司成都知聊人才服务有限公司,致力于为企业提供数字技术、数字营销方面的人才招聘、人才输送、人才定制等服务;为求职者提供个人…

三氧化二铁纳米片

(西)三氧化二铁纳米片 (安)名称:三氧化二铁纳米片 (瑞)CAS:1309-37-1 (禧)分子式:Fe2O3 (生)外观:白色粉末…

怎么让照片内存变小?三个方法轻松搞定!

让照片内存变小可以节省存储空间、提高传输速度、优化图片质量和降低流量消耗等,对于设备性能和用户体验都有积极的影响。下面介绍了三种简单有效的方法,一起来看看吧~ 方法一:通过嗨格式压缩大师压缩照片让内存变小 通过压缩照片&#xff0…

avi怎么转mp4?

avi怎么转mp4?如今市面上涌现了各种多样的视频格式,其中AVI作为一种音频视频交错格式,虽然使用较少但相对常见。它的优点在于占用空间较小,但画面质量并不是很出色。然而,AVI格式也存在一个明显的缺点,即兼…

企业软文推广的时机有哪些?媒介盒子告诉你

软文成本低、效果持续,能够为企业带来品牌曝光,实现品牌增值,但是企业也不是每时每刻都需要进行软文推广,接下来媒介盒子就告诉大家,企业进行软文推广的时机有哪些? 一、 为新品造势 一般企业发布新品时就…

基于区域边缘控制器的智慧管廊安全监测方案

区域边缘控制器是一种集成了PLC、网关、数据采集、协议兼容、多设备联动控制等丰富功能的智能设备,基于高性能工业级处理器,内置边缘计算策略和设备控制逻辑,从而代替PLC,实现对边缘物联网设备的智能自主感知和控制,适…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇一)

python实现MC协议(SLMP 3E帧)的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模…

高压放大器在电火花加工中的作用是什么

高压放大器在电火花加工中扮演着至关重要的角色。下面安泰电子将详细介绍高压放大器在电火花加工中的作用。 电火花加工是一种精密加工技术,广泛应用于制造业的模具制造、航空航天、汽车零部件等领域。它通过在工件表面产生高频电火花放电的方式,实现对材…

设计模式(22)享元模式

一、介绍: 1、定义:享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 2、…

vue3中解析地址(address-parse插件的使用)

1.安装 npm install address-parse --save 2.使用 // 引入address-parse import AddressParse, { AREA, Utils } from "address-parse";const adressValue ref([])const getResolutionContent () > {const [result] AddressParse.parse(EnterpriseSalesDetai…

Android APT的使用

Apt 介绍 APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的 Annotation,根据注解自动生成代码。 Annotation 处理器在处理 Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件(文件具体内容由 Annot…

Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

这里写目录标题 前言1. 新建项目2.配置maven依赖3.编写代码4.打jar包5.上传服务器6.代码中引用 前言 老版本编写UDF时,需要继承 org.apache.hadoop.hive.ql.exec.UDF类,然后直接实现evaluate()方法即可。 由于公司hive版本比较高(3.x&#x…

Linux入门指令和权限讲解

目录 一,Linux指令讲解 1. ls 指令(查看文件) 2. pwd命令(展现当前工作目录) 3. cd 指令(改变当前所处工作目录) 4. touch指令(创建文件) 5.mkdir指令(创…

高效处理异常值的算法:One-class SVM模型的自动化方案

一、引言 数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量,消除噪声和错误,从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响,导致误导性的结论和决策。因此&…

【Java题】写一个泛型类,实现一个方法,求指定类型的数组中的最大值

一&#xff1a;题目 写一个泛型类&#xff0c;实现一个方法&#xff0c;求指定类型的数组中的最大值 二&#xff1a;分析 要注意实现Comparable接口&#xff0c;才能在不同类型比较时使用compareTo 三&#xff1a;代码 class Alg<T extends Comparable<T>>{public…

系统韧性研究(3)| 工程系统韧性要求

从最基本的层面上说&#xff0c;系统韧性指的是系统在逆境中继续执行其任务的程度。虽然对操作连续性至关重要&#xff0c;但系统的服务&#xff08;能力&#xff09;只是系统继续执行其任务所必须保护的一些资产。该系统必须检测不利因素&#xff0c;对其作出反应&#xff0c;…