一、工程搭建步骤
- 新建Keil工程,芯片选择
STM32F103C8T6。 - 在工程中新建分组,添加STM32标准库文件:
stm32f10x_gpio.c、stm32f10x_rcc.c等。 - 添加头文件路径,在C/C++选项配置宏定义
STM32F10X_MD,USE_STDPERIPH_DRIVER。 - 魔术棒Debug选项,选择
Use Simulator软件仿真,配置DLL参数,用于逻辑分析仪波形采集。 - 新建
main.c文件,编写主程序代码。
二、实验代码 main.c
代码说明
头文件包含:
stm32f10x.h是标准库总头文件,stm32f10x_gpio.h与stm32f10x_rcc.h分别提供 GPIO 和时钟控制相关的函数声明与结构体定义。延时函数:
Delay()使用空循环实现粗略延时。由于循环次数固定,每次调用约延时 1ms 左右,但实际时长受编译器优化等级和仿真环境影响,精度不高。GPIO 初始化:
先调用RCC_APB2PeriphClockCmd使能 GPIOA 的时钟。STM32 外设默认时钟关闭,必须先开启时钟才能操作寄存器。
配置GPIO_InitStructure结构体,将 PA0、PA1、PA2 设置为推挽输出模式,最大翻转速度 50MHz。
调用GPIO_Init将配置写入寄存器。流水灯逻辑:主循环中依次将 PA0、PA1、PA2 置为高电平,其余两路置为低电平,每次切换后调用
Delay()延时约 1 秒,形成三路 LED 轮流点亮的流水效果。
三、软件仿真(逻辑分析仪)
- 编译工程无报错,进入 Debug 调试模式。
- 打开逻辑分析仪
Logic Analyzer,点击 Setup,添加引脚信号:PORTA.0、PORTA.1、PORTA.2。 - 运行仿真,等待 15s 后停止仿真。
- 使用 Zoom Out 横向拉宽时间轴,观察三路引脚方波时序,截图保存波形。
四、硬件接线
LED 负极接 PA0、PA1、PA2;LED 正极接 3.3V 电源。
五、实验现象
- 仿真波形:逻辑分析仪采集得到三路方波,PA0、PA1、PA2 电平依次翻转,间隔约 1 秒。
- 实物现象:下载程序到开发板后,PA0、PA1、PA2 外接 LED 轮流点亮,循环往复。
六、实验遇到的问题及解决
- 逻辑分析仪看不到波形
解决:确认添加 PORTA.0/PORTA.1/PORTA.2 信号;必须先进入调试模式,再打开逻辑分析仪。 - 下载到开发板 LED 不亮
解决:检查 ST-Link 接线、供电;核对引脚是否为 PA0/PA1/PA2;确认高低电平逻辑。 - 延时不准
解决:软件 for 循环延时本身精度差,后续实验改用 SysTick 硬件定时器提高定时精度。
七、实验总结
本次实验使用标准外设库完成 GPIO 初始化,实现流水灯。固件库对底层寄存器做了封装,代码可读性高,开发简单。
软件延时代码简单,但是定时精度差,受仿真、编译器影响。后续实验将使用 SysTick 系统滴答定时器,实现高精度定时,并对比两种延时方式波形差异。