1.IO口外部中断
1.STM32的么一个IO口都可以作为外部中断输入
2.每个外部中断线都可以独立的配置触发方式(上升沿触发,下降沿触发,双边沿触发),触发/屏蔽,专用的状态位。
3.STM32供IO实验的中断线只有16个,但是有32系列的IO口通常有上百多个IO口。会有GPIO与中断线的映射。
2.IO口与中断线的映射
中断线选择的IO口有一个专用的寄存器,每四位控制一个中断线选择IO口,故1个中断线可以从16个IO口中选择其中一个IO口,例如外部中断0可以选择PA0-PI0其中一个IO口。
寄存器为SYSCFG_EXTIPx
2.中断向量表
IO口外部中断在中断向量表只分配了七个中断向量,也就是只能有七个中断服务函数。
中断服务函数列表
3.HAL库配置方法
1.中断线的映射
映射和触发方式都是在GPIO初始化函数中完成
设置了上升沿触发或者是下降沿触发就知道了是中断,该IO口作为中断
2.中断服务函数
和串口中断一样,中断产生后,进入通用函数,后判断是哪个中断引起的,然后才进行回调函数。
4.外部中断的一般配置方法
5.对应按键配置![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/234ac5c18a13d7f0f841071665e0a635.png)
上拉下拉输入不用讲了,如何触发是看松开时候电平变化的。
6.具体代码
不同按键产生中断条件,然后改变灯
中断配置函数 EXTI.c
#include"EXTI.h"
#include"led.h"
#include"delay.h"
#include"key.h"
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); //EXTI0
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn); //EXTI2
HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);
HAL_NVIC_EnableIRQ(EXTI3_IRQn); //EXTI3
HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); //15_10_
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3);
}
void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
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 = !LED0;
LED1 = !LED1;
}
break;
case GPIO_PIN_13: //KEY2
if(KEY2==0)
{
LED0 = 1;
LED1 = 1;
}
break;
case GPIO_PIN_2: //KEY1
if(KEY1==0)
{
LED1 = 1;
LED0 = 1;
}
break;
case GPIO_PIN_3: //KEY0
if(KEY0==0)
{
LED1 = 0;
LED1 = 0;
}
break;
}
}
main函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "EXTI.h"
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
EXTI_Init();
while(1)
{
printf("OK\r\n");
delay_ms(1000);
}
}