基于STM32F407用按键控制LED

用中断服务函数配置按键(PA0,PE2-4)控制LED(PC4-7)状态翻转

1)中断初始化

void interrupt_config(void)
{
	//打开时钟
	RCC->AHB1ENR |= (1<<0);//打开GPIOA的外设时钟使能
	RCC->AHB1ENR |= (1<<4);//打开GPIOE的外设时钟使能
	//打开中断时钟
	RCC->APB2ENR |= (1<<14);//打开SYSCFG时钟
	//配置EXTI的IMR/RTSR/FTSR寄存器,中断屏蔽置1,选择上升沿或下降沿触发
	EXTI->IMR |= 0x1d;//0234位置1
	EXTI->RTSR |= (1<<0);//PA0设置成上升沿触发
	EXTI->FTSR |= (7<<2);//PE2/3/4设置成下降沿触发
	//配置按键的外部中断线
	SYSCFG->EXTICR[0] &= ~(15<<0);//将PA0映射到EXTI0线上
	SYSCFG->EXTICR[0] |= (0x44<<8);//将PE2/3映射到EXTI2/3线上
	SYSCFG->EXTICR[1] |= (4<<0);//将PE4映射到EXTI4线上
	//设置中断号和中断优先级
	NVIC_SetPriority(6,3);//设置中断号为EXTI0_IRQn,抢占优先级为0,响应优先级为3
	NVIC_SetPriority(8,4);//设置中断号为EXTI2_IRQn,抢占优先级为1,响应优先级为0
	NVIC_SetPriority(9,5);//设置中断号为EXTI3_IRQn,抢占优先级为1,响应优先级为1
	NVIC_SetPriority(10,6);//设置中断号为EXTI4_IRQn,抢占优先级为1,响应优先级为2
	//使能按键中断
	NVIC_EnableIRQ(6);//使能EXTI0_IRQn
	NVIC_EnableIRQ(8);//使能EXTI2_IRQn
	NVIC_EnableIRQ(9);//使能EXTI3_IRQn
	NVIC_EnableIRQ(10);//使能EXTI4_IRQn
}

LED配置初始化

void led_config(void)
{
	//打开LED时钟
	RCC->AHB1ENR |= (1<<2);//打开GPIOC的外设时钟使能
	//配置GPIOC的端口输出
	GPIOC->MODER |= (0x55<<8);//PC4-7配置为通用输出模式
	GPIOC->OTYPER &= ~(15<<4);//PC4-7配置为推挽模式
	GPIOC->ODR &= ~(15<<4);//输出数据寄存器配置为低,初始为灯亮
}

按键初始化

//按键初始化
void key_config(void)
{
	GPIOA->MODER &= ~(3<<0);//设置为输入模式
	GPIOA->PUPDR &= ~(3<<0);//设置为无上下拉模式
	GPIOA->IDR &= ~(1<<0);
	
	GPIOE->MODER &= ~(0x3f<<4);//PE2-4设置为输入模式
	GPIOE->PUPDR &= ~(0x3f<<4);//设置为无上下拉模式
	GPIOE->IDR &= ~(7<<2);
}

按键1/2/3/4中断服务函数

按下灯状态翻转

//EXTI0中断服务函数
void EXTI0_IRQHandler(void)
{
	if(EXTI->PR & (1<<0))
	{
		EXTI->PR |= (1<<0);
		LED1_TURN;
	}
}
//EXTI2中断服务函数
void EXTI2_IRQHandler(void)
{
	if(EXTI->PR & (1<<2))
	{
		EXTI->PR |= (1<<2);
		LED2_TURN;
	}
}
//EXTI3中断服务函数
void EXTI3_IRQHandler(void)
{
	if(EXTI->PR & (1<<3))
	{
		EXTI->PR |= (1<<3);
		LED3_TURN;
	}
}
//EXTI4中断服务函数
void EXTI4_IRQHandler(void)
{
	if(EXTI->PR & (1<<4))
	{
		EXTI->PR |= (1<<4);
		LED4_TURN;
	}
}

.h文件声明函数和宏定义

#include "stm32f4xx.h"
#define LED1_TURN GPIOC->ODR ^= (1<<4)
#define LED2_TURN GPIOC->ODR ^= (1<<5)
#define LED3_TURN GPIOC->ODR ^= (1<<6)
#define LED4_TURN GPIOC->ODR ^= (1<<7)

void interrupt_config(void);
void led_config(void);
void key_config(void);

主函数设置中断优先级和调用函数

NVIC_SetPriorityGrouping(2);//设置优先级分组为2,抢占优先级为2位,响应优先级为2位
	interrupt_config();
	led_config();
	key_config();
	while(77)
	{
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值