-
#include "bsp_key.h"
-
-
-
/**********按键与中断线对应关系******
-
| |
-
key1 = PA0 | LED1 = PC1 |
-
key2 = PC13 | LED2 = PC2 |
-
key3 = PA2 | LED3 = PC3 |
-
key4 = PB5 | LED4 = PC4 |
-
| |
-
************************************/
-
-
-
-
-
-
void Key_Exit_Config(void)
-
{
-
//结构体变量声明
-
GPIO_InitTypeDef GPIO_InitStructure;
-
EXTI_InitTypeDef EXTI_InitStructure;
-
NVIC_InitTypeDef NVIC_InitStructure;
-
-
/********************************************
-
使能I/O口时钟,选择GPIOA,GPIOB,GPIOC三个口
-
开启SYSCFG时钟
-
********************************************/
-
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB |
-
RCC_AHB1Periph_GPIOA, ENABLE);
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
-
-
-
-
/*****************************
-
初始化I/O口为输入浮空模式,
-
根据指定的参数初始化GPIOX外设
-
*****************************/
-
-
//浮空模式
-
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13); //PC13
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
-
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
-
//根据指定的参数初始化GPIOX外设
-
GPIO_Init(GPIOC, &GPIO_InitStructure);
-
-
-
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_5); //PB5
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
-
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
-
GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_2); //PA0和PA2
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
-
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
-
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
-
-
-
/***************************
-
配置GPIO口与中断线的映射关系
-
相当于把GPIOx口与中断线连起来
-
***************************/
-
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);
-
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5);
-
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);
-
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
-
-
-
/**************************
-
初始化中断线
-
配置触发条件,模式等参数
-
**************************/
-
-
EXTI_InitStructure.EXTI_Line = (EXTI_Line13 | EXTI_Line5 |
-
EXTI_Line0 | 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);
-
-
-
/*************************
-
配置中断分组,并使能中断
-
配置中断通道,中断优先级等参数
-
**************************/
-
-
//PC13
-
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键外部中断通道
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E; //抢占优先级0x0e
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E; //相应优先级0x0e
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
-
NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化
-
-
//PB5
-
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //IRQ指的是中断请求
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E;
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
NVIC_Init(&NVIC_InitStructure);
-
-
//PA0
-
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //IRQ指的是中断请求
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E;
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
NVIC_Init(&NVIC_InitStructure);
-
-
//PA2
-
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //IRQ指的是中断请求
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0E;
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
NVIC_Init(&NVIC_InitStructure);
-
-
}
-
-
-
/***********中断服务函数*********************
-
不同中断线对应不同中断函数,可根据需要写多个
-
中断函数
-
********************************************/
-
-
-
void EXTI0_IRQHandler(void)
-
{
-
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
-
{
-
//PA0,KEY1按下
-
GPIO_ToggleBits(GPIOC,GPIO_Pin_1);
-
EXTI_ClearITPendingBit(EXTI_Line0);
-
printf("PA0 中断\r\n");
-
}
-
}
-
-
void EXTI15_10_IRQHandler(void)
-
{
-
/* PC13, K2按下*/
-
if (EXTI_GetITStatus(EXTI_Line13) != RESET)
-
{
-
GPIO_ToggleBits(GPIOC,GPIO_Pin_2);
-
EXTI_ClearITPendingBit(EXTI_Line13);
-
printf("PC13 中断\r\n");
-
}
-
}
-
-
void EXTI2_IRQHandler(void)
-
{
-
//PA2,K3按下
-
if (EXTI_GetITStatus(EXTI_Line2) != RESET)
-
{
-
GPIO_ToggleBits(GPIOC,GPIO_Pin_3);
-
EXTI_ClearITPendingBit(EXTI_Line2);
-
printf("PA2 中断\r\n");
-
}
-
}
-
-
void EXTI9_5_IRQHandler(void)
-
{
-
//PB5,K4按下
-
if (EXTI_GetITStatus(EXTI_Line5) != RESET)
-
{
-
GPIO_ToggleBits(GPIOC,GPIO_Pin_4);
-
EXTI_ClearITPendingBit(EXTI_Line5);
-
printf("PB5中断\r\n");
-
}
-
}