STM32 外部中断/事件控制器EXTI

本文详细介绍了EXTI(外部中断/事件控制器)的工作原理及其配置方法。包括如何通过边缘检测来识别输入信号的变化,以及如何配置GPIO作为输入线来产生中断或事件。此外,还提供了初始化GPIO和EXTI的具体步骤及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EXTIExternal interrupt/event controller)—外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都有一个边缘检测器,可以实现对输入信号的上升沿或下降沿检测。EXTI可以实现对每个中断/事件线进行单独的配置,可以单独配置为中断或者事件,以及触发事件的属性。


如下图所示,为EXTI的功能框图。EXTI有两个功能,一个是产生中断,一个是产生事件,下面我们将对这两个功能进行讲解。

1.中断产生

如上图所示,红色虚线指示的是一个产生中断的线路,最终流入到NVIC中断控制器内。

编号1是输入线,可以指定到任意的GPIO,也可以是一些外设事件,输入线一般是存在电平变化的信号。

编号2是边缘检测电路,用来检测输入线的信号是否存在指定的电平变化,如上升沿、下降沿或任意两者都可,由EXTI_RTSR EXTI_FTSR两个寄存器设置检测哪些电平变化过程。

编号3是一个或门,输入信号来自边沿检测电路,另外一个信号来自软件中断事件寄存器(EXTI_SWIER)。我们可以从软件或硬件产生中断/事件。

编号4是一个与门,编号3电路产生信号且中断屏蔽寄存器(EXTI_IMR)开启后,出书信号到NVIC中

2.事件产生

编号7是脉冲发生器电路,线路6产生信号1时本线路产生一个脉冲信号,该脉冲信号可以给其他外设电路使用,比如定时器TIM、ADC等等。

 

产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,属于软件级别的;而产生事件目的就是传输一个脉冲信号给其他外设使用,属于电路级的传输,属于硬件级的。


  • 中断事件线

EXTI有20个中断/事件线,每个GPIO都可以被设置成输入线

中断/事件线输入源
EXTI0
PX0(X 可为 A,B,C,D,E,F,G,H,I)
EXTI1
PX1(X 可为 A,B,C,D,E,F,G,H,I)
EXTI2PX2(X 可为 A,B,C,D,E,F,G,H,I)
EXTI3PX3(X 可为 A,B,C,D,E,F,G,H,I)
EXTI4PX4(X 可为 A,B,C,D,E,F,G,H,I)
EXTI5PX5(X 可为 A,B,C,D,E,F,G,H,I)
EXTI6PX6(X 可为 A,B,C,D,E,F,G,H,I)
EXTI7PX7(X 可为 A,B,C,D,E,F,G,H,I)
EXTI8PX8(X 可为 A,B,C,D,E,F,G,H,I)
EXTI9PX9(X 可为 A,B,C,D,E,F,G,H,I)
EXTI10PX10(X 可为 A,B,C,D,E,F,G,H,I)
EXTI11PX11(X 可为 A,B,C,D,E,F,G,H,I)
EXTI12PX12(X 可为 A,B,C,D,E,F,G,H,I)
EXTI13PX13(X 可为 A,B,C,D,E,F,G,H,I)
EXTI14PX14(X 可为 A,B,C,D,E,F,G,H,I)
EXTI15PX15(X 可为 A,B,C,D,E,F,G,H,I)
EXTI16
PVD 输出
EXTI17
RTC 闹钟事件
EXTI18
USB 唤醒事件
EXTI19
以太网唤醒事件(只适用互联型)
  • EXTI初始化

HAL库函数的EXTI初始化非常简单,配置好IO口的模式,然后配置中断源、中断优先级、使能中断

1) HAL_NVIC_SetPriority:该函数负责 EXTI 中断/事件线选择,可选 EXTI0 至 EXTI25,配置优先级。

2) HAL_NVIC_EnableIRQ:该函数负责控制使能中断。

  • 编程要点

1) 初始化用来产生中断的 GPIO

#define KEY1_INT_GPIO_PORT                GPIOA
#define KEY1_INT_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE();
#define KEY1_INT_GPIO_PIN                 GPIO_PIN_0
#define KEY1_INT_EXTI_IRQ                 EXTI0_IRQn
#define KEY1_IRQHandler                   EXTI0_IRQHandler

2) 初始化 EXTI,配置 NVIC

 /**
  * @brief  配置 PA0 为线中断口,并设置中断优先级
  * @param  无
  * @retval 无
  */
void EXTI_Key_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; 

    /*开启按键GPIO口的时钟*/
    KEY1_INT_GPIO_CLK_ENABLE();
    KEY2_INT_GPIO_CLK_ENABLE();

    /* 选择按键1的引脚 */ 
    GPIO_InitStructure.Pin = KEY1_INT_GPIO_PIN;
    /* 设置引脚为输入模式 */ 
    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;	    		
    /* 设置引脚不上拉也不下拉 */
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    /* 使用上面的结构体初始化按键 */
    HAL_GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); 

    /* 配置 EXTI 中断源 到key1 引脚、配置中断优先级*/
    HAL_NVIC_SetPriority(KEY1_INT_EXTI_IRQ, 0, 0);
    /* 使能中断 */
    HAL_NVIC_EnableIRQ(KEY1_INT_EXTI_IRQ);
}

3) 编写中断服务函数;

void KEY1_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
	if(__HAL_GPIO_EXTI_GET_IT(KEY1_INT_GPIO_PIN) != RESET) 
	{
		// LED1 取反		
		LED1_TOGGLE;
    //清除中断标志位
		__HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN);     
	}  
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值