核心目标:从纯软件语法过渡到实际硬件开发,学会搭建 STM32 开发环境,理解 GPIO(通用输入输出口)原理,用 HAL 库实现 “LED 点亮 / 闪烁” 和 “按键控制 LED”—— 这是嵌入式开发 “从代码到实物” 的关键一步,让你真正看到代码控制硬件的效果。
一、STM32 与开发环境搭建(40 分钟,动手实操)
1. 为什么选 STM32?
STM32 是意法半导体(ST)的 32 位单片机(MCU),性价比高、资料丰富(官方例程 + 社区支持),是嵌入式入门的首选(我们以最经典的 STM32F103C8T6 “蓝桥板” 为例,成本低、易上手)。
2. 开发环境:STM32CubeIDE(新手友好,集成 HAL 库)
- 下载安装:官网搜索 “STM32CubeIDE”(免费),按提示安装(注意勾选 “ST-Link 驱动”,用于下载程序到开发板)。
- 核心优势:可视化配置硬件(不用手动写寄存器)、自动生成初始化代码、集成编译和下载功能,新手只需专注业务逻辑。
3. 硬件准备:
- STM32F103C8T6 开发板(蓝桥板)、Micro-USB 线(供电 + 下载)、LED(板载已有,无需额外准备)、按键(板载已有)。
二、GPIO 原理:嵌入式 “控制硬件的接口”(30 分钟)
GPIO(General Purpose Input Output,通用输入输出口)是 MCU 与外部硬件(LED、按键、传感器)连接的 “桥梁”,通过配置 GPIO 的工作模式,可实现 “输出高低电平”(控制 LED)或 “读取外部电平”(检测按键)。
1. GPIO 的核心特性:
- 引脚:STM32 有多个 GPIO 端口(A、B、C...),每个端口有 16 个引脚(如 PA0、PA1、PC13 等),板载 LED 通常接在 PC13(低电平点亮),按键接在 PA0(按下时为低电平)。
- 工作模式(常用 2 种):
- 输出模式:GPIO 可输出高电平(3.3V)或低电平(0V),用于控制 LED、继电器等。
- 输入模式:GPIO 可检测外部输入的电平(高 / 低),用于读取按键、传感器状态等。
- 控制方式:
- 寄存器:直接操作硬件寄存器(如 GPIOx_ODR 输出数据寄存器),效率高但复杂(新手先不用)。
- HAL 库函数:ST 提供的封装好的函数(如
HAL_GPIO_WritePin输出电平),简单易用,适合入门。
三、实操 1:用 HAL 库点亮并闪烁 LED(50 分钟,核心!)
目标:通过代码控制板载 LED(PC13)周期性亮灭(闪烁),体验 “代码控制硬件” 的完整流程。
步骤 1:创建 STM32CubeIDE 工程
- 打开 CubeIDE,点击「File→New→STM32 Project」;
- 在 “Part Number” 中搜索 “STM32F103C8T6”,选中后点击「Next」;
- 工程名填 “LED_Blink”,路径选英文目录(避免中文乱码),点击「Finish」→ 弹出的对话框选「Yes」(生成初始化代码)。
步骤 2:配置 GPIO 引脚(可视化配置)
- 进入 “Pinout & Configuration” 界面(左侧标签);
- 找到 PC13 引脚(在右侧芯片图上,或搜索框输入 “PC13”);
- 点击 PC13,选择 “GPIO_Output”(配置为输出模式);
- 点击左侧 “System Core→GPIO→PC13”,配置参数(默认即可):
- GPIO output level:默认低电平(初始状态 LED 亮);
- GPIO mode:Output Push Pull(推挽输出,可输出高低电平);
- GPIO Pull-up/Pull-down:No pull-up and no pull-down(无需上下拉);
- Maximum output speed:Low(低速即可,LED 不需要高速)。
步骤 3:生成初始化代码
点击顶部「Project→Generate Code」,CubeIDE 会自动生成 GPIO 初始化代码(在main.c和gpio.c中)。
步骤 4:编写 LED 闪烁逻辑(修改 main 函数)
打开main.c,在while(1)循环中添加代码(让 LED 每隔 500ms 翻转一次):
c
/* USER CODE BEGIN WHILE */
while (1)
{
/* 翻转PC13引脚电平:亮→灭→亮... */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
/* 延时500ms:HAL库提供的毫秒级延时函数 */
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
步骤 5:下载程序到开发板
- 用 Micro-USB 线连接开发板和电脑,确保 ST-Link 驱动已安装(设备管理器中无黄色感叹号);
- 点击顶部「Run→Run」(或绿色三角按钮),CubeIDE 会自动编译并下载程序到开发板。
现象:板载 LED 开始周期性闪烁(500ms 亮,500ms 灭),成功!
四、实操 2:按键控制 LED(结合中断,30 分钟)
目标:用板载按键(PA0)控制 LED:按下按键时 LED 点亮,松开时熄灭(用中断方式检测按键,复习第四天的中断知识)。
步骤 1:重新配置 GPIO(按键用输入中断模式)
- 新建工程 “Key_Control_LED”,配置 PC13 为 “GPIO_Output”(LED 不变);
- 配置 PA0 为 “GPIO_EXTI0”(外部中断 0,对应 PA0 引脚);
- 配置中断参数:
- 左侧 “System Core→GPIO→PA0”:
- GPIO mode:Input mode(输入模式);
- GPIO Pull-up/Pull-down:Pull-up(上拉,未按下时为高电平);
- 左侧 “System Core→NVIC”(中断控制器):
- 勾选 “EXTI line0 interrupt”(使能 EXTI0 中断),优先级默认即可。
- 左侧 “System Core→GPIO→PA0”:
步骤 2:生成代码后,编写中断服务函数
- 在
main.c中,先初始化 LED 为熄灭状态(在MX_GPIO_Init();后添加):c
/* 初始化LED为熄灭:PC13输出高电平(板载LED低电平点亮) */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); - 找到中断回调函数(CubeIDE 自动生成框架,在
stm32f1xx_hal_gpio.c中,或在main.c中重写):在main.c的 “USER CODE BEGIN 4” 区域添加:c
/* 外部中断回调函数:按键按下时触发(PA0电平变化) */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) // 确认是PA0触发的中断 { /* 延时消抖(简单处理:按键机械抖动导致的多次触发) */ HAL_Delay(10); /* 读取PA0电平:按下时为低电平(GPIO_PIN_RESET) */ if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { /* 按键按下:点亮LED(PC13输出低电平) */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); } else { /* 按键松开:熄灭LED(PC13输出高电平) */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); } /* 清除中断标志位(避免重复触发) */ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); } }
步骤 3:下载程序,测试效果
按下按键(PA0),LED 点亮;松开按键,LED 熄灭 —— 中断响应成功!
五、第五天必掌握的 3 个关键知识点(10 分钟自测)
- GPIO 是 MCU 控制外部硬件的接口,核心模式:输出(控制 LED)、输入(检测按键)。
- STM32CubeIDE 的使用流程:创建工程→配置引脚→生成代码→编写逻辑→下载运行。
- HAL 库核心函数:
HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, level):设置引脚电平(GPIO_PIN_SET高,GPIO_PIN_RESET低);HAL_GPIO_TogglePin(GPIOx, GPIO_PIN_x):翻转引脚电平;HAL_GPIO_ReadPin(GPIOx, GPIO_PIN_x):读取引脚电平;HAL_Delay(ms):毫秒级延时。

5344

被折叠的 条评论
为什么被折叠?



