STM32学习心得--外部中断管理

本文介绍了STM32中如何配置外部中断来响应按键输入,以控制LED灯的亮灭。首先,通过GPIO初始化设置连接在PA0的KEY1和PC13的KEY2,配置为浮空输入。接着,设置EXTI结构体,选择中断模式和触发方式,分别为KEY1的上升沿中断和KEY2的下降沿中断。然后,配置NVIC以处理中断。最后,编写中断服务函数,根据中断线EXTI0和EXTI13分别响应按键事件。
摘要由CSDN通过智能技术生成

1.外部中断/事件管理框图

2. 外部中断函数编写--以按键控制LED为例

2.1初始化要连接的GPIO&初始化外部中断结构体

查阅指南者原理图,知道KEY1是在PA0,所以要连接在EXTI0,同理,对于连接在PC13的按键KEY2,应该连接在EXTI13。

void EXTI_Key_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	EXTI_InitTypeDef EXTI_InitStructure;

	/*开启按键GPIO口的时钟*/
	RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);
												
	/* 配置 NVIC 中断*/
	NVIC_Configuration();
	
/*--------------------------KEY1配置-----------------------------*/
	/* 选择按键用到的GPIO */	
  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
  
    初始化GPIO
    /* 配置为浮空输入 */
    /*浮空输入的意思是,其电平由外部电路决定*/	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);

	//初始化EXTI
    /* 选择EXTI的信号源 */
  GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); 
  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
	
	/* EXTI为中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 上升沿中断 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  /* 使能中断 */	
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
	
  /*--------------------------KEY2配置-----------------------------*/
	/* 选择按键用到的GPIO */	
  GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
  /* 配置为浮空输入 */	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);

	/* 选择EXTI的信号源 */
  GPIO_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE, KEY2_INT_EXTI_PINSOURCE); 
  EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
	
	/* EXTI为中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 下降沿中断 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  /* 使能中断 */	
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

supplement:外部中断结构体

typedef struct
{
  uint32_t EXTI_Line;              //用于产生中断/事件线          
   
  EXTIMode_TypeDef EXTI_Mode;      //事件/中断模式选择

  EXTITrigger_TypeDef EXTI_Trigger; //上升沿/下降沿触发选择,也可以是上升沿&下降沿都触发

  FunctionalState EXTI_LineCmd;    //对应中断屏蔽/事件屏蔽寄存器

}EXTI_InitTypeDef;

 需要注意的是,在选择哪个外部引脚作为中断/事件触发引脚时,其配置函数在“stm32f10x_gpio.h”中,其函数原型为

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

第一个参数配置GPIOA---GPIOG,第二个参数配置GPIO_PinSource0 -- GPIO_PinSource15 

2.2.初始化EXTI用于产生中断/事件

2.3.初始化NVIC,用于处理中断

注意,在编写初始化函数时,NVIC_IRQChannel的赋值尤为要注意。

在“stm32f10x.h”中查找。在编写大容量芯片时,中断线大于5时,并不在单独定义,而是[5..9]定义一个,[10..15]定义一个。 

2.4.编写中断服务函数

为便于管理,应统一写在stm32f10x_it.c文件中,但要注意,函数名并不是任意的,而要去“startup_stm32f10x_hd.s”中查找中断向量表

以中断线EXTI0为例,

同时也要注意,类比于上面,EXTI5之后也是公用一个函数名。

编写中断服务函数常用套路

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值