exit.c
//按键1中断配置
void Exti_PA0_Init(void)
{
//库函数初始化步骤1:定义一个xxx_InitTypeDef类型的初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//☆☆☆使能GPIO A组时钟:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//☆☆☆使能SYSCFG时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//库函数初始化步骤2:根据使用要求,向这些初始化结构体的成员写入特定的控制参数
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //引脚0
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStruct);
//设置IO口与中断线的映射关系。PA0对应中断线0,详细看上图
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
EXTI_InitStruct.EXTI_Line = EXTI_Line0; //中断线0 (可变)
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
//可选为产生中断(EXTI_Mode_Interrupt)或者产生事件(EXTI_Mode_Event)
EXTI_InitStruct.EXTI_Trigger= EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStruct.EXTI_LineCmd= ENABLE; //中断线使能
//初始化线上中断,设置触发条件等。
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; //NVIC通道,在stm32f4xx.h可查看通道 (可变)
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
//配置中断分组(NVIC),并使能中断。
NVIC_Init(&NVIC_InitStruct);
}
//编写中断服务函数。这个函数不需要程序员在主函数调用,满足条件CPU自行调用的函数
void EXTI0_IRQHandler(void)
{
//判断中断标志是否为1 ☆☆☆消抖
if(EXTI_GetITStatus(EXTI_Line0)) //判断是EXTI0中断线进来的。一般用于防止例如EXTI5-9共用一个服务函数的情况
{
delay_ms(15);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
{
//变更灯状态
GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
}
// 清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
}
|