stm32中断

目录

简介

什么是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);/*清除中断标志位*/
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在ffmpeg中,如何把h264转换为rgb格式

在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式 文章中介绍了,h264解码的时候是直接解码为yuv的,如果在使用的过程中 需要用到rgb的格式,我们该如何来转换这种格式呢? 在上面的文章中,我们已…

[架构之路-252/创业之路-83]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业应用信息系统集成

目录 第一章 什么是企业应用信息系统集成What 1.1 简介 1.2 架构 二、为什么需要企业应用信息系统集成Why 三、如何实现企业应用信息系统集成 3.1 步骤 3.2 企业应用集成的层次 3.3 业务流程重组 第一章 什么是企业应用信息系统集成What 1.1 简介 企业应用信息系统集…

【项目源码解析】某3C产品自动光学检测系统

解决方案源码解析思维导图 一、带有桁架机械手的自动光学检测系统介绍 二、关于机械手运动控制(是否需要机器人学方面的知识) 机械手的运动控制不需要深入了解机器人学方面的知识的情况包括: 预配置和任务单一性:如果机械手已经预…

深入理解元素的高度、行高、行盒和vertical-align

1.块级元素的高度 当没有设置高度时,高度由内容撑开,实际上是由行高撑开,当有多行时,高度为每行的行高高度之和。 行高为什么存在? 因为每行都由一个行盒包裹,行高实际上是行盒的高度。 2.什么是行盒&am…

一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium

大家好,我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 以及1小时掌握Python操作Mysql数据库之pymysql模块技术 近日锋哥又卷了一波课程,python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium,文字版视频版。1…

使用Objective-C和ASIHTTPRequest库进行Douban电影分析

概述 Douban是一个提供图书、音乐、电影等文化内容的社交网站,它的电影频道包含了大量的电影信息和用户评价。本文将介绍如何使用Objective-C语言和ASIHTTPRequest库进行Douban电影分析,包括如何获取电影数据、如何解析JSON格式的数据、如何使用代理IP技…

网站如何改成HTTPS访问

在今天的互联网环境中,将网站更改成HTTPS访问已经成为了一种标准做法。HTTPS不仅有助于提高网站的安全性,还可以提高搜索引擎排名,并增强用户信任。因此,转换为HTTPS是一个重要的举措,无论您拥有个人博客、电子商务网站…

HarmonyOS(二)—— 初识ArkTS开发语言(上)之TypeScript入门

前言 Mozilla创造了JS,Microsoft创建了TS,而Huawei进一步推出了ArkTS。因此在学习使用ArkTS前,需要掌握基本的TS开发技能。 ArkTS介绍 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上&am…

神经网络的解释方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM

原理优点缺点GAP将多维特征映射降维为一个固定长度的特征向量①减少了模型的参数量;②保留更多的空间位置信息;③可并行计算,计算效率高;④具有一定程度的不变性①可能导致信息的损失;②忽略不同尺度的空间信息CAM利用…

【mfc/VS2022】计图实验:绘图工具设计知识笔记3

实现类对串行化的支持 如果要用CArchive类保存对象的话,那么这个对象的类必须支持串行化。一个可串行化的类通常有一个Serialize成员函数。要想使一个类可串行化,要经历以下5个步骤: 1、从CObject派生类 2、重写Serialize成员函数 3、使用DE…

Ubuntu MySQL客户端功能介绍(mysql-client)mysql命令(mysql客户端命令)数据库导出、数据库导入

文章目录 Ubuntu MySQL客户端(mysql-client)功能介绍MySQL客户端与服务端服务器端(MySQL Server)客户端(MySQL Client) 安装MySQL客户端连接到MySQL服务器(mysql -h host -u user -p)执行SQL查询批处理模式…

wordpress上传限制2M修改为256M的两种方式

方式一:修改php.ini 上传文件限制大小主要是php的php.ini配置决定的,所以只要找到php的配置文件,并且修改里面的配置即可,linux查看php的版本和配置文件位置的命令: php -i | grep "Configuration File" 一…

AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器

文章目录 简介离线语音控制模块Mini MP3模块0.96寸 OLED模块实验准备安装库接线定义主要程序实验效果注意事项总结 简介 在前面一篇文章里我们对AI智能语音识别模块进行了介绍,并对离线语音模组下载固件的过程进行了一个简单描述,不知道大家还记不记得&…

用前端框架Bootstrap和Django实现用户注册页面

01-新建一个名为“mall_backend”的Project 命令如下: CD E:\Python_project\P_001\myshop-test E: django-admin startproject mall_backend02-新建应用并注册应用 执行下面条命令依次创建需要的应用: CD E:\Python_project\P_001\myshop-test\mall…

uniapp如何使用mumu模拟器

模拟器安装 下载地址:MuMu模拟器 模拟器相关设置 1.在设置-显示中选中手机版,设置手机分辨率 2.设置-关于手机-版本号快速点击,将其设置为开发者模式 3.选择多开器 4.打开hbuilderx,找到adb设置 5.配置adb路径及端口号&#x…

Servlet 初始化参数(web.xml和@WebServlet)

1、通过web.xml方式 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xm…

MFC实现堆栈窗口:多个子界面可任意切换

1、效果 在Qt中可使用QStackedWidget控件直接拖动布置即可实现&#xff0c;但在MFC中并未提供类似的控件&#xff0c;因此需要自己简单实现。 2、实现原理 实现原理比较简单&#xff0c;父级对话框在显示的区域部分&#xff0c;通过切换子对话框即可实现。子对话框去掉边框后…

香港服务器不稳定的几种情况

​  近年来&#xff0c;随着互联网的迅猛发展&#xff0c;香港作为一个重要的网络枢纽地区&#xff0c;扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况&#xff0c;导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…

PostGreSQL:JSON|JSONB数据类型

JSON JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本数据交换格式JSON 独立于语言&#xff1a;JSON 使用 Javascript语法来描述数据对象&#xff0c;但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…

【Linux】Linux项目部署及更改访问端口号和jdk、tomcat、MySQL环境搭建的配置安装

目录 一、作用 二、配置 1、上传安装包 2、jdk 2.1、解压对应安装包 2.2、环境变量搭建 3、tomcat 3.1、解压对应安装包 3.2、启动 3.3、设置防火墙 3.4、设置开发端口 4、MySQL 三、后端部署 四、Linux部署项目 1、单体项目 五、修改端口访问 1、进入目录 2…