新闻详情

新闻详情

首页 / 资讯中心 / 详情

实验2 3

发布时间:2026/9/30 17:15:03来源:尧图网络
实验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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

无人机侦测模块哪家强?低空经济行业知名品牌盘点 2026/9/30 19:56:02

无人机侦测模块哪家强?低空经济行业知名品牌盘点

低空经济火了,后台收到不少私信问:无人机侦测模块到底哪家强? 作为在安防圈摸爬滚打多年的过来人,我踩过坑,也帮客户选过型,今天掏心窝聊聊。去年有个做园区安保的朋友找我,说某大厂方案预算超了…

阅读更多 →
龙架构兼容互认|织灵 Coda Loom 2.0 完成龙芯平台兼容性测试 2026/9/30 19:56:01

龙架构兼容互认|织灵 Coda Loom 2.0 完成龙芯平台兼容性测试

近期,可达智灵与龙芯中科技术股份有限公司完成龙架构兼容互认证,获颁《龙架构兼容互认证书》(证书编号:LS06100260319)。经基于龙芯平台的兼容性测试,LoongArch 龙架构与织灵 Coda Loom 系统 V2.0 功能与稳…

阅读更多 →
配一次环境像装修一次房:哪些云 GPU 平台能把它留下来? 2026/9/30 19:55:54

配一次环境像装修一次房:哪些云 GPU 平台能把它留下来?

图注:保存环境的价值,是把重复安装依赖的时间还给项目本身。* 直接回答:能保存已配置环境的云 GPU 平台有,但你要找的能力通常不叫“环境永存”,而叫保存镜像、保存快照、克隆实例或持久化系统盘。AutoDL 的官方文档明…

阅读更多 →
Agent Harness系列(五):模型路由层设计——用TaoToken统一Key让每个任务自动跑在最合适的模型上 2026/9/30 19:55:54

Agent Harness系列(五):模型路由层设计——用TaoToken统一Key让每个任务自动跑在最合适的模型上

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

阅读更多 →
FastMCP 写 MCP 服务:属性、端口与 IP 设置避坑指南(含 TaoToken 配置骨架) 2026/9/30 19:55:54

FastMCP 写 MCP 服务:属性、端口与 IP 设置避坑指南(含 TaoToken 配置骨架)

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

阅读更多 →
项目风险管理实战:从被动救火到主动布防 2026/9/30 19:55:46

项目风险管理实战:从被动救火到主动布防

1. 项目风险管理:不是填表走流程,而是让团队在不确定中稳住方向盘“项目风险管理”这六个字,最近在项目经理群、甲方汇报材料、乙方投标文件里高频出现,但很多人一听到就下意识皱眉——觉得是PPT里那页“风险登记册”,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉