可以使用Timer来控制LED灯吗
之前使用GPIO来控制LED的亮灭,表示系统当前的工作状态。大家有使用Timer外设来驱动LED灯的吗?优势是可以把状态指示灯做成呼吸灯效果,缺点就是要浪费一个Timer外设。大家在实际应用项目里面如何做选择?当然,我的另一个同事让我通过Timer的PWM实现LED的每隔500ms亮灭的功能特性被我直接否掉了。可以吧。。。 将LED的正极通过限流电阻连接到微控制器的GPIO输出引脚,负极接地
确保定时器外设的时钟已开启(通常由系统自动配置)
配置LED对应的GPIO引脚为推挽输出模式
在定时器中断中切换LED状态:
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟和中断
LED_Init(); // 初始化LED引脚
Timer_Init(); // 初始化定时器
while (1) {
// 主循环空转,所有操作在中断中完成
}
}
#include "stm32f1xx_hal.h"
void SystemClock_Config(void) {
// 配置系统时钟(此处省略,假设已正确配置)
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
void LED_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Timer_Init(void) {
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7200 - 1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 10000 - 1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);
HAL_TIM_Base_Start_IT(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) {
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
LED_Init();
Timer_Init();
while (1) {}
}
确保定时器时钟与系统时钟匹配,否则会导致定时不准确
避免与其他中断冲突,合理分配优先级
若进入低功耗模式,需手动唤醒定时器
若需控制多个LED,可结合PWM模式或输出比较模式实现不同亮度或闪烁频率
页:
[1]