
实验任务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。