【STM32-学习笔记-2-】外部中断

文章目录

  • 外部中断
    • Ⅰ、EXIT函数
    • Ⅱ、EXTI_InitTypeDef结构体参数
      • ①、EXTI_Line
      • ②、EXTI_LineCmd
      • ③、EXTI_Mode
      • ④、EXTI_Trigger
    • Ⅲ、NVIC函数
    • Ⅳ、NVIC_InitTypeDef结构体参数
      • ①、NVIC_IRQChannel
      • ②、NVIC_IRQChannelCmd
      • ③、NVIC_IRQChannelPreemptionPriority
      • ④、NVIC_IRQChannelSubPriority
    • Ⅲ、EXIT基本结构
    • Ⅳ、配置外部中断

外部中断

Ⅰ、EXIT函数

// 重置所有EXTI(外部中断/事件控制器)为默认值
void EXTI_DeInit(void);

// 初始化EXTI,根据初始化结构体配置参数
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

// 初始化EXTI初始化结构体的默认值
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);

// 生成指定EXTI线的软件中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

// 获取指定EXTI线的标志状态
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
// 清除指定EXTI线的标志
void EXTI_ClearFlag(uint32_t EXTI_Line);

// 获取指定EXTI线的中断状态
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
// 清除指定EXTI线的中断待处理位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

Ⅱ、EXTI_InitTypeDef结构体参数

①、EXTI_Line

指定要启用或禁用的EXTI线(中断线)

  • 该参数可以是@ref EXTI_Lines

    • 宏定义解释

      这些宏定义用于选择特定的外部中断线。每个宏定义一个特定的中断线,值为该中断线对应的位掩码

      • EXTI_Line0EXTI_Line19
        • :从 ((uint32_t)0x00001)((uint32_t)0x80000)
        • 描述:分别表示选择外部中断线0到19。每个宏定义的值是该中断线对应的位掩码,例如 EXTI_Line0 的值为 0x00001,表示第0位被设置为1,其他位为0

      特殊中断线:

      • EXTI_Line16:连接到PVD(可编程电压检测器)输出
      • EXTI_Line17:连接到RTC(实时时钟)报警事件
      • EXTI_Line18:连接到USB设备/USB OTG FS从挂起状态唤醒事件
      • EXTI_Line19:连接到以太网唤醒事件

      宏函数

      1. IS_EXTI_LINE(LINE)
        • 描述:检查给定的中断线选择是否有效
        • 参数LINE,代表外部中断线选择
        • 功能:检查LINE是否为有效的中断线组合。具体来说,检查LINE的高16位是否为0,且不为0
        • 返回值:如果LINE有效,返回1(真),否则返回0(假)
      2. IS_GET_EXTI_LINE(LINE)
        • 描述:检查给定的中断线选择是否为单个中断线
        • 参数LINE,代表外部中断线选择
        • 功能:检查LINE是否等于预定义的单个中断线选择宏中的任一个
        • 返回值:如果LINE为单个中断线,返回1(真),否则返回0(假)

      表格:

      宏定义描述
      EXTI_Line0~EXTI_Line150x00001~0x08000选择外部中断线0~15
      EXTI_Line160x10000连接到PVD输出的中断线
      EXTI_Line170x20000连接到RTC报警事件的中断线
      EXTI_Line180x40000连接到USB唤醒事件的中断线
      EXTI_Line190x80000连接到以太网唤醒事件的中断线
      宏函数描述
      IS_EXTI_LINE(LINE)检查LINE是否为有效的外部中断线选择
      IS_GET_EXTI_LINE(LINE)检查LINE是否为单个外部中断线选择

②、EXTI_LineCmd

指定所选EXTI线(中断线)的新状态

  • ENABLE:使能
  • DISABLE:失能

③、EXTI_Mode

指定EXIT的模式

  • 该参数可以是@ref EXTIMode_TypeDef

    • 枚举类型定义

      typedef enum
      {
       EXTI_Mode_Interrupt = 0x00, /*!< 配置为中断模式 */
       EXTI_Mode_Event = 0x04      /*!< 配置为事件模式 */
      } EXTIMode_TypeDef;
      
      • EXTI_Mode_Interrupt:值为 0x00,表示配置为中断模式
        • 在这种模式下,当外部信号触发中断时,会生成一个中断请求,可以中断当前的CPU操作,执行中断服务程序(ISR)
      • EXTI_Mode_Event:值为 0x04,表示配置为事件模式
        • 在这种模式下,当外部信号触发事件时,不会生成中断请求,但可以用于触发其他硬件操作,如启动DMA传输

      宏函数

      #define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event))
      
      • 描述:检查给定的模式是否为有效的EXTI模式
      • 参数MODE,代表EXTI模式
      • 功能:检查MODE是否等于预定义的模式中的任一个
      • 返回值:如果MODE有效,返回1(真),否则返回0(假)

④、EXTI_Trigger

指定EXTI的触发条件

  • 该参数可以是@ref EXTITrigger_TypeDef

    • 枚举类型定义

      typedef enum
      {
       EXTI_Trigger_Rising = 0x08,          /*!< 上升沿触发 */
       EXTI_Trigger_Falling = 0x0C,         /*!< 下降沿触发 */
       EXTI_Trigger_Rising_Falling = 0x10   /*!< 上升沿和下降沿都触发 */
      } EXTITrigger_TypeDef;
      
      • EXTI_Trigger_Rising:值为 0x08,表示配置为上升沿触发
        • 当外部信号从低电平变为高电平时,触发中断或事件
      • EXTI_Trigger_Falling:值为 0x0C,表示配置为下降沿触发
        • 当外部信号从高电平变为低电平时,触发中断或事件
      • EXTI_Trigger_Rising_Falling:值为 0x10,表示配置为上升沿和下降沿都触发
        • 当外部信号从低电平变为高电平或从高电平变为低电平时,触发中断或事件

      宏函数

      #define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \
                                        ((TRIGGER) == EXTI_Trigger_Falling) || \
                                        ((TRIGGER) == EXTI_Trigger_Rising_Falling))
      
      • 描述:检查给定的触发条件是否有效
      • 参数TRIGGER,代表EXTI的触发条件
      • 功能:检查TRIGGER是否等于预定义的触发条件中的任一个
      • 返回值:如果TRIGGER有效,返回1(真),否则返回0(假)

Ⅲ、NVIC函数

// 配置NVIC(嵌套向量中断控制器)优先级分组
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

// 初始化NVIC,根据初始化结构体配置参数
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

// 设置NVIC中断向量表的位置和偏移量
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);

// 配置NVIC的系统低功耗模式
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);

Ⅳ、NVIC_InitTypeDef结构体参数

①、NVIC_IRQChannel

指定要启用或禁用的IRQ通道

  • 该参数可以是@ref IRQn_Type

      • 描述:指定要启用或禁用的中断请求(IRQ)通道

      • 取值范围:可以是IRQn_Type枚举类型中的任意值。IRQn_Type定义了STM32设备的所有中断通道。具体值可以参考stm32f10x.h文件中的定义

      • 示例

        NVIC_IRQChannel = USART1_IRQn;  // 例如,启用USART1的中断
        

        image-20250112134951924

②、NVIC_IRQChannelCmd

配置NVIC_IRQChannel中定义的IRQ通道启用或禁用

  • ENABLE:使能(启用)
  • DISABLE:失能(禁用)

③、NVIC_IRQChannelPreemptionPriority

指定IRQ通道的抢占优先级

  • 在NVIC_IRQChannel中指定。该参数可以是一个值在0~15之间

      • 描述:指定在NVIC_IRQChannel中指定的IRQ通道的抢占优先级

      • 取值范围:0到15。0表示最高优先级,15表示最低优先级

      • 示例

        NVIC_IRQChannelPreemptionPriority = 0;  // 最高优先级
        

④、NVIC_IRQChannelSubPriority

指定IRQ通道的子优先级

  • 在NVIC_IRQChannel。该参数可以是一个值在0~15之间

      • 描述:指定在NVIC_IRQChannel中指定的IRQ通道的子优先级

      • 取值范围:0到15。0表示最高优先级,15表示最低优先级

      • 示例

        NVIC_IRQChannelSubPriority = 1;  // 子优先级为1
        
  • 抢占优先级:当多个中断同时发生时,抢占优先级高的中断会先被处理。如果抢占优先级相同,则子优先级高的中断先被处理
  • 子优先级:在抢占优先级相同的情况下,子优先级用于进一步区分中断的优先级

Ⅲ、EXIT基本结构

image-20250112134102539

Ⅳ、配置外部中断

  1. 开启GPIO和AFIO的时钟
    • 启用AFIO,允许配置引脚的备用功能,比如将某些引脚用作外部中断输入
  2. 配置GPIO
  3. 将引脚配置为外部中断(EXTI)线的触发源
  4. 配置EXIT
  5. 配置嵌套向量中断控制器(NVIC)的优先级分组
  6. 配置NVIC
#include "stm32f10x.h"                  // Device header

void CountSensor_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//启用AFIO,允许配置引脚的备用功能,比如将某些引脚用作外部中断输入
    //配置GPIO
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
  
    //配置EXIT外部中断
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将PB14引脚配置为外部中断(EXTI)线的触发源
    
    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line = EXTI_Line14;//选择外部中断线14
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;//启用外部中断线14
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//设置外部中断模式为中断模式
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//选择下降沿触发
    EXTI_Init(&EXTI_InitStruct);//初始化外部中断
  
    //设置NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置嵌套向量中断控制器(NVIC)的优先级分组
    
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;//选择外部中断15到10的IRQ通道
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//启用这个IRQ通道
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级为1
    NVIC_InitStruct.NVIC_IRQChannelSubPriority  = 1;//设置响应优先级为1
    NVIC_Init(&NVIC_InitStruct);
}
/*
//中断程序示例
void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line14) == SET)//判断是否进入中断
    {
        //执行中断程序 
        
        EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位
    }
}
*/

//*****************************************************************
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0) == SET)//顺时针旋转触发外部中断
    {
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
        {
            Encoder_Count--;//逆时针旋转
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

void EXTI1_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line1) == SET)//顺时针旋转触发外部中断
    {
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)
        {
            Encoder_Count++;//顺时针旋转
        }
        EXTI_ClearITPendingBit(EXTI_Line1);
    }
}

void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line14) == SET)
    {
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == 1)
        {
            Encoder_Count = 0;//按下旋转编码器计数清零
        }
        EXTI_ClearITPendingBit(EXTI_Line14);
    }
}

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

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

相关文章

利用 awk 定制化处理大量数据的计算

问题 有上万行&#xff08;甚至更多&#xff09;不断递增的浮点数&#xff08;每行一个&#xff09;&#xff0c;怎么将它们每四个一组计算每组第四个和第一个之间的差值&#xff0c;并打印输出计算结果&#xff1f; 例如文件 data 有以下数据&#xff1a; 2.699350 2.69935…

llama.cpp 模型可视化工具 GGUF Visualizer

llama.cpp 模型可视化工具 GGUF Visualizer 1. GGUF Visualizer for VS Code (gguf-viz)1.1. Features1.2. Extension Settings References GGUF Visualizer https://marketplace.visualstudio.com/items?itemNameAgainstEntropy.gguf-viz 1. GGUF Visualizer for VS Code (g…

10,STL——list类

一&#xff0c;list类的介绍和使用 1&#xff0c;了解list类 1. &#xff09;list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. &#xff09;list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关…

Guilite字库工具

目录 前言 使用方法 离线字库解析 工具链接 前言 最近通过Qt写了一个Guilite字库工具&#xff0c;相比原始工具&#xff0c;主要有以下几个优点&#xff1a; &#xff08;1&#xff09;支持同时生成多套字库 &#xff08;2&#xff09;支持离线字库生成 &#xff08;3&a…

【C++】深入解析pop_back()方法及其应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是 pop_back()&#xff1f;定义与功能使用场景 &#x1f4af;深入解析代码示例基础示例分析示例代码分析 空字符串上的 pop_back() 调用错误示例错误原因分析 &#x1…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

IDEA中创建maven项目

1. IDEA中创建maven项目 在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境。如还未配置安装Maven的&#xff0c;请先下载安装。如何下载安装&#xff0c;可参考我另外篇文章&#xff1a;maven的下载与安装教程本篇教程是以创建基于servlet的JavaWeb项目为例子&…

MACPA:fMRI连接性分析的新工具

摘要 不同脑区的共同激活为它们之间的功能交互或连接提供了一个有价值的衡量指标。元分析连接模型(MACM)是一种经过充分验证的研究某一特定区域共激活模式的方法&#xff0c;该方法对基于任务的功能磁共振成像(task-fMRI)数据进行种子点(seed-based)元分析。虽然MACM是一种强大…

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…

【C】初阶数据结构1 -- 时间复杂度与空间复杂度

目录 1 数据结构 2 算法 3 复杂度 1&#xff09; 时间复杂度 2&#xff09; 空间复杂度 4 提升算法能力的两点建议 1&#xff09; 画图 2&#xff09; 多实践&#xff0c;多上手写代码 重点一 数据结构的定义 1 数据结构 数据结构是计算机存储、组织数据的…

TypeScript Jest 单元测试 搭建

NPM TypeScript 项目搭建 创建目录 mkdir mockprojectcd mockproject初始化NPM项目 npm init -y安装TypeScript npm i -D typescript使用VSCode 打开项目 创建TS配置文件tsconfig.json {"compilerOptions": {"target": "es5","module&…

一.项目课题 <基于TCP的文件传输协议实现>

客户端代码 需要cJSON.c文件和cJSON.h文件 在这里插入代码片#include "myheadth.h" #include "myfun.h"#define TIME 10 int sockfd; void heartbeat(int signum) {cJSON* root cJSON_CreateObject();cJSON_AddStringToObject(root,"request"…

C#调用OpenCvSharp实现图像的膨胀和腐蚀

图像膨胀和腐蚀操作属于图像处理中常用的形态学操作&#xff0c;其原理都是采用特定小矩形&#xff08;核矩形&#xff09;&#xff0c;将其中心位置与图像中的每个像素对齐后&#xff0c;对重合位置的像素执行特定处理后&#xff0c;将处理结果保存到中心位置对应的像素处&…

新活动平台建设历程与架构演进

01 前言 历时近两年的重新设计和迭代重构&#xff0c;用户技术中心的新活动平台建设bilibili活动中台终于落地完成&#xff01;并迎来了里程碑时刻 —— 接过新老迭代的历史交接棒&#xff0c;从内到外、从开发到搭建实现全面升级&#xff0c;开启了活动生产工业化新时代&#…

一个好用的C++数据库操作库:OTL

目录 1.简介 2.OTL库的核心类 3.OTL使用 4.使用OTL时注意事项 4.1.多线程初始化 4.2.OTL支持连接池 4.3.大字段的读取方式 4.4.指定数据库类型 4.5.异常处理 5.下载地址 6.总结 1.简介 OTL&#xff08;Oracle, ODBC and DB2-CLI Template Library&#xff09;是一个…

高级生化大纲

一&#xff0c;蛋白质化学&#xff1a; 蛋白质分离是生物化学和分子生物学研究中的一项基本技术&#xff0c;用于根据蛋白质的物理和化学特性将其从混合物中分离出来。 1. 离心分离法 离心分离法利用离心力来分离不同质量或密度的颗粒和分子。 差速离心&#xff1a;通过逐…

linux网络 | http结尾、理解长连接短链接与cookie

前言&#xff1a;本节是http章节的最后一部分&#xff0c;主要解释一些小概念。讲解到了HTTP的方法&#xff0c;表单&#xff0c; 重定向等等。 现在废话不多说&#xff0c; 开始我们的学习吧。 ps&#xff1a;本节内容都是概念&#xff0c; 知道就行&#xff0c; 友友们放心观…

金融项目实战 03|JMeter脚本实现手工接口测试

目录 一、环境说明 1、项目环境搭建 2、Mock说明 二、构造测试数据 1、通过系统页面构造 2、通过接口构造 3、通过数据库构造【推荐】 4、案例&#xff1a;构造借款业务数据 三、JMeter执行接口测试用例 1、获取图片验证码、获取短信验证码 2、注册脚本 3、登录脚本…

点赞系统设计(微服务)

点赞业务是一个常见的社交功能&#xff0c;它允许用户对其他用户的内容&#xff08;如帖子、评论、图片等&#xff09;表示喜欢或支持。在设计点赞业务时&#xff0c;需要考虑以下几个方面&#xff1a; 一、业务需求 点赞业务需要满足以下特性&#xff1a; 通用&#xff1a;…