STM32学习-29-[EXTI]按钮实验

实验通过按下按钮1和按钮2来控制3的亮和灭
初始化灯和按钮
void App_OnBoardLED_Init(void){
RCC_APB2PriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 开启GPIOC的时钟
GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct); // 对引脚进行初始化
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
void App_Button_Init(void){
RCC_APB2PriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct = {0}; // 定义结构体
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct); // 对引脚进行初始化
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_16;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct); // 对引脚进行初始化
}
分配EXTI线

// 为EXTI5和EXTI6分配引脚
// 开启AFIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 线5选择端口A
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
// 线6选择端口A
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
配置EXTI线参数


// 初始化EXTI线
// EXTI模块比较特殊,无需使能EXTI模块的时钟
EXTI_InitTypeDef EXTI_InitStruct; // 声明
//配置EXTI_Line5
EXTI_InitStruct.EXTI_Line = EXTI_Line5;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
//配置EXTI_Line6
EXTI_InitStruct.EXTI_Line = EXTI_Line6;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
配置NVIC模块
// 配置中断
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
记得对NVIC进行分组
编写中断响应函数


void EXTI9_5_IRQHandler(void){
// 判断那条线触发
if(EXTI_GetFLagStatus(EXTI_Line5) == SET){ // 线5触发
EXTI_ClearFlag(EXTI_Line5); // 清除中断标志位
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}
if(EXTI_GetFLagStatus(EXTI_Line6) == SET){ // 线6触发
EXTI_ClearFlag(EXTI_Line6); // 清除中断标志位
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
}


浙公网安备 33010602011771号