尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
实验2 3
实验任务2标准外设库方式控制LED流水灯1工程项目创建与标准外设库文件添加详细过程1新建工程文件夹结构一、创建一个keil工程寄存器版)打开keil点击Project选择New uVision Project选择 CPU 型号根据开发板进行选择在线添加库文件用寄存器控制 STM32 时不需要在线添加库文件可以直接关掉。添加文件①添加已经存在文件在新建的工程中添加启动文件startup_stm32f10x_hd.s该文件可以先到固件库中复制到此处startup_stm32f10x_hd.s。②创建新文件stm32f10x.h手动新建用于存放寄存器映射的代码暂时为空。main.c手动新建用于存放 main 函数暂时为空。配置魔术棒选项卡①Target设置②Output设置③Listing设置④Debug设置⑤Utilities设置⑥Debug Settings设置3标准外设库方式LED流水灯代码#include “stm32f10x.h”#include “stm32f10x_gpio.h”#include “stm32f10x_rcc.h”/* 软件延时函数约1秒 */void Delay_ms(unsigned int ms){unsigned int i, j;for(i 0; i ms; i)for(j 0; j 7200; j);}int main(void){GPIO_InitTypeDef GPIO_InitStructure;/* 使能GPIOA、GPIOB、GPIOC时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); /* 配置PA0、PB9、PC13为推挽输出 */ GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_13; GPIO_Init(GPIOC, GPIO_InitStructure); /* 初始全部熄灭 */ GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOB, GPIO_Pin_9); GPIO_SetBits(GPIOC, GPIO_Pin_13); while(1) { /* PA0点亮 */ GPIO_ResetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOB, GPIO_Pin_9); GPIO_SetBits(GPIOC, GPIO_Pin_13); Delay_ms(1000); /* PB9点亮 */ GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOB, GPIO_Pin_9); GPIO_SetBits(GPIOC, GPIO_Pin_13); Delay_ms(1000); /* PC13点亮 */ GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOB, GPIO_Pin_9); GPIO_ResetBits(GPIOC, GPIO_Pin_13); Delay_ms(1000); }2LED亮/灭周期分析与Keil逻辑分析仪观察可以观察并计算得知1. GPIO端口输出波形分析从 Logic Analyzer 中可以看到三路输出波形红、绿、蓝分别对应代码中操作 GPIOA 的 PA0、PA1、PA2 端口。波形特征三路波形呈现顺序脉冲的形态并非同时跳变。代码逻辑对应结合下方main.c第71行GPIO_Write(GPIOA, led_pins[led_index]);以及注释001 - 010 - 100 - 001可以断定红色波形通道0/PA0表现为高电平1其余为低电平0对应001。绿色波形通道1/PA1表现为高电平1其余为低电平0对应010。蓝色波形通道2/PA2表现为高电平1其余为低电平0对应100。三者按照红 - 绿 - 蓝的顺序依次输出高电平形成循环流水灯效果。2. 时序状态正确性判断时序状态完全正确。逻辑正确波形展示了1-0,0-1的交替完美执行了代码中依次递增led_index并查表输出的逻辑。无重叠No Overlap从波形可以清晰看出当一路如红色拉高时另外两路必定处于低电平未出现两个或三个LED同时点亮的情况。这严格符合代码注释中的要求No overlap between ON states。3. 高低电平转换周期LED闪烁周期计算可以通过 Command 窗口底部的精准打印信息UVA measured均为代码内部计时打印来进行确切计算这比肉眼观察示波器的时间轴更精确高电平持续时间PA0 HIGH 0.99999994 s≈1.0 秒即单个LED点亮的时间低电平持续时间PA0 LOW 1.99999903 s≈2.0 秒即该LED熄灭、等待其他两个LED点亮的时间LED闪烁总周期PERIOD 2.99999847 s≈3.0 秒高电平 低电平 1 2 3秒结论代码逻辑正确时序无重叠。系统以 1 秒为间隔顺序切换三路LED每一路亮1秒、灭2秒单个LED完整的闪烁周期为3秒。实验任务3HAL库按键中断控制流水灯暂停/恢复1实验要求改用HAL库控制流水灯增加一个按键第一次按下按键时暂停流水灯当前LED保持点亮再次按下按键时恢复运行接着暂停前剩余时间继续计时。2HAL库按键中断配置#include “stm32f1xx_hal.h”#define KEY_PIN GPIO_PIN_11#define KEY_PORT GPIOBstatic void KEY_EXTI_Init(void){GPIO_InitTypeDef gpio {0};__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); gpio.Pin KEY_PIN; gpio.Mode GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio.Pull GPIO_PULLUP; /* 内部上拉 */ HAL_GPIO_Init(KEY_PORT, gpio); /* 使能EXTI15_10中断线 */ HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1U, 0U); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);4中断处理与流水灯控制逻辑采用“中断提交请求、主循环处理请求”的方法中断函数只翻转一个状态标志主循环检测标志后执行暂停/恢复逻辑。这样可以缩短中断执行时间避免在中断中使用阻塞延时/* 全局变量/volatile uint8_t run_flag 1; /1运行0暂停 */uint32_t last_tick 0;uint8_t led_index 0;/* 中断回调函数由HAL_GPIO_EXTI_IRQHandler调用/void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){if (GPIO_Pin KEY_PIN){run_flag !run_flag; /翻转运行状态 */}}/* LED控制函数/void LED_Set(uint8_t index){/先全部熄灭 */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_RESET);/* 点亮指定LED */ switch(index) { case 0: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); break; /* 蓝 */ case 1: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); break; /* 红 */ case 2: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); break; /* 绿 */ } /* 主循环 */ while (1) { if (run_flag) { uint32_t now HAL_GetTick(); if (now - last_tick 1000) { last_tick now; led_index (led_index 1) % 3; LED_Set(led_index); } } /* run_flag0时什么都不做当前LED保持点亮 */ }5中断处理流程说明当按键按下时PB11电平由高变低产生下降沿触发EXTI11中断硬件自动进入EXTI15_10_IRQHandler()HAL库调用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11)该函数清除中断标志位然后调用弱定义的HAL_GPIO_EXTI_Callback()重写的回调函数翻转run_flag流水灯hal控制五、问题与改进软件延时不准实际项目应使用定时器中断或系统滴答定时器产生精确延时。按键抖动机械按键可能多次触发中断可加 10~20ms 软件消抖或硬件 RC 滤波。PC13 板载 LED低电平点亮编程时注意逻辑反转。逻辑分析仪使用需勾选 Debug Information添加信号时写完整名称如GPIOA_ODR.0否则可能显示 Unknown Signal。六、心得体会通过本次实验掌握了 STM32 GPIO 的三种开发方式理解了时钟使能、端口配置、电平控制、外部中断和软件仿真调试的基本流程。寄存器方式有助于深入理解硬件标准库和 HAL 库则提高了开发效率。逻辑分析仪是验证时序的有效工具按键中断实验进一步强化了“中断快进快出、主循环处理任务”的设计思想为后续定时器、串口、RTOS 等复杂应用打下基础。Information添加信号时写完整名称如GPIOA_ODR.0否则可能显示 Unknown Signal。
RELATED

相关推荐

无需权限就能窥探你的每一次敲击:操作系统里藏了二十年的“文件通知窃听器”被揭开了

无需权限就能窥探你的每一次敲击:操作系统里藏了二十年的“文件通知窃听器”被揭开了

你的电脑正在不停地“说话”。每按一次键盘、每打开一个网页、每插拔一次U盘,操作系统都会向所有订阅者广播一条消息:某个文件被访问了,某个目录被改动了。这本来是件好事——文本编辑器靠它感知文件变化,网盘同步工具靠它判断该上…

📅 2026/9/30 17:15:01
华为 MetaERP 的总账(GL)不是“把 Oracle/SAP 的 GL 抄一遍”,而是用云原生 + 元数据驱动 + 事件驱动会计把传统“子账→接口表→总账批处理”重构为“业务事件→会计引擎→多账

华为 MetaERP 的总账(GL)不是“把 Oracle/SAP 的 GL 抄一遍”,而是用云原生 + 元数据驱动 + 事件驱动会计把传统“子账→接口表→总账批处理”重构为“业务事件→会计引擎→多账

华为 MetaERP 的总账(GL)不是“把 Oracle/SAP 的 GL 抄一遍”,而是用云原生 元数据驱动 事件驱动会计把传统“子账→接口表→总账批处理”重构为“业务事件→会计引擎→多账簿实时入账”。下面按你要的四块讲:设计哲学 → 核心模…

📅 2026/9/30 17:09:58
基于Spring Boot与Vue3的现代化影视管理实战:深入解析Kinema开源项目架构与全栈开发部署指南

基于Spring Boot与Vue3的现代化影视管理实战:深入解析Kinema开源项目架构与全栈开发部署指南

基于Spring Boot与Vue3的现代化影视管理实战:深入解析Kinema开源项目架构与全栈开发部署指南 在软件开发的学习与实践中,选择一个功能完备且技术栈新颖的开源项目作为参考,往往能起到事半功倍的效果。GitHub上的chillzhuang/Kinema项目正是这…

📅 2026/9/30 17:09:58
MORE NEWS

更多资讯

📰

Python图像处理实战:多进程、装饰器与HSV筛选优化实时帧率

手里正好在做一个视觉检测的小项目,要在连续视频流里实时框出特定颜色的目标物。最开始用单线程跑OpenCV,1080p的视频流大概只能跑到12帧左右,卡得让人崩溃。后来把三样东西组合在一起——进程线程做并行处理、装饰器做管线解耦、HSV颜色筛选…

📰

Python库生态实战:标准库与第三方库选型及pip管理指南

写Python写了这几年,被问得最多的一个问题不是“这个功能怎么写”,而是“我有一个需求,该装什么库”。说实话,Python这两年的热度,一半功劳要记在它的生态上——标准库让最常用的功能开箱即用,第三方库让复…

📰

Vue3+Vite环境下文档在线预览全攻略:PDF/DOCX/PPTX内外网与移动端适配

最近被安排了一个听上去很标准的预览需求:在 vue3 vite 项目里在线预览 docx、pdf、pptx,文件可能来自外网也可能来自纯内网环境,而且用户会在手机上打开。等真正动手做才发现,这个需求就像一棵挂满装饰品的圣诞树,每…

📰

新手用 DeepSeek 画流程图,怎么导进 Word 不糊?DS随心转 实操

做技术方案、写复盘、讲流程的时候,一张流程图顶得过半页文字。好在现在的模型都会画流程图——你让 DeepSeek 输出一段 Mermaid 代码,它就能描述出一张完整的图。但新手常卡在下一步:代码有了,怎么让它清清楚楚地进到 Word 里&am…

📰

生物医药与智能装备工程专硕开题论证:基于临床规范与工程工况的可行性设计

生物医药与智能装备工程专硕开题论证:基于临床规范与工程工况的可行性设计在工程类专业硕士(生物与医药、机械工程、电子信息等)的培养全周期中,开题报告的答辩审查具有鲜明的应用导向。由企业工程导师与校内学术导师联合组成的答…

📰

Univer 表格渲染引擎实战:Canvas 渲染、Facade API 与 Node.js 服务端集成

1. 从“univer”这个标题说起:它到底是什么,能解决什么问题第一次看到“univer”这个词,很多人会以为是“universe”的缩写,或者某个开源社区的花名。实际上,在表格与文档协同这个圈子里,Univer 是一个挺有…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬