1周2:按键控制LED_中断方法
代码及注释:
void Key_Init(void)
{
// 使能AFIO时钟,它允许将一个引脚配置为多个不同的功能(触发中断)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE) ;
// 使能GPIO时钟
RCC->APB2ENR |= RCC_APB2Periph_GPIOA ;
//需要GPIO,NVIC,EXTI结构体来初始化
GPIO_InitTypeDef G//配置引脚工作模式
NVIC_InitTypeDef N;//配置优先级
EXTI_InitTypeDef E; //配置引脚中断方式
//KEY_1_PA0 高电平有效 先设置KEY1的三个结构体
//①配置GPIO的结构体(3个成员)
G.GPIO_Pin = GPIO_Pin_0;
G.GPIO_Mode = GPIO_Mode_IPD ;(因为是高电平有效,所以应该让它闲时保持低电平,IPD(Down))
G.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&G);
//②配置EXTI的结构体(4个成员)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
//将GPIOA端口的引脚0配置为外部中断的输入线路。这样,当该引脚上的外部事件(例如按键按下或传感器信号变化)触发时,可以生成一个对应的中断请求,并执行相应的中断处理程序。
E.EXTI_Line = EXTI_Line0;
//因为KEY键在PA0,所以选line0
E.EXTI_Mode= EXTI_Mode_Interrupt;
//选择中断的方式
E.EXTI_Trigger = EXTI_Trigger_Rising;
//由于KEY1是高电平有效,所以设置成上升沿
E.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
//③配置NVIC的结构体(4个成员)
N.NVIC_IRQChannel = EXTI0_IRQn;
//指定外部中断引脚0对应的中断通道
N.NVIC_IRQChannelPreemptionPriority = 1;
//设置抢占优先级
N.NVIC_IRQChannelSubPriority = 0;
//设置子优先级
N.NVIC_IRQChannelCmd = ENABLE;
//给中断通道使能
NVIC_Init(&NVIC_InitStruct);
KEY_2_#PA1 和 KEY_3_#PA4 低电平有效
代码忽略了,和上面差不多
}
//接下来要编写中断处理的函数了
Ps:函数名是不能变的,不过可以另外#define其他名字
这是KEY1的
void EXTI0_IRQHANDLER(void)
{
if (EXTI->PR & GPIO_Pin_0)
//检查外部中断引脚0上的中断标志是否为1,即检查是否发生了中断事件。
{
// 在这里添加你的中断处理代码
LED_BLUE_TOGGLE;
EXTI->PR |=GPIO_Pin_0;
//将引脚0上的中断标志位清除
}
}
KEY2和KEY3同理,代码就忽略了;
这样就能通过按键来实现LED的变化了。
Ps:mmp其实中断我昨晚就学会了,今天早上本来想整理知识点出来,后面想着干脆把串口通信一口气学了,结果整到晚上才想明白,真烧CPU。