STM32F103 GPIO标准外设库四灯流水灯实验报告(任务二·Keil5版)
一、实验目的1. 在实验一HAL库四灯流水灯的基础上掌握使用STM32标准外设库Standard Peripheral LibrarySPL控制GPIO端口实现LED流水灯的方法。2. 掌握在Keil5MDK-ARM中手动建立工程、添加STM32标准外设库文件.c、.h的完整过程。3. 理解软件循环延时实现LED亮灭周期的原理并分析其准确周期。4. 对比标准外设库与HAL库两种开发方式的异同。二、实验器材器材说明STM32F103最小系统板Cortex-M3内核72MHz主频自带PC13板载LEDST-Link下载器程序烧录与调试LED发光二极管 × 3红、绿、蓝各一只外部LED面包板及杜邦线电路连接220Ω限流电阻 × 3保护外部LED和GPIO引脚PC电脑 Keil5MDK-ARM 标准外设库开发环境三、实验原理3.1 标准外设库概述STM32标准外设库SPL是ST官方提供的一套底层固件库将寄存器操作封装成函数例如GPIO_Init()配置引脚、RCC_APB2PeriphClockCmd()使能时钟。相比HAL库标准外设库更贴近寄存器、代码简洁是Keil5下经典的STM32开发方式。3.2 GPIO控制原理标准外设库中引脚配置通过GPIO_InitTypeDef结构体与GPIO_Init()完成电平控制通过GPIO_SetBits()高电平和GPIO_ResetBits()低电平实现。本实验沿用实验一的四个LED及电平逻辑PC13板载LED低电平点亮PC14、PA4、PB1三个外部LED高电平点亮。四、实验步骤一在Keil5中创建工程并添加标准外设库文件1. 下载STM32F10x标准外设库如STM32F10x_StdPeriph_Lib_V3.5.0解压后记录Libraries目录位置其中包含CMSIS与STM32F10x_StdPeriph_Driver两个子目录。2. 启动Keil5μVision点击菜单 Project → New μVision Project选择工程保存路径并命名如LEDflow_SPL保存。3. 在弹窗中选择芯片型号ARM → STMicroelectronics → STM32F1xx → STM32F103 → 选择STM32F103RCT6或C8T6点击OK。4. 系统提示Copy STM32 Startup Code to Project Folder?是否拷贝启动文件“选择是”工程自动添加启动文件startup_stm32f10x_hd.s。5. 在左侧Project窗口右键Target1选择Manage Project Items建立如下分组并添加库文件LEDflow_SPL工程 ├─ User/# main.c、stm32f10x_it.c ├─ StdPeriph_Driver/│ ├─ stm32f10x_gpio.c │ ├─ stm32f10x_rcc.c │ └─ stm32f10x_flash.c ├─ Startup/# startup_stm32f10x_hd.s └─ CMSIS/├─ core_cm3.c └─ system_stm32f10x.c6. 添加头文件路径点击工程按钮 Options for Target或AltF7切换到 C/C 选项卡在 Include Paths 中依次添加CMSIS STM32F10x_StdPeriph_Driver/inc User7. 在 C/C 选项卡的 Define 框填入宏定义USE_STDPERIPH_DRIVER, STM32F10X_HD大容量芯片用HD中容量用MD。8. 配置下载调试器切换到 Debug 选项卡选择 ST-Link Debugger再进入 Flash Download 勾选 Reset and Run便于下载后自动运行。9. 将编写好的main.c放入User分组点击编译F7无误后点击下载F8烧录到开发板。二编写主程序main.c中使用标准外设库函数完成时钟使能、GPIO配置与四灯流水控制代码如下#includestm32f10x.hvoidRCC_Configuration(void);voidGPIO_Configuration(void);voidDelay(__IOuint32_tnCount);intmain(void){RCC_Configuration();GPIO_Configuration();while(1){// 1. PC13板载LED亮其余灭GPIO_ResetBits(GPIOC,GPIO_Pin_13);GPIO_SetBits(GPIOC,GPIO_Pin_14);GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOB,GPIO_Pin_1);Delay(0x00100000);// 2. PC14蓝灯亮其余灭GPIO_SetBits(GPIOC,GPIO_Pin_13);GPIO_SetBits(GPIOC,GPIO_Pin_14);GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOB,GPIO_Pin_1);Delay(0x00100000);// 3. PA4红灯亮其余灭GPIO_SetBits(GPIOC,GPIO_Pin_13);GPIO_ResetBits(GPIOC,GPIO_Pin_14);GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOB,GPIO_Pin_1);Delay(0x00100000);// 4. PB1绿灯亮其余灭GPIO_SetBits(GPIOC,GPIO_Pin_13);GPIO_ResetBits(GPIOC,GPIO_Pin_14);GPIO_ResetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOB,GPIO_Pin_1);Delay(0x00100000);}}voidRCC_Configuration(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);}voidGPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PinGPIO_Pin_13;GPIO_Init(GPIOC,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_14;GPIO_Init(GPIOC,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_4;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_InitStructure.GPIO_PinGPIO_Pin_1;GPIO_Init(GPIOB,GPIO_InitStructure);// 上电全部熄灭GPIO_SetBits(GPIOC,GPIO_Pin_13);GPIO_ResetBits(GPIOC,GPIO_Pin_14);GPIO_ResetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOB,GPIO_Pin_1);}voidDelay(__IOuint32_tnCount){for(;nCount!0;nCount--);}五、软件循环延时周期分析LED的亮灭周期通过软件空循环Delay()实现voidDelay(__IOuint32_tnCount){for(;nCount!0;nCount--);}该函数的核心是一条空for循环每一轮循环执行的耗时取决于以下三个因素因素说明系统主频本实验为72MHz一个CPU时钟周期约1/72MHz ≈ 13.9ns编译优化等级Keil中默认-O0不优化时循环完整保留优化等级高时可能被优化掉导致延时失效汇编指令数-O0下每轮约34条指令加载、减法、比较、跳转共约4个CPU周期因此在72MHz、Keil默认-O0条件下每一轮循环耗时的近似值为单轮耗时 ≈4×13.9ns ≈55ns由此可估算延时延时 ≈ nCount × 55ns。例如Delay(0x00100000)1048576次约延时57ms要接近1秒nCount应约为18×10^6约0x1100000。结论软件循环延时周期的准确值不是固定常数它依赖主频、编译优化等级和编译器版本只能给出量级估算。若要获得精确、稳定的1秒延时应改用SysTick定时器调用SysTick_Config()或硬件定时器实现。六、实验现象上电后四个LED按照以下顺序循环点亮每一盏灯点亮约0.81秒由Delay()循环次数决定PC13板载LED亮 → PC14蓝灯亮 → PA4红灯亮 → PB1绿灯亮 → 循环。任意时刻只有一个LED点亮实现亮灯依次流动的流水灯效果。使用逻辑分析仪观测DBG_PA0、DBG_PA1、DBG_PA2三个LED引脚得到如图1所示的时序波形三个通道输出周期性方波波形之间存在固定的时序偏移印证了四灯按顺序依次点亮的流水灯时序。七、实验中遇到的问题及解决方法问题原因解决方法编译报错找不到头文件未在Include Paths中添加头文件路径在Options for Target的C/C中配置Include PathsGPIO无效或时钟异常未使能GPIO端口时钟调用RCC_APB2PeriphClockCmd()使能对应端口时钟条件编译报错缺少宏定义在C/C的Define中添加USE_STDPERIPH_DRIVER与STM32F10X_HD延时周期不准空循环延时依赖主频与优化等级改用SysTick或硬件定时器实现精确延时八、实验总结本次实验在实验一的基础上改用STM32标准外设库通过Keil5完成了四灯流水灯实验。通过手动添加标准外设库文件掌握了Keil5工程的建立、分组管理、头文件路径配置与宏定义设置方法理解了标准外设库与HAL库在GPIO配置和电平控制上的差异。同时通过软件循环延时实验认识到空循环延时周期的估算方法及其不精确、依赖编译环境的特性为后续使用定时器实现精确延时的学习打下基础。

相关新闻

MySQL 5.7主从同步功能

MySQL 5.7主从同步功能

目录 一、环境准备 二、主库配置 1. 修改配置文件 2. 创建复制用户 3. 查看主库状态 三、从库配置 1. 修改配置文件 2. 配置主从同步 四、验证同步状态 1. 查看从库状态 2. 测试数据同步 五、MySQL主从同步与Canal、Otter在功能上的区别 六、创建mysql用户并赋权&…

2026/9/30 10:59:48 阅读更多 →
Linux核心操作与文件管理:通配符、权限、find与tar实践指南

Linux核心操作与文件管理:通配符、权限、find与tar实践指南

很多刚开始接触 Linux 的朋友,最容易卡住的地方往往不是某个复杂软件配置,而是像通配符、用户权限、find 搜索、归档压缩这些看似基础、实则贯穿日常所有操作的核心能力。这些命令单个拆开看都不难,可一旦组合起来,很多人就会懵—…

2026/9/30 10:58:44 阅读更多 →
Flask+Vue家政保洁预约系统:角色权限与订单状态机实战

Flask+Vue家政保洁预约系统:角色权限与订单状态机实战

做家政保洁预约系统,一开始我以为就是把“用户下单、师傅接单”这两件事串起来就完事了。真把需求理清之后才发现,这里面的角色远比想象中多:用户要看价格、要选时段,保洁员要接单、要上传完工照片,老板要排班、要核销…

2026/9/30 10:58:44 阅读更多 →

最新新闻

iperf网络性能测试实战:从带宽测量到链路质量排查

iperf网络性能测试实战:从带宽测量到链路质量排查

说实话,网络问题排查是我日常工作中最讨厌的环节之一。上一秒还正常的服务,下一秒用户就反馈“页面打不开”,可你敲 ping 一切正常,看 CPU、内存也没毛病,最后折腾半天才发现问题出在链路质量上。这种时候,…

2026/9/30 11:40:53 阅读更多 →
UE5 EasyFog雾效实战:从安装、调参到蓝图动态控制

UE5 EasyFog雾效实战:从安装、调参到蓝图动态控制

做UE5场景氛围的时候,我习惯先往关卡里拖一个EasyFog把雾效底子立起来,再去慢慢调光照和颜色。这篇 UE5 EasyFog 使用教程不是把文档复读一遍,而是把我自己从插件安装、第一团雾出现、参数调整到蓝图动态控制的完整过程整理出来。如果你正在做…

2026/9/30 11:40:53 阅读更多 →
C++解力扣两数相加:链表模拟进位与边界调试全解析

C++解力扣两数相加:链表模拟进位与边界调试全解析

力扣第2题,两数相加,算得上是我入坑 C 刷题之后认真吃透的第一道链表题。之前看这题以为只是简单的“加一加”,真正手动把两个逆序链表过一遍边界之后才发现,里面藏了不少容易翻车的细节。这题在力扣热题 100 里排得很靠前&#x…

2026/9/30 11:40:53 阅读更多 →
跨系统数据通道架构实战:从点对点脚本到组件化方案

跨系统数据通道架构实战:从点对点脚本到组件化方案

跨系统数据通道,说白了就是把多个业务系统之间的数据流动管起来。我去年有一段时间,几乎天天在处理这类问题:ERP要往数仓推数据,CRM又要从数仓取客户标签,订单系统还要实时告诉库存系统发生了增减,每一组关…

2026/9/30 11:40:53 阅读更多 →
打印机工具箱怎么配:驱动、共享报错与维护全攻略

打印机工具箱怎么配:驱动、共享报错与维护全攻略

经常有朋友跑来问我:打印机又连不上了,驱动装了好几遍还是不行,共享打印老是报错,到底有没有一个"工具箱"能把问题全搞定?我的答案是:有,但这个"工具箱"并不是某一个单一的…

2026/9/30 11:40:53 阅读更多 →
基于JSP的课程评价系统设计与部署全攻略

基于JSP的课程评价系统设计与部署全攻略

课程评价系统这类题目,在计算机毕业设计里属于“看起来不惊艳、但做出来很有东西”的典型代表。我做过多届JavaWeb方向的毕设指导,也亲手带着学生把一个基于JSP的课程评价系统从零跑到上线,这里想把这个项目的完整思路、设计细节、编码套路和…

2026/9/30 11:39:52 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →