keil点亮stm32f103c8t6led
时间: 2025-03-30 08:11:19 浏览: 22
### 使用 Keil 开发 STM32F103C8T6 点亮 LED 的方法
以下是基于 HAL 库和 Keil 工具链实现 STM32F103C8T6 控制 GPIO 来点亮 LED 的具体代码示例。
#### 1. 初始化配置
在 `main.c` 文件中,通过调用 HAL 库函数完成 GPIO 配置。GPIO 口被设置为推挽输出模式以驱动外部 LED[^1]。
```c
#include "stm32f1xx_hal.h"
// 定义LED端口
#define LED_PIN GPIO_PIN_5
#define LED_GPIO_PORT GPIOB
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
while (1)
{
// 点亮LED
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
// 延时一段时间
HAL_Delay(500);
// 关闭LED
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
// 再次延时
HAL_Delay(500);
}
}
/**
* @brief 配置系统时钟
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the CPU, AHB and APB buses clocks */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 设置PLL倍频因子
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler(); // 错误处理函数
}
/** Initializes the CPU, AHB and APB buses clocks */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler(); // 错误处理函数
}
}
/**
* @brief 初始化GPIO
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE(); // 启用GPIOB时钟
// 配置PB5作为输出
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
}
```
上述代码实现了以下功能:
- **初始化 HAL 库**:通过 `HAL_Init()` 函数完成基本的硬件抽象层初始化。
- **配置系统时钟**:使用 HSE 和 PLL 提供稳定的时钟源。
- **GPIO 输出配置**:将指定的 GPIO 引脚(如 PB5)配置为推挽输出模式[^2]。
- **循环控制 LED 状态**:利用 `HAL_GPIO_WritePin()` 函数切换引脚电平状态,从而点亮或熄灭 LED。
#### 2. 头文件定义
为了简化程序结构,在头文件 `led.h` 中可以封装 LED 相关宏定义和接口函数:
```c
#ifndef __LED_H
#define __LED_H
#include "stm32f1xx_hal.h"
// 定义LED端口
#define LED_PIN GPIO_PIN_5
#define LED_GPIO_PORT GPIOB
// 初始化LED
void LED_Init(void);
#endif /* __LED_H */
```
对应的实现文件 `led.c` 如下所示:
```c
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE(); // 启用GPIOB时钟
// 配置PB5作为输出
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
}
```
这样可以通过调用 `LED_Init()` 实现更简洁的初始化逻辑。
---
####
阅读全文
相关推荐


















