stm32按键控制led灯亮灭

发布者:DazzlingSmile最新更新时间:2024-08-22 来源: elecfans关键字:stm32  按键控制  led灯亮灭 手机看文章 扫描二维码
随时随地手机看文章

嵌入式系统中,硬件按键常常被用作开关输入,控制LED灯亮灭。在STM32系列单片机中,有多种方式实现按键控制LED灯亮灭,我们将介绍其中一种较为简单的方法。

一、STM32开发环境搭建

1. 软件环境搭建

首先,需要在计算机中下载安装Keil MDK开发环境,以实现对STM32单片机的编写、编译、烧录等操作。同时,还需要下载对应的STM32CubeMX软件,用于生成代码、初始化硬件等操作。

2. 硬件环境搭建

将STM32单片机与相应的按键和LED灯连接。本实验使用的STM32是STM32F103C8T6,按键使用的是按钮开关,LED灯使用的是红色和蓝色通用的LED灯。

二、STM32按键控制LED灯亮灭实验步骤

1. 打开STM32CubeMX软件,点击File -> New Project,选择STM32F103C8T6作为目标设备,单击OK。

2. 在生成的新项目中,选择Pinout标签页,将按键和LED灯连接至对应的引脚上。

3. 选择Configuration标签页,配置GPIO引脚的工作模式。按键连接的GPIO引脚应配置为输入模式,LED灯连接的GPIO引脚应配置为输出模式。

4. 在Project Manager视图中,选择Project Manager -> Code Generator标签页,选择Generate peripheral initialisation as a pair of .c/.h files选项,并确保选中了Generate under Root选项。

5. 点击Generate Code,生成HAL库文件。

6. 打开Keil MDK开发环境,从文件菜单中选择New Project,创建新的工程。在选择设备的窗口中选择STM32F103C8T6,确定后添加HAL库文件到工程。

7. 编写C语言程序,实现按键控制LED灯亮灭。程序中需要实现如下功能:

a. 初始化按键和LED灯的GPIO引脚。

b. 判断按键当前状态,如果按键处于按下状态,则将LED灯的GPIO引脚置高,使LED灯亮;否则,将LED灯的GPIO引脚置低,使LED灯灭。

下面是具体的C语言程序示例:

```
#include 'stm32f1xx_hal.h'

/* 定义按键GPIO引脚 */
#define KEY_PORT GPIOB
#define KEY_PIN GPIO_PIN_0

/* 定义LED灯GPIO引脚 */
#define LED_PORT GPIOB
#define LED_PIN GPIO_PIN_1

/* 定义按键状态标志 */
uint8_t key_flag = 0;

/* 定义HAL库句柄 */
GPIO_InitTypeDef GPIO_InitStruct;
TIM_HandleTypeDef htim2;

/* 初始化STM32的GPIO引脚 */
void GPIO_Init(void)
{
/* 使能GPIOB时钟 */
__HAL_RCC_GPIOB_CLK_ENABLE();

/* 初始化按键GPIO引脚 */
GPIO_InitStruct.Pin = KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);

/* 初始化LED灯GPIO引脚 */
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
}

/* 初始化STM32的定时器,以便在检测按键时切换状态 */
void TIM2_Init(void)
{
/* 使能TIM2时钟 */
__HAL_RCC_TIM2_CLK_ENABLE();

/* 初始化定时器中断 */
HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);

/* 初始化定时器2 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7200-1; /* 分频系数 */
htim2.Init.Period = 500-1; /* 计数周期 */
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start_IT(&htim2);
}

/* 检测按键状态 */
void Key_Scan(void)
{
/* 判断按键是否按下 */
if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) {
key_flag = 1;
} else {
key_flag = 0;
}
}

/* 控制LED灯亮灭 */
void LED_Control(void)
{
/* 根据按键状态判断LED灯的亮灭状态 */
if (key_flag == 1) {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
}

/* 定时器调用函数,每500ms检测一次按键状态 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2) {
Key_Scan();
LED_Control();
}
}

int main(void)
{
/* 初始化GPIO引脚 */
HAL_Init();
GPIO_Init();

/* 初始化定时器 */
TIM2_Init();

/* 等待事件发生 */
while (1) {
}

return 0;
}
```

三、STM32按键控制LED灯亮灭的运行效果

编写完成上述程序之后,将程序烧录到STM32单片机中。当按下按键时,LED灯将亮起,否则LED灯将熄灭

四、总结

本实验简单介绍了STM32按键控制LED灯亮灭的原理和步骤。在实现过程中,需要注意初始化硬件的GPIO引脚的工作模式,以及编写程序中对按键状态的判断和LED灯状态的控制。可以通过添加定时器中断等方式,实现对按键状态的周期性检测和LED灯的闪烁效果等功能,并根据具体的应用场景来定制相应的程序功能。

关键字:stm32  按键控制  led灯亮灭 引用地址:stm32按键控制led灯亮灭

上一篇:STM32大小端序与堆栈及其增长方向分析
下一篇:基于LL库实现STM32U5 LPTIM功能

推荐阅读最新更新时间:2024-11-13 00:25

STM32学习014_STC89C51RC
STC89C52rc是STC公司生产的一种低功耗、高性能的CMOS8位控制器,具有8k字节系统可编程FLASH存储器。stc89c51用的是经典的MCS-51内核,但是做了很多改进,使芯片具有传统51不具备的功能,但单芯上有灵活的8位CPU和系统可编程FLASH。 标准功能:8k字节Flash,512字节Ram,32位I/O口线,看门狗定时器,内置4KBEEPROM,max810复位电路,3个16位的定时器/计数器,4个外部中断,一个向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口,另外,stc89c52可降至0hz静态逻辑操作,支持两种软件可选择节电模式,空闲状态下,CPU停止工作,允许RAM,定时器/计数器,
[单片机]
STM32STM32启动方式
在少量芯片程序下载时,用JLINK或SWD的下载方式比较繁琐,串口下载配合正点原子的FLYMCU比较快捷,STM32的串口下载时候需要注意MCU的启动方式。 在复位时,会按照boot的状态判断进入哪种模式,boot脚不用保持长状态。 在根据STM407参考手册来看,STM32拥有三种启动方式,分别为: 模式1:boot0拉低,使用用户闪存区,这是最正常启动的模式,即,在正常启动时,boot0应该下拉为低电平; 模式2:从系统存储器启动,在系统ROM区有固定的bootloader代码,用于ISP(串口)下载,引导外部代码到falsh,在重新复位后,置boot0为0即可以得到刚才的下载的代码。 模式3:从SRAM
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>启动方式
stm32输出pwm波使无刷电机转起来
现阶段使用stm32,基本处于模仿阶段,用野火的教程以及程序,修改一些IO口,然后烧到自己的开发板上,实现一些功能。 第二个实验室了解pwm波这个东西,脉宽调制,调节占空比可以改变电机转速,原理可以看刘洋老师的基础视频,讲的很详细。 修改野火的pwm程序,野火用了四个通道,我只用了TIM4的第一通道,程序如下: #include pwm_output.h void pwm_value(void) { TIM4- CCR1=1300; } /* * 函数名:TIM3_GPIO_Config * 描述 :配置TIM3复用输出PWM时用到的I/O * 输入 :无 * 输出 :无 * 调用 :内部调用 */ static v
[单片机]
STM32 BOOT位理解及设置
STM32F10x 片上存储区有3个部分:内置Flash,内置SRAM ,内置ROM(system memory),这就定义了系统的启动方式有3种:从内置Flash启动,从内置SRAM启动,从system memory 启动,这三种启动方式是通过BOOT 这两个引脚来决定的。 SRAM:即芯片内置的RAM区,通俗意义上的内存。 系统存储区(system memory):芯片内部一块特定的区域,芯片出厂时ST在这个区域烧写了一段Bootloader ,由于这个区域为ROM,因此芯片出厂后是无法修改的。这个Bootloader的主要任务就是通过UART1下载程序到内置Flash中去。BOOT选择System memory 模
[单片机]
<font color='red'>STM32</font> BOOT位理解及设置
STM32的串口采用DMA方式接收数据测试
环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才能产生接收中断,如何接收可变长度的数据呢? 方法有以下3种: 1.将RX脚与一路时钟外部引脚相连,当串口一帧发完,即可利用此定时器产生超时中断.这个实时性较高,可以做到1个字节实时监测. 2.不改变硬件,开启一个定时器监控DMA接收,如果超时则产生中断.这个实时性不高,因为超时时间必须要大于需要接收帧的时间,精度不好控制. 3.STM32单片机有的串口可以监测总线是否处于空闲,如果空闲则产生中断.可以用它来监测DMA接收是否完毕.这种方式
[单片机]
STM中SPI运用的NSS引脚解读
STM的NSS引脚 首先我们说该引脚有两个电平需要注意,一个是与NSS引脚连接的外部电平,一个是NSS引脚的内部电平。 然后我们知道在SPI通信的时候master必须在NSS引脚的内部电平为高电平时才得以进行通信,slaver在NSS引脚的内部电平为低电平时才可以通信。这是前提条件。 我们知道NSS引脚电平的管理有两种方式,一个是软件管理和硬件管理。但当为硬件管理时(SSM=0),NSS管脚的内部电平由与NSS连接的外部电平决定,即外面是高电平,则NSS引脚的内部电平也为高电平。如果你想工作在该模式下,那么master的NSS引脚必须连接高电平,slaver必须连接低电平(一般接地)。软件管理模式(SSM=1)则是通过SS
[单片机]
stm325个串口的配置函数 STM32串口如何发送数据
5个串口的配置函数和收发数据函数代码: #include “stm32f10x.h” #include “misc.h” #include “stm32f10x_gpio.h” #include “stm32f10x_usart.h” void USART1_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
[单片机]
stm325个串口的配置函数 <font color='red'>STM32</font>串口如何发送数据
GD32代码移植STM32(一)
GAIWEI例子:GD32F103移植STM32F103 使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。虽然两个款芯片的寄存器地址以及架构基本相同。但是需要注意的是GD32F10x主频是108兆,但是STM32F10x主频是72兆。所以需要针对以RCC时钟进行修改。 1.先将芯片的选项进行修改:查找对应芯片。 2.将STM32的启动文件替换成GD的启动文件。 3.修改时钟相关配置。 打开stm32f10x.h文件,#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*! Time out for HSE start up
[单片机]
GD32代码移植<font color='red'>STM32</font>(一)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved