news 2026/9/30 5:49:58

实验二:标准外设库方式流水灯与Keil仿真

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
实验二:标准外设库方式流水灯与Keil仿真

一、实验目的

  1. 掌握STM32标准外设库(SPL)的工程搭建与GPIO库函数用法;
  2. 用标准外设库实现LED轮流闪烁;
  3. 使用Keil软件仿真逻辑分析仪观察GPIO输出波形,分析闪烁周期。

二、实验硬件

元件引脚说明
红色LEDPA0高电平亮
蓝色LEDPA2高电平亮
绿色LEDPB0高电平亮
板载LEDPC13低电平亮

三、工程项目创建与添加库文件详细过程

3.1 新建Keil工程

  1. 打开Keil μVision5 → Project → New μVision Project;
  2. 选择保存路径,命名为Task2_SPL;
  3. 器件选择窗口选STMicroelectronics → STM32F1 Series → STM32F103 → STM32F103C8;
  4. 弹出"Manage Run-Time Environment",先点Cancel,后面手动加库。

3.2 目录结构

在工程文件夹下建立如下结构:

Task2_SPL/ ├── Libraries/ │ ├── inc/ (标准外设库头文件) │ │ ├── stm32f10x.h │ │ ├── stm32f10x_gpio.h │ │ ├── stm32f10x_rcc.h │ │ ├── core_cm3.h │ │ ├── system_stm32f10x.h │ │ └── stm32f10x_conf.h │ └── src/ (标准外设库源文件) │ ├── stm32f10x_gpio.c │ ├── stm32f10x_rcc.c │ ├── system_stm32f10x.c │ └── misc.c ├── Startup/ │ └── startup_stm32f10x_md.s (启动文件) ├── User/ │ └── main.c └── Listings/ Objects/ (编译输出)

3.3 添加源文件到Keil

  1. 在Keil左侧Project面板,右键Source Group 1→ Add Existing Files;
  2. 选择Libraries/src/下的:
    • stm32f10x_gpio.c
    • stm32f10x_rcc.c
    • system_stm32f10x.c
    • misc.c
  3. 再把startup_stm32f10x_md.s和User/main.c加进来。

3.4 配置头文件路径与宏

  1. 右键工程 →Options for Target(或按Alt+F7);

  2. 切到C/C++选项卡:

    • Include Paths点…加入:

      ../Libraries/inc ../User
    • Define框中填入:USE_STDPERIPH_DRIVER, HSE_VALUE=8000000

  3. 切到Debug选项卡:

    • 选Use Simulator(软件仿真);
    • 点Settings→ 仿真选项卡中Dialog DLL保持默认;
  4. 点OK保存。


四、程序代码

#include"stm32f10x.h"/* 软件延时约1ms(8MHz主频粗略值) */voidDelay_ms(volatileunsignedintms){unsignedinti,j;for(i=0;i<ms;i++)for(j=0;j<800U;j++){;}}intmain(void){GPIO_InitTypeDef GPIO_InitStruct;/* 1. 开GPIOA/B/C和AFIO时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);/* 2. PA0、PA2 推挽输出50MHz */GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);/* 3. PB0 推挽输出50MHz */GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_Init(GPIOB,&GPIO_InitStruct);/* 4. PC13 推挽输出50MHz */GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_Init(GPIOC,&GPIO_InitStruct);/* 5. 初始全灭:外接灯写0,板载灯写1 */GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2);GPIO_ResetBits(GPIOB,GPIO_Pin_0);GPIO_SetBits(GPIOC,GPIO_Pin_13);/* 6. 流水循环 */while(1){/* 红灯 PA0 */GPIO_SetBits(GPIOA,GPIO_Pin_0);Delay_ms(1000);GPIO_ResetBits(GPIOA,GPIO_Pin_0);/* 蓝灯 PA2 */GPIO_SetBits(GPIOA,GPIO_Pin_2);Delay_ms(1000);GPIO_ResetBits(GPIOA,GPIO_Pin_2);/* 绿灯 PB0 */GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(1000);GPIO_ResetBits(GPIOB,GPIO_Pin_0);/* 板载灯 PC13(低电平亮) */GPIO_ResetBits(GPIOC,GPIO_Pin_13);Delay_ms(1000);GPIO_SetBits(GPIOC,GPIO_Pin_13);}}

五、Keil软件仿真逻辑分析仪观察波形

5.1 操作步骤

  1. 编译通过后按Ctrl+F5进入Debug仿真;
  2. 菜单View → Analysis Windows → Logic Analyzer;
  3. 在弹出的Logic Analyzer窗口点Setup(左上角);
  4. 点New(Insert),依次添加:
    • PORTA.0(红灯)
    • PORTA.2(蓝灯)
    • PORTB.0(绿灯)
  5. 每个信号的Display Type改为Bit;
  6. 点Close,然后按F5运行;
  7. 波形绘制出来后,用Zoom In/Out调整时间轴。

5.2 仿真波形图

5.3 波形分析

信号引脚高电平时间低电平时间周期
红色PA0约1s约3s约4s
蓝色PA2约1s约3s约4s
绿色PB0约1s约3s约4s
  • 三个引脚均为方波,高电平宽度约1秒,对应每只灯点亮的时间;
  • 低电平约3秒,对应其余3只灯轮流亮的时间;
  • 三路信号相位依次错开,符合流水灯逻辑;
  • 高低电平转换周期(LED闪烁周期)实测约为1秒,与软件延时目标值基本一致;
  • 软件循环延时不是精确1秒,受编译器优化和指令周期影响,若需精确周期应改用SysTick定时器。

六、实验总结

通过本实验,掌握了标准外设库的工程搭建方法,学会了用库函数(RCC_APB2PeriphClockCmd、GPIO_Init、GPIO_SetBits等)快速配置GPIO,并使用Keil逻辑分析仪直观观察到了流水灯的输出时序波形,验证了代码逻辑的正确性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 5:49:12

Windows环境变量配置指南:Path、JAVA_HOME与多版本切换

上个月帮同事看一台新装的开发机&#xff0c;命令行敲java -version直接甩回一句"不是内部或外部命令"&#xff0c;他盯着屏幕上明明已经装好的 JDK 一脸茫然。这种场景我在 Windows 上见过太多次了——软件装完了&#xff0c;就是跑不起来&#xff0c;八成是环境变量…

作者头像 李华
网站建设 2026/9/30 5:48:40

RAG文本分块全解析:策略选择与工程调优实战指南

上周在处理一个RAG项目时&#xff0c;客户反馈检索效果始终不理想。换过embedding模型、调过召回阈值、重排逻辑也改了三版&#xff0c;效果始终差一口气。排查到最后才发现&#xff0c;问题根源既不在向量化&#xff0c;也不在检索链路&#xff0c;而是卡在了一个绝大多数团队…

作者头像 李华
网站建设 2026/9/30 5:48:40

操作系统文件管理核心考点:从概念到计算题的全梳理

期末复习到操作系统&#xff0c;大家最头疼的往往不是进程管理&#xff0c;就是文件管理。进程管理好歹讲的是“动态”的东西&#xff0c;顺着状态转换还能推&#xff1b;文件管理一上来就是文件、目录、FCB、索引结点、位示图、成组链接&#xff0c;概念又多又碎&#xff0c;算…

作者头像 李华
网站建设 2026/9/30 5:47:44

Jev模型TypeSafe AI实战:Python接入、Codex集成与报错排查指南

1. 这个 Jev 模型到底是个什么东西Jev 模型最近在技术圈里刷屏刷得厉害&#xff0c;我身边好几个做 AI 应用的朋友都在群里问“这玩意儿到底怎么用”“跟其他模型比强在哪”。我花了大概三天时间&#xff0c;从申请密钥到实际跑通几个场景&#xff0c;把整个流程摸了一遍。这篇…

作者头像 李华
网站建设 2026/9/30 5:47:33

手写 JS 动画函数:requestAnimationFrame 与缓动优化

1. 手写动画函数这件事&#xff0c;到底还有没有必要1.1 从一次"CSS 动画不听话"的真实场景说起前两年做过一个数据看板&#xff0c;里面有根横向进度条&#xff0c;需求是&#xff1a;随着数据分批返回&#xff0c;进度条一点点往前爬&#xff0c;中途如果某批数据校…

作者头像 李华
网站建设 2026/9/30 5:46:49

公共管理服务接入DeepSeek:场景盘点、架构选型到落地避坑全拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华