微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32F7用hal库操作按键输入及中断处理

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);
       
}

按键经典消抖代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top