当前位置: 首页 > news >正文

中断-NVIC与EXTI外设详解(超全面)

在嵌入式系统中,中断机制是处理异步事件的重要手段。STM32微控制器采用嵌套向量中断控制器(NVIC)和外部中断/事件控制器(EXTI)来实现中断管理。本文将详细介绍NVIC和EXTI的工作原理、配置步骤以及编程实践。

NVIC(嵌套向量中断控制器)

NVIC是STM32中断系统的心脏,负责管理中断优先级、中断向量表和中断处理。它支持多个中断源和灵活的优先级管理。

工作原理

NVIC允许开发者为每个中断源分配不同的优先级。中断优先级分为抢占优先级和子优先级,确保了高优先级的中断可以打断低优先级的中断执行。

配置步骤

  1. 配置中断优先级分组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    

    这行代码配置了NVIC的优先级分组,决定了抢占优先级和子优先级的位数。

  2. 设置中断线优先级

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    

    这段代码初始化了NVIC,设置了中断线的抢占优先级和子优先级,并使能了中断线。

EXTI(外部中断/事件控制器)

EXTI是STM32单片机上的一个外设,用于响应外部事件或中断请求。它可以监测指定GPIO口的电平信号变化,并在检测到指定条件时,向NVIC发出中断申请。

工作原理

EXTI可以配置为响应上升沿、下降沿、双边沿或软件触发的信号变化。当配置的边沿事件发生时,EXTI会向NVIC发送中断请求。

配置步骤

  1. 初始化GPIO为输入模式

    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
  2. 配置EXTI线

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
  3. 编写中断服务函数

    void EXTI0_IRQHandler(void)
    {if (EXTI_GetITStatus(EXTI_Line0) != RESET){EXTI_ClearITPendingBit(EXTI_Line0);// 处理中断事件}
    }
    

编程实践

在实际应用中,可以通过配置NVIC和EXTI来实现对外部事件的快速响应。例如,可以使用EXTI来检测按钮按下事件,并在中断服务函数中执行相应的操作,如翻转LED状态。

通过上述配置和编程步骤,可以实现STM32的中断控制和外部中断事件处理。这为嵌入式系统设计提供了强大的异步事件处理能力,确保了系统的响应性和可靠性。[NVIC与EXTI外设详解-CSDN博客]

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

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

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

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

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

点击领取更多详细资料


http://www.mrgr.cn/news/42909.html

相关文章:

  • 用 Delphi 做了一个简单的 CMS
  • 深度学习:基于MindSpore实现CycleGAN壁画修复
  • 认知杂谈98《抵御噪声干扰》
  • Robot Operating System——占据栅格地图(occupancy grid map)
  • valgrind 单例模式的自动释放(多线程)
  • 《计算机原理与系统结构》学习系列——计算机的算数运算(下)
  • SynchronousQueue 的 常用场景及使用示例
  • 【AUTOSAR 基础软件】COM模块详解(通信)
  • 信息安全工程师(33)访问控制概述
  • 【越学学糊涂的Linux系统】(5)shell命令以及运行原理|权限问题
  • 【我的 PWN 学习手札】tcache stash unlink
  • NVIDIA NVLink-C2C
  • 【每天学个新注解】Day 15 Lombok注解简解(十四)—@UtilityClass、@Helper
  • LC108-将有序数组转化为二叉搜索树(二叉平衡树)
  • Pikachu-Unsafe FileUpload-客户端check
  • 《西北师范大学学报 (自然科学版)》
  • 编程基础:详解 C++ 中的 `std::sort` 函数
  • 2024年7月大众点评全国火锅前百名城市分析
  • Android 13.0 系统内存优化之修改dalvik虚拟机的内存参数
  • 网络基础知识笔记(四)