99 lines
2.9 KiB
C
99 lines
2.9 KiB
C
#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);
|
||
}
|
||
}
|