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

STM32学习记录之EXTI

EXTI简介

EXTI(Extern Interrupt)外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件出发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

通道数:16个GPIO Pin,外部PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

流程:GPIO->AFIO->EXTI->NVIC->CPU


初始化配置模板

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_x;//x=(0~15)选中多个端口用"|"操作 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIO端口 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSourcex);//配置AFIO x=(0~15)要和GPIO选中的端口对应 //GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);多个AFIO端口不能用"|"操作 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Linex;//这里可以用"|"操作 EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//选择中断触发或事件触发 这里选择中断触发 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式 这里选择下降沿触发 EXTI_Init(&EXTI_InitStructure);//初始化EXIT 与初始化GPIO类似 注意要对应起来 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_y);//配置优先级分组 y=(0~3) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//指定中断通道开启或关闭 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定中断通道使能还是失能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//指定抢占优先级 如果只有一个外部中断 则随意设置 但要注意范围不能超过配置优先级分组的限制范围 见表1 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//指定响应优先级 同上 NVIC_Init(&NVIC_InitStructure);//初始化NVIC /*若上面有两个端口都触发外部中断 则下面代码要写两次分别对应两个端口 NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//指定中断通道开启或关闭 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定中断通道使能还是失能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//指定抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//指定响应优先级 NVIC_Init(&NVIC_InitStructure);//配置NVIC */

结构体 参数EXTI_InitStructure.EXTI_Trigger选择边缘触发方式有以下三种选择

EXTI_Trigger_Rising(上升沿触发)

EXTI_Trigger_Falling(下降沿触发)

EXTI_Trigger_Rising_Falling(双边沿触发)


EXTI中断函数

去启动文件里的startup_stm32f10x_md.s文件找到函数名为EXTIx_IRQHandler的中断函数x与选中的端口对应(STM32的10到15号端口是共用的一个中断函数 EXTI15_10_IRQHandler)

如果我们选中12号端口作为外部中断源,下面是代码示例

void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line12)==SET)//查看EXIT12的中断标志位是否为1 { EXTI_ClearITPendingBit(EXTI_Line12);//清除中断标志位 } }

其中中断标志位要由软件清零


常用函数

EXTI_GetITStatus(EXTI_Linex);

x为选中的引脚 返回SET或RESET 该函数用于判断中断标志位是否为1(SET=1,RESET=0)为1则表示触发了中断

EXTI_ClearITPendingBit(EXTI_Linex);

清除中断标志位

http://www.jsqmd.com/news/1318226/

相关文章:

  • 从零构建2D游戏引擎:C#与OpenTK实战指南
  • 2026澳大利亚留学机构哪家好?本科硕士申请家庭更值得重点比较的十家机构 - 环球新视野
  • 前沿技术借鉴研讨-2026.7.30(妊娠自杀未遂风险的性别差异/妊娠期高血压共病风险)
  • 从单机到高可用集群:VMware ESXi+vCenter企业级虚拟化实战部署指南
  • Houdini KineFX 程序化角色绑定与动画实战指南
  • 2026 论文AI率助手横向对比:真实体验分享,毕业党生存手册
  • Python薪资飙到200万,2025年不学它等于跟钱过不去
  • FreeRTOS死机排查:从栈溢出到优先级反转的嵌入式系统稳定性实战
  • 警惕隐蔽“跟踪狂”:Chrome 同步功能正沦为黑客与偷窥者的窃听利器
  • 实测MiniMax M3智能体:如何为你的Obsidian知识库装上AI大脑
  • 遗传算法优化农业水资源调度的Matlab实现
  • 2026 年现阶段,青岛比较好的耐烧碱防腐涂料厂家哪家好,你家化工设备的“隐形保护伞”,居然能扛住高浓度烧碱的反复腐蚀?它的核心配方藏着你不知道的门道。-万利兴防腐涂料 - 企业推荐管【认证】
  • Galgame可视化编辑器实战:从节点化剧情到多分支游戏开发
  • OpenStack核心架构与生产环境部署实战指南
  • 第四篇:Redis 的 Key-Value 模型到底是什么?Key 应该怎么设计?
  • Langchain4j分布式链路监控实战:从原理到落地
  • 构建稳定AI角色:结构化提示词与角色扮演工程实践
  • FPGA软核开发实战:Nios II与自定义IP集成及ModelSim仿真全流程
  • 地铁隧道昏暗环境怎么用AR做设备巡检
  • 2026年绵阳电梯安装公司怎么选?本地全链条服务能力观察|公司推荐 - 优质品牌商家
  • 彻底解决Windows软件运行库缺失问题:从VC++ 2005到2022全解析
  • RHCSA 第六天学习笔记
  • MATLAB实现三相不平衡潮流计算的前推回代法
  • Spring AOP与AspectJ全面对比:原理、性能与应用场景
  • SpringBoot宠物服务平台架构设计与开发实践
  • 社团协作契约:结构化文档设计与实践指南
  • ECM与MEMS麦克风选型指南:从原理到实战避坑
  • 2026年达州少儿零基础舞蹈学习机构推荐指南:如何为孩子选择靠谱的艺术启蒙课堂? - 优质品牌商家
  • 超表面技术:从原理到应用的纳米光学革命
  • 基于SwiftUI与Python混合架构的Mac端AI音频工具开发实战