一、实验目的
KEY_UP控制DSO,DS1互斥点亮;KEY2控制DS0,按一次亮,再按一次灭;KEY1控制DS1,效果同KEY2;KEYO则同时控制DS0和DS1,按一次,他们的状态就翻转一次。
二、硬件连接
三、代码及分析
exti.c
#include"exti.h"
#include"key.h"
#include"led.h"
#include"delay.h"
#include"key.h"
u8 led0sta=1,led1sta=1; //LED0,LED1的当前状态 //LED0,LED1的当前状态
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_IT_RISING ; // 外部中断上升沿触发
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_13; //PC13
GPIO_Initure.Mode=GPIO_MODE_IT_FALLING; //外部中断下降沿触发
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3
HAL_GPIO_Init(GPIOH,&GPIO_Initure);
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线0中断通道
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //抢占优先级3,子优先级3
HAL_NVIC_EnableIRQ(EXTI2_IRQn); //使能中断线2中断通道
HAL_NVIC_SetPriority(EXTI0_IRQn,2,1); //抢占优先级3,子优先级3
HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能中断线3中断通道
HAL_NVIC_SetPriority(EXTI0_IRQn,2,2); //抢占优先级3,子优先级3
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); //使能中断线0中断通道
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3); //抢占优先级3,子优先级3
}
void EXTI0_IRQHandler (void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //调用公用中断处理函数
}
void EXTI2_IRQHandler (void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}
void EXTI3_IRQHandler (void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void EXTI15_10_IRQHandler (void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
delay_ms(100);
switch(GPIO_Pin)
{
case GPIO_PIN_0 : // WK_UP
if(WK_UP==1) //控制LED0,LED1互斥点亮
{
led1sta=!led1sta;
led0sta=!led1sta;
LED1(led1sta);
LED0(led0sta);
}
break ;
case GPIO_PIN_13 : //KEY2
if(KEY2==0) //控制LED0翻转
{
led0sta=!led0sta;
LED0(led0sta);
}
break;
case GPIO_PIN_2 : //KEY1
if(KEY1==0) //控制LED1翻转
{
led1sta=!led1sta;
LED1(led1sta);
};
break;
case GPIO_PIN_3 : //KEY0
if(KEY0==0) //同时控制LED0,LED1翻转
{
led1sta=!led1sta;
led0sta=!led0sta;
LED1(led1sta);
LED0(led0sta);
}
break;
}
}
在void EXTI_Init( ) 中调用HAL_GPIO_Init( ) 进行IO口的初始化,配置好中断线映射关系后,使能中断线,并设置中断优先级。
在void EXTI0_IRQHandler ( ) 中调用公用中断处理函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); 该函数会调用void HAL_GPIO_EXTI_Callback( ),我们只需要在它里面编写真正的控制逻辑就行了。