STM32外部中断实验-EXTI
2021/4/9 18:59:30
本文主要是介绍STM32外部中断实验-EXTI,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
摘自:STM32外部中断实验-EXTI
作者:三速何时sub20
发布时间:2020-10-19 13:51:42
网址:https://blog.csdn.net/weixin_44234294/article/details/109154934
STM32 外部中断简介
STM32 的每个 IO 都可以作为外部中断
的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件
从上面可以看出,STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计,GPIO 的管教 GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。下面我们看看 GPIO 跟中断线的映射关系图:
中断触发方式
相应的触发方式
上升沿触发:数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间叫作上升沿。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。
下降沿触发:数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。 [1] 下降沿触发是当信号有下降沿时的开关动作,当电位由高变低而触发输出变化的就叫下降沿触发。也就是当测到的信号电位是从高到低也就是下降时就触发,叫做下降沿触发。
边沿触发:既可以上升触发也可以下降触发
上升沿触发 就是当电压从低变高时触发中断
下降沿触发 就是当电压从高变低时触发中断
外部中断常用库函数
- 设置IO口与中断线的映射关系
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); 1
- 初始化中断线、触发方式等
EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 1
- 判断中断线中断状态,是否发生
EXTI_GetITStatus(uint32_t EXTI_Line); 1
- 清楚中断线上的中断标志位
EXTI_ClearITPendingBit(uint32_t EXTI_Line); 1
外部中断的一般配置步骤
IO 口外部中断的一般步骤:
1初始化 IO 口为输入。
2开启 AFIO 时钟
3设置 IO 口与中断线的映射关系。
4初始化线上中断,设置触发条件等。 5)配置中断分组(NVIC),并使能中断。
6编写中断服务函数。
通过以上几个步骤的设置,我们就可以正常使用外部中断了。
具体函数:
- 初始化IO的输入
GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 1
- 开启IO口复用时钟
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 1
- 设置IO口与中断线的映射关系
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); 1
- 初始话线上中断,设置触发条件
EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 1
- 配置中断分组(NVIC),并使能中断
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) 1
- 编写中断服务函数
EXTI4_IRQHandler() 1
- 清除中断标志位
EXTI_ClearITPendingBit(uint32_t EXTI_Line); 1
按键硬件连接图
上面的KEY_UP刚刚相反设置成下拉输入
实验代码
外部中断初始化代码
开启复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启复用时钟 1
设置IO口与中断线的映射关系
/*这里用按键0(KEY0对应的IO口时PE4)为例*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); 12
初始化中断线、触发方式等
EXTI_InitTypeDef EXTI_InitTypeDefSture; EXTI_InitTypeDefSture.EXTI_Line = EXTI_Line4;//指定要配置的中断线PE4对应的时EXTI4 EXTI_InitTypeDefSture.EXTI_LineCmd = ENABLE;//使能 EXTI_InitTypeDefSture.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断 EXTI_InitTypeDefSture.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发方式(结合原理图) EXTI_Init(&EXTI_InitTypeDefSture); 123456
配置中断分组(NVIC),并使能中断
NVIC_InitTypeDef NVIC_InitStrue; NVIC_InitStrue.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 0x02;//根据主函数里面的设置 NVIC_InitStrue.NVIC_IRQChannelSubPriority = 0x02; NVIC_Init(&NVIC_InitStrue); 123456
中断服务函数
void EXTI4_IRQHandler(void) { delay_ms(200);//防抖 if(KEY0 == 0){//判断按键KEY0是否按下 LED0 = !LED0;//灯反转(亮变暗或者暗变亮) LED1 = !LED1; } EXTI_ClearITPendingBit(EXTI_Line4);// 清除中断标志位 }
exti.c
#include "exti.h" #include "key.h" #include "led.h" #include "delay.h" void EXTI_Init() { EXTI_InitTypeDef EXTI_InitTypeDefSture; NVIC_InitTypeDef NVIC_InitStrue; KEY_Init(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启复用时钟 /*设置IO口与中断线的映射关系*/ /*这里用按键0(KEY0对应的IO口时PE4)为例*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); /* 初始化中断线、触发方式等*/ EXTI_InitTypeDefSture.EXTI_Line = EXTI_Line4;//指定要配置的中断线PE4对应的时EXTI4 EXTI_InitTypeDefSture.EXTI_LineCmd = ENABLE;//使能 EXTI_InitTypeDefSture.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断 EXTI_InitTypeDefSture.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发方式(结合原理图) EXTI_Init(&EXTI_InitTypeDefSture); /*配置中断分组(NVIC),并使能中断*/ NVIC_InitStrue.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 0x02;//根据主函数里面的设置 NVIC_InitStrue.NVIC_IRQChannelSubPriority = 0x02; NVIC_Init(&NVIC_InitStrue); } void EXTI4_IRQHandler(void) { delay_ms(200);//防抖 if(KEY0 == 0){//判断按键KEY0是否按下 LED0 = !LED0;灯反转(亮变暗或者暗变亮) LED1 = !LED1; } EXTI_ClearITPendingBit(EXTI_Line4);// 清除中断标志位 } main.c ```c #include "stm32f10x.h" #include "exti.h" #include "led.h" #include "key.h" #include "delay.h" int main(void) { delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级 KEY_Init();//案件初始化 LED_Init();//灯初始化 EXTIX_Init();//外部中断初始化 LED0 = 0;//灯亮起 while(1); }
实验效果
上电后LED0亮着,当按下KEY0后,LED0熄灭LED1亮起,再次按下后LED0亮起哦,LED1熄灭。(其余按键均可设置相关操作)
想要整个工程文件可私聊
这篇关于STM32外部中断实验-EXTI的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-18Python编程入门:面向对象编程基础
- 2024-10-18数据结构入门指南:轻松掌握基础知识
- 2024-10-18数据库技术入门指南
- 2024-10-18初学者指南:轻松入门面向对象编程
- 2024-10-18数据结构入门教程:轻松掌握基础概念与应用
- 2024-10-18数据库学习:从入门到实践的简单教程
- 2024-10-18面向对象开发学习:初学者指南
- 2024-10-18软件工程学习:入门与初级教程
- 2024-10-18软件设计师考试大纲详解与备考指南
- 2024-10-18软考培训机构的选择与入门指南