3. 实现LED闪烁测试
任务说明
本案例的目标是编写一个最简单的LED闪烁程序,用于验证三件事:单片机硬件本身工作正常、开发工具链(编译器/烧录器)工作正常、以及基本的GPIO输出控制逻辑正确。这是后续所有案例的“冒烟测试”,不涉及复杂外设或协议。
硬件连接
假设使用常见的STM32F103C8T6最小系统板(Blue Pill),板载LED连接在PC13引脚(高电平熄灭,低电平点亮)。若使用其他开发板,只需修改引脚定义和时钟使能寄存器即可。
代码实现
使用寄存器操作方式编写,不依赖HAL库,便于直接观察底层行为。代码逻辑:配置PC13为推挽输出,然后在主循环中交替输出低电平和高电平,中间插入软件延时。
// main.c - LED闪烁测试程序
#include "stm32f10x.h"
// 简单软件延时函数(约0.5秒 @ 72MHz)
void delay_ms(volatile uint32_t ms) {
for (volatile uint32_t i = 0; i < ms * 4000; i++) {
__NOP();
}
}
int main(void) {
// 1. 使能GPIOC时钟(APB2总线,位4)
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
// 2. 配置PC13为推挽输出,最大速度2MHz
// CNF13=00(推挽),MODE13=10(2MHz输出)
GPIOC->CRH &= ~(0xF << 20); // 清除CNF13和MODE13位
GPIOC->CRH |= (0x2 << 20); // MODE13=10,CNF13=00
while (1) {
// 3. 点亮LED(PC13输出低电平)
GPIOC->BRR = GPIO_BRR_BR13;
delay_ms(500);
// 4. 熄灭LED(PC13输出高电平)
GPIOC->BSRR = GPIO_BSRR_BS13;
delay_ms(500);
}
}
工程配置与烧录
使用STM32标准外设库(SPL)或直接寄存器操作均可。若使用Keil MDK,需包含启动文件startup_stm32f10x_md.s和系统初始化文件system_stm32f10x.c。编译生成HEX文件后,通过ST-Link或串口ISP烧录到开发板。
验证方法与判定标准
验证步骤:
- 将编译生成的HEX文件烧录到开发板;
- 观察板载LED是否以约1Hz频率(亮0.5秒,灭0.5秒)闪烁;
- 用万用表测量PC13引脚电压,应观察到0V和3.3V交替变化。
判定标准:
- LED以稳定节奏闪烁,说明硬件连接正确、时钟配置无误、GPIO输出功能正常;
- 若LED常亮或常灭,检查PC13引脚配置是否正确(注意BRR/BSRR寄存器操作);
- 若LED完全不亮,优先检查供电、晶振启动和烧录是否成功。
预期输出:LED以约1Hz频率持续闪烁(亮0.5秒,灭0.5秒),直到断电。该结果由代码逻辑直接推出:主循环中两个延时各500ms,交替执行BRR和BSRR操作。