HAL库实现按键中断

key_exti.h

#ifndef _KEY_EXTI_H
#define _KEY_EXTI_H
#include "stm32f4xx.h"
#include "sys.h"

#define KEY_UP_GPIO_PORT GPIOA
#define KEY_UP_GPIO_PIN  GPIO_PIN_0

#define KEY0_GPIO_PORT   GPIOH
#define KEY0_GPIO_PIN    GPIO_PIN_3

#define KEY1_GPIO_PORT   GPIOH
#define KEY1_GPIO_PIN    GPIO_PIN_2

#define KEY2_GPIO_PORT   GPIOC
#define KEY2_GPIO_PIN    GPIO_PIN_13

#define KEY_UP HAL_GPIO_ReadPin(KEY_UP_GPIO_PORT,KEY_UP_GPIO_PIN)
#define KEY0   HAL_GPIO_ReadPin(KEY0_GPIO_PORT,KEY0_GPIO_PIN)
#define KEY1   HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)
#define KEY2   HAL_GPIO_ReadPin(KEY2_GPIO_PORT,KEY2_GPIO_PIN)

#define KEY_UP_PRE 0X01
#define KEY0_PRE   0x02
#define KEY1_PRE   0x03
#define KEY2_PRE   0x04

void KEY_EXTI_Init(void);

#endif

 key_exti.h

#include "key_exti.h"
#include "delay.h"
#include "led.h"

void KEY_EXTI_Init()
{
    GPIO_InitTypeDef KEY_EXTI_InitStruction;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    
    //KEY_UP
    KEY_EXTI_InitStruction.Pin=KEY_UP_GPIO_PIN;
    KEY_EXTI_InitStruction.Mode=GPIO_MODE_IT_RISING;
    KEY_EXTI_InitStruction.Pull=GPIO_PULLDOWN;
    KEY_EXTI_InitStruction.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
    HAL_GPIO_Init(KEY_UP_GPIO_PORT,&KEY_EXTI_InitStruction);
    //KEY0
    KEY_EXTI_InitStruction.Pin=KEY0_GPIO_PIN;
    KEY_EXTI_InitStruction.Mode=GPIO_MODE_IT_FALLING;
    KEY_EXTI_InitStruction.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(KEY0_GPIO_PORT,&KEY_EXTI_InitStruction);
    //KEY1
    KEY_EXTI_InitStruction.Pin=KEY0_GPIO_PIN;
    HAL_GPIO_Init(KEY0_GPIO_PORT,&KEY_EXTI_InitStruction);
    //KEY2
    KEY_EXTI_InitStruction.Pin=KEY0_GPIO_PIN;
    HAL_GPIO_Init(KEY2_GPIO_PORT,&KEY_EXTI_InitStruction);
    
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
    
    //KEY_UP
    HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    //KEY0
    HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(EXTI3_IRQn);
    //KEY1
    HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 2);
    HAL_NVIC_EnableIRQ(EXTI2_IRQn);
    //KEY2
    HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 3);
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

//KEY_UP
void EXTI0_IRQHander()
{
    HAL_GPIO_EXTI_Callback(KEY_UP_GPIO_PIN);
}
//KEY0
void EXTI1_IRQHander()
{
    HAL_GPIO_EXTI_Callback(KEY0_GPIO_PIN);
}
//KEY1
void EXTI2_IRQHander()
{
    HAL_GPIO_EXTI_Callback(KEY1_GPIO_PIN);
}
//KEY2
void EXTI15_10_IRQHander()
{
    HAL_GPIO_EXTI_Callback(KEY2_GPIO_PIN);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_PIN)
{
    delay_ms(10);
    switch(GPIO_PIN)
    {
        case KEY_UP_GPIO_PIN: LED_RED_ON;    break; 
        case KEY0_GPIO_PIN:   LED_RED_OFF;   break; 
        case KEY1_GPIO_PIN:   LED_GREEN_ON;  break; 
        case KEY2_GPIO_PIN:   LED_GREEN_OFF; break; 
    }
}

main

 

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
//#include "key.h"
#include "key_exti.h"

int main(void)
{
    HAL_Init();                    
    Stm32_Clock_Init(360,25,2,8);  
    delay_init(180);         
    LED_Init();                  
    KEY_EXTI_Init();
    
    
    while(1)
    {
        
    }
    
}
原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13624040.html