单片机
返回首页

STM32F1笔记(五)外部中断EXTI

2022-05-26 来源:eefocus

STM32的每个IO都可以作为外部中断的中断输入口。


STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为,每个中断/事件都有独立的触发和屏蔽设置。


STM32F103的19个外部中断为:


EXTI线0~15:对应外部IO口的输入中断。


EXTI线16:连接到PVD输出。(Programmable Votage Detector 可编程电压监测器。连到EXTI的电源电压检测(PVD)中断)


EXTI线17:连接到RTC闹钟事件。


EXTI线18:连接到USB唤醒事件。


STM32供IO口使用的中断线只有16个,而STM32的IO口远超16个。


所以STM32的GPIOx.0~GPIOX.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。


以线0为例,对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。


从《STM32中文参考手册》里可以看到映像,如下图:

但是中断线每次只能连接到1个IO口上,需要通过配置来指定中断线配置到哪个GPIO上。


在标准函数库中,该配置函数为:


/**

  * @brief  Selects the GPIO pin used as EXTI Line.

  * @param  GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.

  *   This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).

  * @param  GPIO_PinSource: specifies the EXTI line to be configured.

  *   This parameter can be GPIO_PinSourcex where x can be (0..15).

  * @retval None

  */

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

配置示例:


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);

GPIO_PinSource2即为EXTI2的线,在库里定义命名为EXTI_Line2。


EXTI_Line2相关配置如下:


EXTI_InitTypeDef EXTI_InitStructure;

 

EXTI_InitStructure.EXTI_Line = EXTI_Line2;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

接着需要配置中断的优先级:


NVIC_InitTypeDef NVIC_InitStructure;

 

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

配置结束后就要编写中断服务函数。


需要注意的是,中断线0~4每个中断线各自对应一个中断服务函数


EXPORT  EXTI0_IRQHandler           [WEAK]

EXPORT  EXTI1_IRQHandler           [WEAK]

EXPORT  EXTI2_IRQHandler           [WEAK]

EXPORT  EXTI3_IRQHandler           [WEAK]

EXPORT  EXTI4_IRQHandler           [WEAK]

中断线5~9共用一个中断服务函数


EXPORT  EXTI9_5_IRQHandler         [WEAK]

中断线10~15共用一个中断服务函数


EXPORT  EXTI15_10_IRQHandler       [WEAK]

在中断服务函数里,经常需要使用两个函数。


1、判断某个中断线上的中断是否发生(即相关标志位是否置位);


2、清除某个中断线上的中断标志位。


示例:


void EXTI2_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line2) != RESET)

    {    

        ...

        

        EXTI_ClearITPendingBit(EXTI_Line2);

    }

}


除了EXTI_GetITStatus之外函数库还提供了EXTI_GetFlagStatus,两者的区别是EXTI_GetITStatus会先判断这种中断是否使能,使能了才去判断中断标志位,而EXTI_GetFlagStatus直接用来判断状态标志位。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章