利用通用定时器 TIM2实现LED 精确延时 1s 闪烁,硬件设计上只需要一个LED 灯通过串联一个限流电阻连接到 STM32F103 微控制器的 PB5 引脚即可。
时间: 2024-03-14 13:46:19 浏览: 83
好的,你可以参考下面的代码实现:
```c
#include "stm32f10x.h"
volatile uint32_t delay_time = 0;
void TIM2_IRQHandler(void)
{
if (TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF; // 清除中断标志位
GPIOB->ODR ^= GPIO_Pin_5; // 翻转 LED 状态
delay_time++; // 增加延时时间
}
}
void delay_ms(uint32_t ms)
{
delay_time = 0;
TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器
while (delay_time < ms * 1000); // 等待延时完成
TIM2->CR1 &= ~TIM_CR1_CEN; // 停止计数器
GPIOB->BSRR = GPIO_Pin_5; // 熄灭 LED
}
int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能 GPIOB 时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能 TIM2 时钟
GPIOB->CRL &= ~GPIO_CRL_CNF5; // PB5 推挽输出
GPIOB->CRL |= GPIO_CRL_MODE5_0;
TIM2->PSC = 71; // 预分频器为 72-1
TIM2->ARR = 999; // 自动重载值为 1000-1
TIM2->DIER |= TIM_DIER_UIE; // 允许更新中断
NVIC_EnableIRQ(TIM2_IRQn); // 使能 TIM2 中断
while (1) {
delay_ms(1000); // 延时 1s
}
}
```
上面的代码中使用了 PB5 引脚连接 LED 灯,并通过限流电阻限制电流,以防止 LED 灯烧坏。需要根据具体的 LED 灯和电源电压选择合适的限流电阻,通常可以根据 LED 灯的额定电流和工作电压计算得出。
阅读全文