要使用STM32实现按键控制LED,首先需要了解STM32的GPIO和中断模块。GPIO用于控制IO口,可以将其设置为输入或输出,用于连接按键和LED。中断模块可以检测到按键的状态变化并触发相应的中断函数,实现按键的响应。
以下是一个使用STM32实现按键控制LED的示例代码:
首先,需要包含相应的头文件和定义一些宏:
#include "stm32f10x.h"
// 定义LED和按键的GPIO端口和引脚
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_PIN GPIO_Pin_0
#define KEY_GPIO_PORT GPIOB
#define KEY_GPIO_PIN GPIO_Pin_10
// 定义按键触发的中断号
#define KEY_EXTI_LINE EXTI_Line10
#define KEY_EXTI_PORT_SOURCE GPIO_PortSourceGPIOB
#define KEY_EXTI_PIN_SOURCE GPIO_PinSource10
#define KEY_EXTI_IRQn EXTI15_10_IRQn
// 函数原型声明
void LED_Init(void);
void KEY_Init(void);
void EXTI_Config(void);
void NVIC_Config(void);
void Delay(uint32_t nCount);
// 主函数
int main(void)
{
// 初始化LED和按键
LED_Init();
KEY_Init();
// 配置外部中断
EXTI_Config();
// 配置中断向量表
NVIC_Config();
// 主循环
while (1)
{
}
}
// 初始化LED
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 使能LED的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIO为推挽输出模式
GPIO_InitStruct.GPIO_Pin = LED_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
// 关闭LED
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);
}
// 初始化按键
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 使能按键的GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置GPIO为上拉输入模式
GPIO_InitStruct.GPIO_Pin = KEY_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
}
// 配置外部中断
void EXTI_Config(void)
{
GPIO_EXTILineConfig(KEY_EXTI_PORT_SOURCE, KEY_EXTI_PIN_SOURCE);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = KEY_EXTI_LINE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
// 配置中断向量表
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = KEY_EXTI_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
// 延时函数
void Delay(uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
// 按键中断处理函数
void EXTI15_10_IRQHandler(void)
{
// 确定是KEY_EXTI_LINE触发的中断
if (EXTI_GetITStatus(KEY_EXTI_LINE) != RESET)
{
// 延时消除抖动
Delay(100000);
// 检测按键状态
if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == 0)
{
// 按下按键,点亮LED
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN);
}
else
{
// 松开按键,熄灭LED
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);
}
// 清除中断标志
EXTI_ClearITPendingBit(KEY_EXTI_LINE);
}
}
以上代码中,通过定义宏来指定LED和按键的GPIO端口和引脚。LED_Init
函数用于初始化LED,通过配置GPIO为推挽输出模式并将GPIO引脚拉高来关闭LED。KEY_Init
函数用于初始化按键,通过配置GPIO为上拉输入模式来使能内部上拉电阻。EXTI_Config
函数用于配置外部中断,将按键引脚连接到外部中断线上,并设置中断触发方式为下降沿触发。NVIC_Config
函数用于配置中断向量表,设置中断优先级和使能中断。Delay
函数用于延时。EXTI15_10_IRQHandler
函数是按键的中断处理函数,当按键引脚触发中断时,根据按键的状态来点亮或熄灭LED,并清除中断标志。
在主函数中,首先初始化LED和按键,然后配置外部中断和中断向量表,最后进入主循环。
编译并下载程序到STM32开发板后,按下按键,LED就会点亮;松开按键,LED会熄灭。
这样,就实现了按键控制LED的功能。可以根据实际需求修改代码,例如添加更多的按键和LED,并对按键触发的中断进行其他处理。