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

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
P X 0(X 可为 A,B,C,D,E,F,G,H,I)
EXTI1
P X1 (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);     
	}  
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值