#include "Key.h" #include "Delay.h" #include "bsp_usart.h" u8 flag = 0; /**------------------------------------------------------- * @函数名 KEY_INIT * @功能 按键初始化 * @返回值 无 ***------------------------------------------------------*/ void KEY_INIT() { KEY_GPIO_INIT(); KEY_NVIC_INIT(); } /**------------------------------------------------------- * @函数名 KEY_GPIO_INIT * @功能 按键GPIO初始化 * @返回值 无 ***------------------------------------------------------*/ void KEY_GPIO_INIT(){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(KEY_CLOCK, ENABLE); //使能对应端口时钟 GPIO_InitStructure.GPIO_Pin = KEY_Pin;//KEY_Pin GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入 GPIO_Init(KEY_PORT, &GPIO_InitStructure);//初始化key_GPIO } /**------------------------------------------------------- * @函数名 KEY_NVIC_INIT * @功能 按键按下时为低电平0 * @返回值 无 ***------------------------------------------------------*/ void KEY_NVIC_INIT() { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 初始化KEY按键为中断模式 */ /* Connect Button EXTI Line to Button GPIO Pin */ /* 将KEY按键对应的管脚连接到内部中断线 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟 //GPIOE.2 中断线以及中断初始化配置 下降沿触发 GPIO_EXTILineConfig(KEY_PORT_SOURCE,KEY_PIN_SOURCE); EXTI_InitStructure.EXTI_Line=KEY_EXIT_LINE; //KEY2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 /* Enable and set Button EXTI Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = KEY_NVIC_IRQChannel; //使能按键WK_UP所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); } /**------------------------------------------------------- * @函数名 EXTI3_IRQHandler * @功能 处理外部中断线3的中断,按键1中断处理函数 * @参数 无 * @返回值 无 ***------------------------------------------------------*/ void KEY_NVIC_Handler(void) /* Key 1 */ { if(EXTI_GetITStatus(KEY_EXIT_LINE) != RESET) { /* 延迟去抖 */ delay(150); if(KEY == 0) { /* 改变指示灯状态 */ flag = !flag; printf("\r\n开关状态改变为:%d\r\n",!flag); } /* 等待按键释放 */ while(KEY == 0); /* 延迟去抖 */ delay(150); /* Clear the EXTI Line 4 */ /* 清除中断挂起标志位,否则会被认为中断没有被处理而循环再次进入中断 */ EXTI_ClearITPendingBit(KEY_EXIT_LINE); } }