[STM32F1]

使用STM32实现按键控制LED亮灭的简单项目

[复制链接]
222|11
手机看帖
扫描二维码
随时随地手机跟帖
Uriah|  楼主 | 2024-10-1 07:54 | 显示全部楼层 |阅读模式
大家好!今天我要分享一个关于STM32单片机的小项目,通过按键控制LED的亮灭。这是一个非常基础的应用,非常适合刚开始学习STM32的朋友们。
硬件准备:
  • STM32F103C8T6(俗称蓝皮开发板)
  • 一个LED(外接或者板载)
  • 一个按键
  • 连接线
软件工具:
  • Keil uVision 或 STM32CubeIDE
  • CubeMX
项目思路:我们将使用STM32的GPIO来控制LED,使用按键触发GPIO输入信号,从而控制LED的开关。按下按键时,LED亮;松开按键时,LED灭。
步骤:1. CubeMX配置:
  • 打开CubeMX,选择你的STM32芯片。
  • 配置时钟:选择内部高频时钟HCLK。
  • 配置GPIO:
    • 将某个引脚(如PC13)配置为输入模式,用于连接按键。
    • 选择一个引脚(如PA5)配置为输出模式,用于控制LED。
  • 生成代码,导入Keil或CubeIDE。
2. 添加代码控制逻辑:在生成的代码基础上,我们添加简单的按键检测和LED控制逻辑。
#include "main.h"

// 定义按键引脚和LED引脚
#define BUTTON_PIN GPIO_PIN_13
#define BUTTON_PORT GPIOC
#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA

int main(void)
{
    // 初始化HAL库和系统时钟
    HAL_Init();
    SystemClock_Config();
   
    // 初始化GPIO
    MX_GPIO_Init();

    // 主循环
    while (1)
    {
        // 读取按键状态
        if(HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET)  // 按键按下
        {
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);  // 点亮LED
        }
        else  // 按键松开
        {
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);  // 关闭LED
        }

        // 加入一些延时,避免按键抖动
        HAL_Delay(100);
    }
}

// GPIO初始化函数(CubeMX自动生成)
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 启动GPIO端口时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 配置LED引脚为输出
    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

    // 配置按键引脚为输入
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;  // 使用内部上拉电阻
    HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
}
代码解析:
  • HAL_GPIO_ReadPin() 函数用于读取按键的状态。如果按键按下,则点亮LED;如果按键松开,则关闭LED。
  • HAL_GPIO_WritePin() 函数用于设置GPIO引脚的电平,高电平点亮LED,低电平关闭LED。
  • 我们使用了简单的延时函数 HAL_Delay() 来防止按键抖动。
结果:通过这个简单的代码,当按下按键时,LED会亮起;松开按键时,LED熄灭。这个小项目帮助我们熟悉了GPIO的输入输出操作,也为后续的更复杂的项目打下了基础。
总结:这是一个非常基础的STM32项目,适合刚入门的朋友们。通过这个例子,我们掌握了按键输入和LED输出的基本操作。希望这篇帖子对大家有所帮助,欢迎大家在评论区分享你们的想法或者遇到的问题!

使用特权

评论回复
公羊子丹| | 2024-10-1 07:55 | 显示全部楼层
这个例子不错啊,正好我也在用STM32,学习了!

使用特权

评论回复
童雨竹| | 2024-10-1 07:55 | 显示全部楼层
哈哈,之前一直觉得RTC挺复杂的,看了你的代码,感觉简单多了!

使用特权

评论回复
周半梅| | 2024-10-1 07:56 | 显示全部楼层
兄弟,代码写得很清楚,我马上去试试!

使用特权

评论回复
帛灿灿| | 2024-10-1 07:56 | 显示全部楼层
终于有人讲解STM32的RTC配置了,这方面资料真不好找,感谢!

使用特权

评论回复
万图| | 2024-10-1 07:57 | 显示全部楼层
关于时钟配置那部分,可以再详细点吗?我总是搞不清楚怎么选LSE和LSI。

使用特权

评论回复
Wordsworth| | 2024-10-1 07:57 | 显示全部楼层
感觉这个教程正好适合我现在的项目,能分享下更多相关例子吗?

使用特权

评论回复
Pulitzer| | 2024-10-1 07:57 | 显示全部楼层
写得太好了,尤其是串口输出那部分,终于明白怎么打印时间了!

使用特权

评论回复
Bblythe| | 2024-10-1 07:58 | 显示全部楼层
我也用CubeMX配置RTC,但一直出错,原来是时钟选错了。学到了!

使用特权

评论回复
Clyde011| | 2024-10-1 07:58 | 显示全部楼层
有时候RTC读出的时间不准,是不是晶振问题?你有遇到过吗?

使用特权

评论回复
guijial511| | 2024-10-2 14:18 | 显示全部楼层
现在都在往国产化转了,用ST的人还多吗?

使用特权

评论回复
o88ne| | 2024-10-2 21:04 | 显示全部楼层
非常基础的应用,非常适合刚开始学习STM32的朋友们

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

3695

帖子

0

粉丝