#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" // 初始化函数 void GPIO_Init_LED(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } // 延时函数(使用 SysTick) void Delay_ms(uint32_t nTime) { SysTick_Config(SystemCoreClock / 1000); // 1ms 中断 uint32_t i; for(i = 0; i < nTime; i++) { while(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk); } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器 } int main(void) { SystemInit(); // 系统初始化 GPIO_Init_LED(); while (1) { // LED1 亮,LED2 灭 GPIO_ResetBits(GPIOC, GPIO_Pin_0); GPIO_SetBits(GPIOC, GPIO_Pin_1); Delay_ms(1000); // LED1 灭,LED2 亮 GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_ResetBits(GPIOC, GPIO_Pin_1); Delay_ms(1000); } }
时间: 2025-10-17 10:16:57 AIGC 浏览: 15
### 代码优化思路
原代码框架已具备基本的LED闪烁逻辑,但存在一些可优化之处。可以添加必要的库文件引用,完善GPIO初始化和延时函数,同时提高代码的可读性和可维护性。
### 优化后的代码示例
```c
#include "stm32f10x.h" // 包含STM32F10x系列的基本头文件
#include "stm32f10x_gpio.h" // 包含GPIO相关的头文件
#include "stm32f10x_rcc.h" // 包含RCC相关的头文件
// 延时函数
void delay_ms(uint32_t ms) {
for (uint32_t i = 0; i < ms * 1000; i++);
}
// 初始化GPIOC的0和1引脚为输出模式
void init_led(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
// 设置LED端口电平
void set_led_state(uint16_t pin, int state) {
if (state) {
GPIO_SetBits(GPIOC, pin);
} else {
GPIO_ResetBits(GPIOC, pin);
}
}
int main(void) {
// 初始化LED端口
init_led();
// 主循环
while(1) {
// 设置GPIOC的0引脚为高电平,点亮LED
set_led_state(GPIO_Pin_0, 1);
// 设置GPIOC的1引脚为低电平,熄灭LED
set_led_state(GPIO_Pin_1, 0);
// 延时,保持LED点亮一段时间
delay_ms(1000);
// 设置GPIOC的0引脚为低电平,熄灭LED
set_led_state(GPIO_Pin_0, 0);
// 设置GPIOC的1引脚为高电平,点亮LED
set_led_state(GPIO_Pin_1, 1);
// 延时,保持LED熄灭一段时间
delay_ms(1000);
}
return 0;
}
```
### 代码优化点解释
1. **头文件引用**:添加了`stm32f10x.h`、`stm32f10x_gpio.h`和`stm32f10x_rcc.h`头文件,确保使用到的外设和函数有正确的定义[^4]。
2. **延时函数**:实现了一个简单的`delay_ms`函数,用于控制LED亮灭的时间间隔。
3. **GPIO初始化**:使用`GPIO_InitTypeDef`结构体来配置GPIOC的0和1引脚为推挽输出模式,并使能GPIOC的时钟。
4. **电平设置函数**:`set_led_state`函数根据传入的引脚和状态值,使用`GPIO_SetBits`和`GPIO_ResetBits`函数来设置引脚的电平。
### 问题排查
以下是一些常见的问题及排查方法:
1. **LED不闪烁**:
- 检查硬件连接是否正确,确保GPIOC的0和1引脚正确连接到LED。
- 检查代码中GPIO初始化和电平设置是否正确,特别是时钟使能和引脚配置。
2. **闪烁间隔不符合预期**:
- 检查`delay_ms`函数的延时时间是否正确,可以调整延时参数进行测试。
- 确保代码中没有其他耗时操作影响了LED的闪烁间隔。
阅读全文
