#include <stm32f10x.h> int main () { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11); while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11); delay10ms(); GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_11); delay10ms(); GPIO_ResetBits(GPIOB,GPIO_Pin_10); GPIO_SetBits(GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11); delay10ms(); GPIO_ResetBits(GPIOB,GPIO_Pin_11); GPIO_SetBits(GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10); delay10ms(); } }
时间: 2025-05-23 17:03:36 浏览: 31
### STM32F10x GPIO 配置与循环控制 LED 示例代码解析
以下是对 STM32F10x 系列微控制器中 GPIO 配置以及循环控制多个 LED 的详细分析和示例代码。
#### 1. GPIO 初始化配置
STM32F10x 系列的 GPIO 初始化通常涉及以下几个步骤:
- **使能时钟**:通过 `RCC_APB2PeriphClockCmd` 或者更现代的方式(如 HAL 库中的 `__HAL_RCC_GPIOA_CLK_ENABLE()`),启用对应端口的时钟。
- **定义引脚功能**:设置引脚的工作模式(输入/输出)、速度、上下拉电阻等参数。
- **应用初始化结构体**:利用 `GPIO_InitTypeDef` 结构体填充所需参数并调用 `GPIO_Init` 函数完成实际硬件配置。
以下是基于标准库的 GPIO 初始化代码片段:
```c
#include "stm32f10x.h"
void GPIO_LED_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
// 启用 GPIOA 和 GPIOB 的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 配置 PA5、PB0、PB1 作为输出推挽模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // PA5
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // PB0 和 PB1
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
```
此部分实现了对三个不同 GPIO 引脚(PA5、PB0、PB1)的初始化,用于分别驱动三盏独立的 LED[^1]。
---
#### 2. 循环控制 LED 实现逻辑
为了实现循环点亮的效果,可以通过轮询方式逐一改变各路 LED 的状态。下面给出具体的主程序框架:
```c
int main(void) {
uint8_t led_index = 0;
const uint16_t led_pins[] = {GPIO_Pin_5, GPIO_Pin_0, GPIO_Pin_1}; // 定义使用的 LED 引脚列表
GPIO_LED_Init(); // 调用前面编写的 GPIO 初始化函数
while (1) {
for (uint8_t i = 0; i < sizeof(led_pins)/sizeof(led_pins[0]); ++i) {
// 清除所有 LED 输出
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
// 设置当前 LED 为高电平(点亮)
if (led_pins[i] == GPIO_Pin_5) {
GPIO_SetBits(GPIOA, GPIO_Pin_5);
} else {
GPIO_SetBits(GPIOB, led_pins[i]);
}
Delay_ms(500); // 延迟 500ms
}
}
}
// 自定义延时函数
void Delay_ms(uint32_t ms) {
volatile uint32_t count;
for (count = 0; count < (SystemCoreClock / 3000 * ms); count++);
}
```
在此段代码中:
- 使用了一个数组保存所要操作的所有 LED 对应的 GPIO 引脚号;
- 在无限循环内部遍历该数组,并逐次切换目标 LED 的高低电平以形成视觉上的流水灯效果[^2]。
---
#### 3. 关键点解析
##### (1)GPIO 模式选择
对于 LED 控制而言,推荐采用 **推挽输出模式** (`GPIO_Mode_Out_PP`) 来获得较强的电流驱动能力,从而保证 LED 正常发光[^1]。
##### (2)延时机制
由于未引入操作系统或其他复杂调度工具,在裸机环境下一般借助简单计数器或者 SysTick 中断来达成精确的时间间隔需求。上述例子采用了最基础的手动计算法模拟毫秒级等待时间[^3]。
##### (3)扩展性考虑
如果未来计划接入更多数量或种类各异的外设,则建议提前规划好统一管理接口,比如封装专门的操作类 API 将底层细节隐藏起来便于维护升级[^2]。
---
###
阅读全文
相关推荐



















