if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==0) { HAL_Delay(10); if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==1) { HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_5); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_5==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6==1); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_7); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_7==1); 源代码不动把这段代码修改为下个灯亮下个灯灭
时间: 2025-05-25 18:14:26 浏览: 31
### STM32 HAL 库实现 GPIO 流水灯逐个点亮熄灭效果
以下是一个完整的解决方案,展示如何利用 STM32 HAL 库编写代码,实现流水灯逐个点亮和熄灭的效果。
---
#### 一、硬件配置
在 STM32CubeMX 中完成如下配置:
1. 将多个 GPIO 引脚设置为推挽输出模式,用于驱动 LED[^1]。
2. 不需要额外的外部中断配置,仅需定时器或主循环控制逻辑即可[^3]。
完成后生成代码并导入到 Keil 工程中。
---
#### 二、流水灯代码示例
以下是实现流水灯逐个点亮和熄灭的核心代码:
```c
#include "stm32f1xx_hal.h"
#define NUM_LEDS 8 // 假设有 8 个 LED
uint8_t ledPins[NUM_LEDS] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3,
GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7}; // 定义 LED 对应的 GPIO Pin
uint8_t currentLedIndex = 0; // 当前点亮的 LED 索引
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init(); // 初始化 HAL 库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化 GPIO
while (1)
{
// 关闭所有 LED
for (uint8_t i = 0; i < NUM_LEDS; i++)
{
HAL_GPIO_WritePin(GPIOA, ledPins[i], GPIO_PIN_RESET);
}
// 点亮当前索引对应的 LED
HAL_GPIO_WritePin(GPIOA, ledPins[currentLedIndex], GPIO_PIN_SET);
// 延迟一段时间
HAL_Delay(200);
// 移动到下一个 LED
currentLedIndex++;
if (currentLedIndex >= NUM_LEDS)
{
currentLedIndex = 0; // 循环回到第一个 LED
}
}
}
/**
* @brief GPIO Initialization Function
*/
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置 LED 引脚为输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
for (uint8_t i = 0; i < NUM_LEDS; i++)
{
GPIO_InitStruct.Pin = ledPins[i];
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
```
---
#### 三、主要改动点解释
1. **LED 数组定义**:
- 使用数组 `ledPins` 来存储每个 LED 对应的 GPIO 引脚编号,方便管理多个 LED 的状态[^3]。
2. **逐个点亮和熄灭逻辑**:
- 在每次循环中先关闭所有 LED,然后再点亮当前索引对应的 LED,从而实现逐个点亮和熄灭的效果。
3. **延时控制**:
- 使用 `HAL_Delay()` 函数提供固定时间间隔(如 200ms),确保流水灯移动速度适中[^4]。
4. **循环索引**:
- 当 `currentLedIndex` 达到最大值时重置为 0,形成循环流动效果。
---
#### 四、注意事项
- **硬件连接**:确保每个 LED 正确连接至指定 GPIO 引脚,并串联适当阻值的限流电阻(如 220Ω)[^2]。
- **电源电压**:STM32F103R6 的 GPIO 默认工作电压为 3.3V,因此 LED 的供电也应匹配此范围。
- **调试工具**:可以借助 ST-LINK 调试器加载程序到 MCU,并观察实际效果。
---
###
阅读全文
相关推荐




















