《蓝桥杯备赛》STM32外部中断void GPIO_EXTILineConfig()

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

1.STM32中断控制器支持19个外部中断/事件请求
  • 线0-15:外部IO口输入中断
  • 线16:连接到PVD输出
  • 线17:连接到RTC闹钟事件
  • 线18:连接到USB唤醒事件

(1)很多人误认为STM32只支持16个外部中断/事件请求,因为他们走入了 “GPIOA有PA0~PA15共16个,所以只支持16个外部中断/事件请求” 思维误区!其实还有三个平时较少用到的。
(2)在STM32库函数程序中,并没有单独的EXTI5_IRQHandler,同理EXTI6,EXTI7,EXTI8…也没有!,如下图:

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

此外切记,其中断服务函数名已经定义好,参见startup_stm32f10x_xx.s,不能用户自己定义,它关系到进入中断服务函数的入口地址!

2.三种中断触发方式

上升沿触发
下降沿触发
双边沿触发(既能上升沿触发,又能下降沿触发)

但至于采用哪种?,应根据具体问题具体分析原则,查看硬件原理图:
在这里插入图片描述
如上图所示,按键没按下之前,K1处于3V3,为高电平;按键按下后接GND为低电平。用外部中断的方式,“使得按键按下后完成一些事情”,应采用下降沿触发方式。

3.外部中断的程序模板
1初始化IO口为输入。
 
       GPIO_Init();
 
2开启IO口复用时钟。
       /* Enable AFIO clock */
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
 
3设置IO口与中断线的映射关系。
     /* Connect EXTIx Line to PAx pin */
       void GPIO_EXTILineConfig();
 
4初始化线上中断,设置触发条件等。
 
       EXTI_Init();
 
5配置中断分组(NVIC),并使能中断。
       NVIC_Init();
 
6编写中断服务函数。
      EXTIx_IRQHandler();
 
记得清除中断标志位 EXTI_ClearITPendingBit();
4.相关程序
#include "KEY.h"


void Key_Init()
{
  EXTI_InitTypeDef   EXTI_InitStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
	 /*PA0,PA8对应KEY1,KEY2*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
	 /*PB1,PB2对应KEY3,KEY4*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	  /* Enable AFIO clock */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  /* Connect EXTI0 and EXTI8 Line to PA0 and PA8 pin */
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
	
	  /* Configure EXTI0 和EXTI8  line */
 EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line8;
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_InitStructure);
		
		
 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
		
 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);				
}

void EXTI0_IRQHandler(void)
{  
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    /* Clear the  EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
    /*用户编写程序,按键按下是做什么事情?*/
	}

}

void EXTI9_5_IRQHandler(void)
{ 
  if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  {
    EXTI_ClearITPendingBit(EXTI_Line8);
   /*用户编写程序,按键按下是做什么事情?*/
  }

}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式历练者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值