stm32f103c8t6点亮led灯电路
时间: 2025-05-08 13:14:43 AIGC 浏览: 64
### STM32F103C8T6 点亮 LED 的电路设计及代码实现
#### 一、硬件连接
为了通过 STM32F103C8T6 单片机控制 LED 流水灯,需要将 GPIO 引脚与外部 LED 连接。以下是典型的硬件连接方式:
- **LED 阳极**:连接到 STM32 的 GPIO 输出引脚(如 PB5, PB0 和 PA1)。
- **LED 阴极**:接地 (GND),并通过限流电阻串联以保护 LED 不被过电流损坏。
典型电路图如下所示:
```plaintext
STM32 Pin -> Resistor -> LED Anode (+)
|
GND (-)
```
限流电阻的选择取决于 LED 的额定电压和正向电流。通常情况下,可以选择 220Ω 或 330Ω 的电阻来满足大多数标准 LED 的需求[^1]。
---
#### 二、软件配置
##### 1. 使用 STM32CubeMX 初始化项目
在 STM32CubeMX 中完成以下设置:
- 设置时钟源为内部高速振荡器 (HSI) 或外部晶振。
- 配置用于驱动 LED 的 GPIO 引脚为推挽输出模式。
- 如果需要更复杂的功能(如定时器触发的流水灯效果),可以启用 TIM 定时器外设并绑定中断回调函数[^3]。
生成初始化代码后导入至 Keil uVision 工程环境。
##### 2. 编写自定义头文件 `led.h`
根据引用中的内容,在 `led.h` 文件中定义宏以及接口函数原型声明:
```c
#ifndef __LED_H
#define __LED_H
#include "sys.h"
// LED 端口定义
#define LED0 PBout(5) // DS0 对应 PB5
#define LED1 PBout(0) // DS1 对应 PB0
#define LED2 PAout(1) // DS2 对应 PA1
void LED_Init(void); // 初始化函数
#endif
```
##### 3. 实现 `led.c` 文件
编写具体的初始化逻辑和操作方法:
```c
#include "led.h"
#include "stm32f1xx_hal.h"
/**
* @brief 初始化 LED 所需的 GPIO 引脚
*/
void LED_Init(void) {
__HAL_RCC_GPIOB_CLK_ENABLE(); // 启用 GPIOB 时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置 PB5, PB0, PA1 作为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 上拉/下拉禁用
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/**
* @brief 控制指定编号的 LED 开启或关闭
* @param led_num LED 序号 (0~2)
* @param status ON/OFF 状态
*/
void LED_Control(uint8_t led_num, uint8_t status) {
switch (led_num) {
case 0:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, status ? GPIO_PIN_SET : GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, status ? GPIO_PIN_SET : GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, status ? GPIO_PIN_SET : GPIO_PIN_RESET);
break;
default:
break;
}
}
```
---
#### 三、主程序流程
在主函数中调用上述 API 来实现 LED 流水灯的效果:
```c
int main(void) {
HAL_Init();
LED_Init();
while (1) {
LED_Control(0, 1); // 点亮第 0 号 LED
HAL_Delay(500);
LED_Control(0, 0); // 关闭第 0 号 LED
LED_Control(1, 1); // 点亮第 1 号 LED
HAL_Delay(500);
LED_Control(1, 0); // 关闭第 1 号 LED
LED_Control(2, 1); // 点亮第 2 号 LED
HAL_Delay(500);
LED_Control(2, 0); // 关闭第 2 号 LED
}
}
```
此循环会按照顺序依次点亮三个 LED 并延时一段时间后再熄灭它们。
---
#### 四、注意事项
- 在实际开发板上测试前,请确认所有焊接点无误且供电正常。
- 若使用 USB-TTL 下载工具烧录固件,则需确保目标芯片已正确识别并与调试器通信成功[^2]。
- 如涉及更高阶的功能扩展(例如按键控制或者 PWM 调光),可进一步研究相关外设资源及其应用案例[^4]。
---
阅读全文
相关推荐



















