1.使能GPIO时钟: __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
2.设置GPIO输入模式2.1设置AFIO(开启时钟,IO口映射)
2.2设置EXTI(屏蔽,上/下沿)
第二项使用 HAL_GPIO_Init ,即可一步完成
3.设置NVIC(中断优先级分组,设置中断优先级,使能中断)HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //在 HAL_Init(); 中进行配置,配置一次即可
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //函数参数:响应中断号,抢占优先级,响应优先级 HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
4.设计中断服务函数EXTI0_IRQHandler()
STM32仅有:EXTI0~4、EXTI9~5、EXTI15~10,7个外部中断服务函数
按键开关引脚PA0,低电平触发,也就是检测该引脚是否为低电平,注意按键要接上拉电阻
cs#include "sys.h" #include "exti.h" #include "delay.h" #include "LED.h" void exti_init(void) { GPIO_InitTypeDef gpio_initstruct;//定义结构体变量,GPIO初始化要用到 //打开时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 //调用GPIO初始化函数 gpio_initstruct.Pin = GPIO_PIN_0; //初始化一个引脚, gpio_initstruct.Mode = GPIO_MODE_IT_FALLING; //下降沿,中断相关 gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速 gpio_initstruct.Pull = GPIO_PULLDOWN; //上拉 HAL_GPIO_Init(GPIOA,&gpio_initstruct);//对定义的结构体变量取地址 //开始设立分组2,配置优先级,使能 HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);//函数参数:响应中断号,抢占优先级,响应优先级 HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断 } void EXTI0_IRQHandler(void) //中断服务函数 { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //这个函数处理EXTI中断请求 } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //回调函数 { delay_ms(20); //消抖 if (GPIO_Pin==GPIO_PIN_0) { if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) { LED1_toggle(); } } } /*****************main.c****************************************/ #include "sys.h" #include "delay.h" #include "LED.h" #include "exti.h" int main(void) { HAL_Init(); /* 初始化HAL库 */ stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ LED_init(); exti_init(); while(1) { LED2_off(); delay_ms(500); LED2_on(); delay_ms(500); } }
中断服务函数无参数无返回值,
中断服务函数选择中断线EXTI0,故函数形式 EXTI0_IRQHandler
有中断 挂起寄存器(EXTI_PR) PR就被置1,读的时候又会自动清零
下面是中断处理函数和回调函数,回调函数内容可自己编写代码