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

image
实验通过按下按钮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线

image

	// 为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线参数

image

image

	// 初始化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进行分组

编写中断响应函数

image

image

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);
	}
}

PixPin_2026-09-02_10-03-13

posted @ 2026-09-02 10:04  灵垚克府  阅读(6)  评论(0)    收藏  举报