尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

实验2-标准外设库流水灯实验报告

实验2-标准外设库流水灯实验报告 实验2标准外设库GPIO控制流水灯实验项目内容实验平台STM32F103C8T6最小系统核心板开发环境Keil uVision5、STM32F10x标准外设库V3.5.0实验日期2026年9月29日一、实验目的掌握Keil MDK下基于STM32标准外设库的工程创建流程学会手动添加库文件.c/.h与配置编译参数掌握标准外设库中GPIO初始化、电平输出相关库函数的使用方法对比寄存器开发的差异学会使用Keil内置软件仿真逻辑分析仪在无示波器条件下观测GPIO引脚时序波形分析软件循环延时的实际周期理解软件延时的误差来源与调试方法。二、实验硬件与功能要求1. 硬件接线所有LED均为低电平点亮外接LED需串联200Ω~1kΩ限流电阻接线对应关系LED类型连接GPIO引脚引脚参数核心板板载LEDPC13推挽输出最高2MHz速率红色外接LEDPA4推挽输出最高10MHz速率绿色外接LEDPB5推挽输出最高10MHz速率蓝色外接LEDPC14推挽输出最高2MHz速率2. 功能要求四个LED按照板载PC13 → 红灯PA4 → 绿灯PB5 → 蓝灯PC14的顺序轮流点亮任意时刻仅一个LED点亮循环运行通过软件循环实现延时。三、标准外设库工程创建与库文件添加步骤1. 工程目录规划新建工程总文件夹LED_Water_SPL在文件夹内创建以下子目录分类存放工程文件User存放用户main.c、中断处理文件、库配置文件CMSIS存放Cortex-M3内核与芯片适配文件Startup存放汇编启动文件FWlib/inc、FWlib/src分别存放标准外设库头文件、源文件Output存放编译输出的hex、obj文件Listing存放编译列表文件2. 复制标准库文件从ST官方STM32F10x_StdPeriph_Lib_V3.5.0库中复制对应文件目标目录复制文件说明CMSISCoreSupport/core_cm3.c、core_cm3.hCortex-M3内核通用文件CMSISDeviceSupport/.../stm32f10x.h、system_stm32f10x.c/.h芯片寄存器定义、系统时钟配置Startupstartup/arm/startup_stm32f10x_md.sSTM32F103C8T6为64KB Flash属于中等容量(md)FWlib/inc标准外设库inc目录下所有头文件外设函数声明FWlib/srcmisc.c、stm32f10x_gpio.c、stm32f10x_rcc.c本实验仅需RCC、GPIO、NVIC相关源文件User模板目录下stm32f10x_conf.h、stm32f10x_it.c/.h库功能配置、中断处理模板3. Keil新建工程打开Keil uVision5点击Project → New μVision Project保存到工程总目录命名为LED_Water在芯片选择窗口依次展开STMicroelectronics → STM32F1 Series → STM32F103C8点击OK弹出运行时环境管理窗口直接点击Cancel手动管理库文件。4. 添加工程分组与源文件点击工具栏工程管理图标删除默认分组新建STARTUP、CMSIS、FWlib、USER四个分组STARTUP分组添加startup_stm32f10x_md.s文件类型选择All filesCMSIS分组添加core_cm3.c、system_stm32f10x.cFWlib分组添加misc.c、stm32f10x_gpio.c、stm32f10x_rcc.cUSER分组添加stm32f10x_it.c与后续编写的main.c。5. 编译参数配置点击魔术棒图标打开工程配置Target页外部晶振频率填写8.0MHzOutput页输出目录选择Output文件夹勾选Create HEX File生成烧录文件Listing页列表输出目录选择Listing文件夹C/C页预处理宏定义填写STM32F10X_MD,USE_STDPERIPH_DRIVER头文件包含路径添加CMSIS、FWlib/inc、User优化等级默认设置为Level 0(-O0)避免空循环被优化Debug页选中Use Simulator使用软件仿真硬件烧录时再切换ST-Link。配置完成后编译工程0错误0警告即工程搭建完成。启动文件进入main前会自动调用SystemInit()默认将系统时钟配置为72MHz8MHz HSE × 9倍PLL。四、实验原理与库函数说明标准外设库将寄存器操作封装为函数与结构体开发时不需要直接记忆寄存器地址核心库函数RCC_APB2PeriphClockCmd()使能GPIO外设时钟等价于直接配置RCC_APB2ENR寄存器GPIO_InitTypeDefGPIO配置结构体包含引脚号、工作模式、翻转速率三个参数GPIO_Init()根据结构体参数自动配置GPIOx_CRL/CRH寄存器完成引脚初始化GPIO_SetBits()将指定引脚置高电平对应BSRR寄存器置位本实验中熄灭LEDGPIO_ResetBits()将指定引脚置低电平对应BSRR寄存器复位本实验中点亮LED。软件延时通过双层空循环消耗CPU时钟周期实现延时长度由系统时钟频率、编译优化等级、循环指令周期共同决定没有精确固定值需要通过仿真实际测量。五、实验程序代码/******************************************************************** * 文件名main.c * 功能STM32F103C8T6 标准外设库版四灯流水灯 * 板载 LEDPC13低电平点亮 * 外接 LEDRed - PA4Green - PB5Blue - PC14 * 顺序PC13 - PA4 - PB5 - PC14循环点亮 ********************************************************************/#includestm32f10x.h/* 软件循环延时单位约ms加volatile防止空循环被编译器优化 */voidDelay_ms(unsignedintms){unsignedinti;volatileunsignedintj;for(i0;ims;i)for(j0;j8000;j);}/* LED GPIO 初始化 */voidLED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;/* 1. 使能 GPIOA、GPIOB、GPIOC 时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);/* 2. 配置 PA4推挽输出10MHz */GPIO_InitStructure.GPIO_PinGPIO_Pin_4;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_10MHz;GPIO_Init(GPIOA,GPIO_InitStructure);/* 3. 配置 PB5推挽输出10MHz */GPIO_InitStructure.GPIO_PinGPIO_Pin_5;GPIO_Init(GPIOB,GPIO_InitStructure);/* 4. 配置 PC13、PC14推挽输出2MHz */GPIO_InitStructure.GPIO_PinGPIO_Pin_13|GPIO_Pin_14;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOC,GPIO_InitStructure);/* 5. 上电全灭低电平点亮输出高电平熄灭 */GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14);}/* 主函数 */intmain(void){LED_Init();while(1){/* PC13 板载 LED 点亮后熄灭 */GPIO_ResetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);GPIO_SetBits(GPIOC,GPIO_Pin_13);/* PA4 红灯点亮后熄灭 */GPIO_ResetBits(GPIOA,GPIO_Pin_4);Delay_ms(1000);GPIO_SetBits(GPIOA,GPIO_Pin_4);/* PB5 绿灯点亮后熄灭 */GPIO_ResetBits(GPIOB,GPIO_Pin_5);Delay_ms(1000);GPIO_SetBits(GPIOB,GPIO_Pin_5);/* PC14 蓝灯点亮后熄灭 */GPIO_ResetBits(GPIOC,GPIO_Pin_14);Delay_ms(1000);GPIO_SetBits(GPIOC,GPIO_Pin_14);}}六、软件仿真与时序分析1. 逻辑分析仪操作步骤编译工程后按CtrlF5进入软件仿真点击View → Analysis Windows → Logic Analyzer打开逻辑分析仪点击Setup通过信号浏览器添加对应引脚的ODR信号设置显示类型为Bit设置时间网格为0.5s全速运行数秒后停止观测波形。2. 实测波形3. 波形与周期分析时序正确性验证波形显示三个外接引脚按照红灯→绿灯→蓝灯的顺序依次拉低板载LED在每轮初始阶段拉低任意时刻最多一个引脚为低电平无重叠、无毛刺电平切换顺序与程序设计完全一致流水灯逻辑正确。实际周期测量网格刻度0.5s/格测量项实测值单个LED低电平点亮持续时间约0.5s相邻两个LED点亮的切换间隔约0.5s单个LED完整闪烁周期本次亮到下一次亮约2s高电平熄灭持续时间约1.5s误差原因分析代码中预期延时1秒实测约0.5秒原因是标准库将系统时钟从实验1的8MHz倍频到72MHz同样循环次数的执行时间随频率升高缩短同时C语言循环编译后存在固定指令开销软件延时本身不具备精确性属于正常现象可通过增大内层循环参数将延时调整至1秒。七、硬件实际运行演示将编译生成的hex文件烧录到核心板后流水灯实际运行效果如下实际硬件运行时LED点亮顺序、切换速度与仿真波形完全一致板载LED与三个外接LED均正常工作验证了程序与工程配置的正确性。八、实验总结掌握了STM32标准外设库工程从零搭建的完整流程理解了头文件路径、预处理宏、启动文件的作用对比寄存器开发方式标准外设库通过结构体与封装函数降低了开发门槛代码可读性与可移植性更好不需要记忆大量寄存器地址掌握了Keil软件仿真逻辑分析仪的使用方法可以在无硬件示波器的条件下快速定位引脚时序问题、测量实际延时理解了软件循环延时的局限性其精度受系统时钟、编译优化、中断影响很大实际产品开发中需要使用SysTick或硬件定时器实现精确延时。注意事项PC13/PC14/PC15为特殊引脚作为GPIO时最高仅支持2MHz翻转速率驱动能力有限外接LED必须串联限流电阻避免烧坏GPIO引脚或LED若核心板焊接了32.768kHz低速晶振PC14无法作为普通GPIO使用需要更换到其他空闲引脚。
返回列表