×
单片机 > 单片机程序设计 > 详情

嵌入式stm32学习:外部中断

发布时间:2020-05-30 发布时间:
|

bsp_exti.h


#ifndef __EXTI_H

#define __EXTI_H


#include "stm32f4xx.h"


//引脚定义

/*******************************************************/

#define KEY1_INT_GPIO_PORT                GPIOA

#define KEY1_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOA

#define KEY1_INT_GPIO_PIN                 GPIO_Pin_0

#define KEY1_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOA

#define KEY1_INT_EXTI_PINSOURCE           EXTI_PinSource0

#define KEY1_INT_EXTI_LINE                EXTI_Line0

#define KEY1_INT_EXTI_IRQ                 EXTI0_IRQn


#define KEY1_IRQHandler                   EXTI0_IRQHandler


#define KEY2_INT_GPIO_PORT                GPIOC

#define KEY2_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOC

#define KEY2_INT_GPIO_PIN                 GPIO_Pin_13

#define KEY2_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOC

#define KEY2_INT_EXTI_PINSOURCE           EXTI_PinSource13

#define KEY2_INT_EXTI_LINE                EXTI_Line13

#define KEY2_INT_EXTI_IRQ                 EXTI15_10_IRQn


#define KEY2_IRQHandler                   EXTI15_10_IRQHandler


/*******************************************************/


void EXTI_Key_Config(void); //中断按键配置


#endif /* __EXTI_H */


/*********************************************END OF FILE**********************/


bsp.exti.c


#include "./key/bsp_exti.h"


 /**

  * 配置嵌套向量中断控制器

  */

static void NVIC_Configuration(void)

{

  /* 创建一个NVIC中断控制器 */

  NVIC_InitTypeDef NVIC_InitStructure;


  /* 配置NVIC为优先级组1 */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


  /* 配置抢占优先级:1 */

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  /* 配置子优先级:1 */

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  /* 使能中断通道 */

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


  /* 配置中断源:按键1 */

  NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;

  NVIC_Init(&NVIC_InitStructure);


  /* 配置中断源:按键2 */  

  NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;

  NVIC_Init(&NVIC_InitStructure);

}


 /**

  * 配置PA0为线中断口,并设置中断优先级

  */

void EXTI_Key_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure; 

    EXTI_InitTypeDef EXTI_InitStructure;


  /* 开启按键GPIO的时钟 */

  RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);


  /* 是能SYSCFG时钟 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


  /* 配置NVIC */

  NVIC_Configuration();


  /* 选择按键1的引脚 */ 

  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;

  /* 设置引脚为输入模式 */ 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;              

  /* 设置引脚不上拉也不下拉 */

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  /* 使用上面的结构体初始化按键1 */

  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); 


  /* 连接EXIT中断源到key1引脚 */

  SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);


  /* 选择EXIT中断源 */

  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;

  /* 中断模式 */

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  /* 下降沿触发 */

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  

  /* 使能中断/事件线 */

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  /* 使用上面结构体初始化中断 */

  EXTI_Init(&EXTI_InitStructure);


  /* 选择按键2的引脚 */ 

  GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;  

  /* 使用上面的结构体初始化按键2 */

  GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);      


  /* 连接EXIT中断源到key2引脚 */

  SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);


  /* 选择EXIT中断源 */

  EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  /* 上升沿触发 */

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法