目录
2.2.4 配置NVIC(中断分组NVIC_PriorityGroupConfig以及初始化NVIC_Init)
1.中断分组函数NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
通过按键来触发外部中断,然后控制LED灯的亮灭。
一、原理部分
1.1 按键原理
在STM32F103 上的按键 KEY0 连接在 PE4 上、KEY1 连接在 PE3 上、KEY_UP 连接在 PA0 上,而且可以看到KEY0 和 KEY1 是低电平有效的,而 KEY_UP 是高电平有效的。
要注意的是这三个按键外部都没有上下拉电阻,这会导致按键在悬空的时候,对应引脚的电压不确定。例如,在KEY0被按下时,引脚被接地,为低电平;但是在KEY0没被按下的时候,引脚悬空会导致电压的值不确定,所以这种情况下,必须设置为上拉输入模式,否则按键的判定会不准确。相反,KEY__UP这种接法就要求设置为下拉输入模式。
1.2 外部中断
下图为EXTI的基本结构
外部中断EXTI是由中断控制器NVIC控制的,从上图我们可以看到,要想让GPIO连通到NVIC,还需要先经过AFIO和EXTI这两个部分。其中AFIO寄存器的主要功能是选择中断引脚(GPIOA,GPIOB...等等);EXTI用来配置中断的触发方式(上升沿、下降沿、双边沿以及软件触发)和相应中断的方式(中断响应和事件相应);NVIC用来配置中断的优先级(抢占优先级和中断优先级)。
所以开启外部中断的要依次配置好GPIO、AFIO、EXTI和NVIC,这样才能使用外部中断。
对应的程序框图:
二、工程部分
2.1 按键初始化
这里我们使用KEY0和KEY1来分别控制两个LED的亮灭。
配置它们的GPIO和之前LED的GPIO配置类似,先RCC开启对应GPIO时钟,然后GPIO_Init(),不过要记得配置GPIO为输入模式,并且是上拉输入模式。
void KEY_GPIO_Init(void)
{
//使能KEY引脚对应IO端口时钟
KEY0_RCC_CLOCKCMD(KEY0_RCC_CLOCKGPIO, ENABLE);
KEY1_RCC_CLOCKCMD(KEY1_RCC_CLOCKGPIO, ENABLE);
//定义IO硬件初始化结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GP