STM32F7用hal库操作按键输入及中断处理
时间:10-02
整理:3721RD
点击:
编写stm32f767编写IO口输入 ,读取按键值,并控制LED灯的亮灭
按键函数的初始化
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); //时钟使能
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化WK_UP
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_2;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOH,&GPIO_InitStruct); //初始化KEY0
// GPIO_InitStruct.Pin = GPIO_PIN_2;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// HAL_GPIO_Init(GPIOH,&GPIO_InitStruct); //初始化KEY1
GPIO_InitStruct.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct); //初始化KEY2
}
判断哪个按键被按下
u8 KEY_Scan(void)
{
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY_UP==1))
{
delay_ms(30);
if(KEY0==0) {while(!KEY0); return KEY0_PRES;}
else if(KEY1==0) {while(!KEY1); return KEY1_PRES;}
else if(KEY2==0) {while(!KEY2); return KEY2_PRES;}
else if(KEY_UP==1) {while(KEY_UP); return WKUP_PRES; }
}
else
return 0; //无按键按下
}
在这里我想说明的问题是上面延时去抖动函数,我第一次采用的是10ms,结果不是很理想,后来修改为30ms,
去抖动效果明显提高
上面函数可以很好的移植,只需要简单的修改函数就可以达到控制目的。
如果你想采用中断处理,你需要在初始化函数中加入中断优先级
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //使能外部中断0
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3); //使能外部中断5-10
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
再就可以通过HAL库中的函数调用 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
处理你想要处理的事件
在这里我是控制LED的亮灭
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static u8 led0state=0,led1state=0;
delay_ms(30); //按键去除抖动
switch(GPIO_Pin)
{
case GPIO_PIN_0:
led0state = 0;
led1state = 0;
break;
case GPIO_PIN_2:
led0state = 1;
led1state = 1;
break;
case GPIO_PIN_3:
led0state = !led0state;
led1state = !led1state;
break;
case GPIO_PIN_13:
led0state = 0;
led1state = !led1state;
break;
}
led0(led0state);
led1(led1state);
}
按键函数的初始化
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); //时钟使能
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化WK_UP
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_2;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOH,&GPIO_InitStruct); //初始化KEY0
// GPIO_InitStruct.Pin = GPIO_PIN_2;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// HAL_GPIO_Init(GPIOH,&GPIO_InitStruct); //初始化KEY1
GPIO_InitStruct.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct); //初始化KEY2
}
判断哪个按键被按下
u8 KEY_Scan(void)
{
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY_UP==1))
{
delay_ms(30);
if(KEY0==0) {while(!KEY0); return KEY0_PRES;}
else if(KEY1==0) {while(!KEY1); return KEY1_PRES;}
else if(KEY2==0) {while(!KEY2); return KEY2_PRES;}
else if(KEY_UP==1) {while(KEY_UP); return WKUP_PRES; }
}
else
return 0; //无按键按下
}
在这里我想说明的问题是上面延时去抖动函数,我第一次采用的是10ms,结果不是很理想,后来修改为30ms,
去抖动效果明显提高
上面函数可以很好的移植,只需要简单的修改函数就可以达到控制目的。
如果你想采用中断处理,你需要在初始化函数中加入中断优先级
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //使能外部中断0
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3); //使能外部中断5-10
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
再就可以通过HAL库中的函数调用 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
处理你想要处理的事件
在这里我是控制LED的亮灭
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static u8 led0state=0,led1state=0;
delay_ms(30); //按键去除抖动
switch(GPIO_Pin)
{
case GPIO_PIN_0:
led0state = 0;
led1state = 0;
break;
case GPIO_PIN_2:
led0state = 1;
led1state = 1;
break;
case GPIO_PIN_3:
led0state = !led0state;
led1state = !led1state;
break;
case GPIO_PIN_13:
led0state = 0;
led1state = !led1state;
break;
}
led0(led0state);
led1(led1state);
}
按键经典消抖代码