STM32 外部中断详解(原理+配置代码)

本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断

1 前言

打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。

2 STM32的外部中断

下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器;

  • 中断屏蔽寄存器(EXTI_IMR)
  • 事件屏蔽寄存器(EXTI_EMR)
  • 上升沿触发选择寄存器(EXTI_RTSR)
  • 下降沿触发选择寄存器(EXTI_FTSR)
  • 软件中断事件寄存器(EXTI_SWIER)
  • 挂起寄存器(EXTI_PR)
    在这里插入图片描述
    EXTI支持配置20个中断和事件屏蔽位;
  • GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0EXTI_Line15
  • EXTI_Line16 连接到PVD输出 ;
  • EXTI_Line17连接到RTC闹钟事件;
  • EXTI_Line18连接到USB唤醒事件;
  • EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

GPIO的映射关系图如下所示;
在这里插入图片描述

3 中断服务函数的映射关系

GPIOIRQnIRQHandler
GPIO_Pin0EXTI0_IRQnEXTI0_IRQHandler
GPIO_Pin1EXTI1_IRQnEXTI1_IRQHandler
GPIO_Pin2EXTI2_IRQnEXTI2_IRQHandler
GPIO_Pin3EXTI3_IRQnEXTI3_IRQHandler
GPIO_Pin4EXTI4_IRQnEXTI4_IRQHandler
GPIO_Pin5 — GPIO_Pin9EXTI9_5_IRQnEXTI9_5_IRQHandler
GPIO_Pin10 — GPIO_Pin15EXTI15_10_IRQnEXTI15_10_IRQHandler

4 外部中断的配置

宏定义,抽象一下接口,方便后面修改;

#define Z_GPIO_PIN    GPIO_Pin_5
#define Z_GPIO_PORT   GPIOE
#define Z_PortSource  GPIO_PortSourceGPIOE
#define Z_PinSource   GPIO_PinSource5
#define Z_Line        EXTI_Line5
#define Z_IRQ         EXTI9_5_IRQn

GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示;
在这里插入图片描述GPIO的配置代码如下;

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);

不要忘记外设总线时钟的配置;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
 		RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
    	RCC_APB2Periph_GPIOG, ENABLE);

EXTI的配置,EXTI_Trigger这里支持三种模式;

  • EXTI_Trigger_Rising 上升沿触发;
  • EXTI_Trigger_Falling 下降沿触发;
  • EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发;
GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);

EXTI_InitStructure.EXTI_Line = Z_Line; 
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 	//下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC的配置

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

中断服务函数

void EXTI9_5_IRQHandler(void)
{
     //中断服务函数
}

以上就完成了检测下降沿信号的GPIOE5的外部中断;
也参考官方DEMO
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\EXTI\EXTI_Config

5 寄存器的操作

以下摘自**《STM32参考手册》**
产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。
产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在
中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。

  • 中断屏蔽寄存器(EXTI_IMR)
  • 事件屏蔽寄存器(EXTI_EMR)
  • 上升沿触发选择寄存器(EXTI_RTSR)
  • 下降沿触发选择寄存器(EXTI_FTSR)
  • 软件中断事件寄存器(EXTI_SWIER)
  • 挂起寄存器(EXTI_PR)

IMR如下图所示,其他几个类似;
在这里插入图片描述

5.1 硬件中断选择

通过下面的过程来配置20个线路做为中断源:

  • 配置20个中断线的屏蔽位(EXTI_IMR)
  • 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
  • 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

5.2 硬件事件选择

通过下面的过程,可以配置20个线路为事件源

  • 配置20个事件线的屏蔽位(EXTI_EMR)
  • 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)

5.3 软件中断/事件的选择

20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

  • 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
  • 设置软件中断寄存器的请求位(EXTI_SWIER)

6 总结

本文参考stm32手册对于外部中断的概念以及配置进行了介绍,本人能力有限,难免存在错误和纰漏,请大佬不吝赐教。

  • 80
    点赞
  • 345
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
STM32中,我们可以使用外部中断来处理按键事件。下面是一个示例代码,展示了如何在STM32中使用外部中断处理按键事件。 首先,我们需要在stm32f10x_it.c文件中定义外部中断的中断服务函数,具体的函数名根据所使用的外部中断线来确定。例如,如果我们使用的是EXTI线0,那么中断服务函数的名字应该是EXTI0_IRQHandler。在这个函数中,我们可以编写处理按键事件的代码。 下面是一个示例代码,展示了如何在stm32f10x_it.c文件中编写外部中断的中断服务函数来处理按键事件: ``` void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 在这里编写按键按下的处理代码 // 例如,可以控制LED的亮灭状态反转 LED_Toggle(); EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 在这个示例中,我们使用了EXTI_Line0作为外部中断线,并在按键按下时切换LED的状态。当按键按下时,中断服务函数会被触发,执行对应的处理代码。 需要注意的是,我们还需要在stm32f10x_it.c文件中的NVIC中配置外部中断的优先级和使能外部中断。 通过上述代码示例,我们可以实现按键外部中断的功能。在实际应用中,可以根据具体的需求和硬件连接,修改中断服务函数中的处理代码,实现相应的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32外部中断+按键](https://blog.csdn.net/qq_43940175/article/details/123034724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32—中断详解(配合按键中断代码代码亲测)](https://blog.csdn.net/qq_43743762/article/details/97272694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小麦大叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值