STM32入门教程——按键控制LED光敏传感器控制蜂鸣器
前言
本教材基于B站江协科技课程整理,适合有C语言基础、刚接触STM32的新手。它梳理了STM32核心知识点,帮助大家把C语言知识应用到STM32开发中,更高效地开启STM32学习之旅。
目录
前言
一、硬件接线与模块化编程概述
二、LED 驱动模块开发
初始化配置
功能函数封装
三、按键驱动模块开发
初始化配置
按键检测逻辑
四、主函数调用与功能实现
模块化调用流程
扩展应用:光敏传感器与蜂鸣器
五、开发要点总结
GPIO 操作步骤
模块化编程规范
调试与优化
一、硬件接线与模块化编程概述
- 硬件接线示例
- 按键与 LED 连接:按键接 PB1、PB11(一端接 GPIO,一端接地),LED 接 PA1、PA2(一端接 GPIO,一端接 VCC,低电平点亮)。
- 模块化优势:将驱动代码(如 LED、按键)分装到独立的
.c
和.h
文件中,避免主函数混乱,便于管理和移植。
- 按键与 LED 连接:按键接 PB1、PB11(一端接 GPIO,一端接地),LED 接 PA1、PA2(一端接 GPIO,一端接 VCC,低电平点亮)。
二、LED 驱动模块开发
-
初始化配置
- 开启 GPIOA 时钟,配置 PA1、PA2 为推挽输出模式(50MHz 速度)。
- 代码示例:
void LED_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); }
-
功能函数封装
- 提供点亮、熄灭、翻转等函数(如
LED1_On()
、LED1_Turn()
),通过操作 GPIO 寄存器实现状态控制。 - 在
.h
文件中声明函数,供主程序调用。
- 提供点亮、熄灭、翻转等函数(如
三、按键驱动模块开发
-
初始化配置
- 开启 GPIOB 时钟,配置 PB1、PB11 为上拉输入模式。
- 代码示例:
void KEY_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_Init(GPIOB, &GPIO_InitStructure); }
-
按键检测逻辑
- 读取端口值并消抖(20ms 延时),区分按下与松手状态,返回键码(如按键 1 返回 1,按键 2 返回 2)。
- 使用
GPIO_ReadInputDataBit()
函数获取按键状态。
四、主函数调用与功能实现
-
模块化调用流程
- 初始化 LED 和按键模块。
- 在主循环中读取按键值,根据键码执行对应操作(如按键 1 控制 LED1 翻转,按键 2 控制 LED2 翻转)。
- 代码示例:
int main() {LED_Init();KEY_Init();while(1) {uint8_t key = KEY_GetNum();if(key == 1) LED1_Turn();else if(key == 2) LED2_Turn();} }
-
扩展应用:光敏传感器与蜂鸣器
- 类似模块化方法,分装光敏传感器(读取 PB13 电平)和蜂鸣器(控制 PB12 输出)驱动。
- 根据光敏状态触发蜂鸣器报警,实现环境感知功能。
五、开发要点总结
-
GPIO 操作步骤
- 开启时钟 → 配置 GPIO 结构体(模式、引脚、速度) → 调用
GPIO_Init()
初始化。 - 输入模式用
GPIO_ReadInputDataBit()
,输出模式用GPIO_SetBits()
/GPIO_ResetBits()
。
- 开启时钟 → 配置 GPIO 结构体(模式、引脚、速度) → 调用
-
模块化编程规范
- 每个硬件模块对应独立的
.c
(实现驱动逻辑)和.h
(声明函数接口)。 - 添加注释说明函数功能、参数及返回值,提升代码可读性。
- 每个硬件模块对应独立的
-
调试与优化
- 编译前确保头文件路径正确,通过编译错误定位语法问题。
- 使用状态翻转(如
LED_Turn()
)替代直接赋值,简化主函数逻辑。