使用STM32的定时器,实现LED灯的定时闪烁。要求LED灯每隔1秒钟闪烁一次,亮灭时间均为500ms
时间: 2024-02-13 11:00:35 浏览: 84
好的,这是一份基于HAL库的STM32定时器闪烁LED的代码,你可以参考一下:
```c
#include "stm32f1xx_hal.h"
// 定义LED引脚
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
// 定义定时器的周期和预分频系数
#define TIMER_PRESCALER 8000
#define TIMER_PERIOD 1000
// 定义全局变量,用于存储定时器计数器的值
volatile uint32_t timer_counter = 0;
// 定义定时器中断处理函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
// 获取当前系统时钟的频率
uint32_t system_clock_frequency = HAL_RCC_GetSysClockFreq();
// 计算定时器的计数器的值
timer_counter += (TIMER_PRESCALER * 1000) / system_clock_frequency;
// 如果计数器的值达到了定时时间,就翻转LED的状态
if (timer_counter >= TIMER_PERIOD)
{
timer_counter = 0;
HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
}
}
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 启用GPIO和定时器的时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
// 配置LED引脚为推挽输出模式
GPIO_InitTypeDef gpio_init;
gpio_init.Pin = LED_PIN;
gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init.Pull = GPIO_NOPULL;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_GPIO_PORT, &gpio_init);
// 配置定时器
TIM_HandleTypeDef tim_init;
tim_init.Instance = TIM2;
tim_init.Init.Prescaler = TIMER_PRESCALER - 1;
tim_init.Init.CounterMode = TIM_COUNTERMODE_DOWN;
tim_init.Init.Period = 1;
tim_init.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&tim_init);
// 启用定时器中断
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
HAL_TIM_Base_Start_IT(&tim_init);
while (1)
{
// 此处可以添加其他代码
}
}
// 系统时钟配置函数
void SystemClock_Config(void)
{
RCC_OscInitTypeDef osc_init;
RCC_ClkInitTypeDef clk_init;
osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE;
osc_init.HSEState = RCC_HSE_ON;
osc_init.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
osc_init.HSIState = RCC_HSI_OFF;
osc_init.LSEState = RCC_LSE_OFF;
osc_init.LSIState = RCC_LSI_OFF;
HAL_RCC_OscConfig(&osc_init);
clk_init.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1;
clk_init.APB1CLKDivider = RCC_HCLK_DIV2;
clk_init.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&clk_init, FLASH_LATENCY_2);
}
```
这份代码使用了STM32的定时器TIM2,以1ms的周期触发中断。在中断处理函数中,每隔1秒检查一次定时器的计数器的值,如果达到了定时时间,就翻转LED的状态。需要注意的是,由于定时器的计数器是16位的,如果使用的预分频系数太小,可能会导致计数器溢出,从而影响定时器的精度。因此,需要根据实际情况选择合适的预分频系数和定时器周期。
阅读全文