hal库滴答定时器使灯亮一秒
时间: 2025-05-04 21:48:33 浏览: 33
### 实现方案
要使用 STM32 的 HAL 库配置 SysTick 滴答定时器以实现 LED 灯亮 1 秒后熄灭的效果,可以通过以下方式完成:
#### 配置 SysTick 定时器
SysTick 是一个简单的 24 位向下计数定时器,在 Cortex-M 微控制器中广泛用于提供毫秒级的时间基准。HAL 提供了 `HAL_Delay()` 函数,它基于 SysTick 计算延迟时间。
以下是具体实现方法:
1. **初始化 GPIO 和 LED**
使用 HAL 初始化 GPIO 口作为输出端口,连接到 LED。
2. **启用 SysTick 并调用 HAL 延迟函数**
利用 `HAL_Init()` 自动初始化 SysTick 或手动调用 `HAL_SYSTICK_Config(SystemCoreClock / 1000)` 来设置中断频率为每毫秒触发一次[^2]。
3. **编写主循环逻辑**
在主程序中,通过控制 GPIO 输出高低电平并配合 `HAL_Delay(1000)` 实现灯亮 1 秒后再熄灭的效果。
---
### 示例代码
```c
#include "stm32g4xx_hal.h"
// 定义 LED 所在的 GPIO 引脚
#define LED_PIN GPIO_PIN_5
#define LED_GPIO_PORT GPIOA
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
// 初始化 HAL 库 (自动初始化 SysTick)
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化 GPIO
MX_GPIO_Init();
while (1)
{
// 设置 LED 引脚高电平(点亮)
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
// 延迟 1 秒
HAL_Delay(1000);
// 设置 LED 引脚低电平(熄灭)
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
// 再次延迟 1 秒
HAL_Delay(1000);
}
}
/**
* @brief GPIO Initialization Function
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置 PA5 为推挽输出模式
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
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
}
```
---
### 关键点解析
1. **`HAL_Init()`**
调用该函数会自动初始化 SysTick 定时器,并将其配置为每毫秒产生一次中断。
2. **`HAL_Delay(uint32_t Delay)`**
此函数利用 SysTick 中断计算延迟时间。参数表示以毫秒为单位的延迟长度。
3. **GPIO 控制**
使用 `HAL_GPIO_WritePin()` 函数可以轻松切换 GPIO 引脚的状态,从而控制 LED 的开关状态。
4. **SysTick 频率调整**
如果需要更改 SysTick 的滴答频率,可通过修改 `HAL_SYSTICK_Config(SystemCoreClock / Frequency)` 进行自定义配置。
---
###
阅读全文
相关推荐


















