蓝桥杯 嵌入式 定时器 led灯
时间: 2025-04-28 13:25:01 浏览: 23
### 关于蓝桥杯嵌入式竞赛中定时器控制LED灯的示例代码
在涉及定时器控制LED灯的应用场景里,通常会利用STM32微控制器中的硬件定时器资源配合软件编程实现精确的时间间隔控制。下面给出一段基于STM32CubeMX初始化配置后的Keil MDK环境下使用的C语言代码片段用于演示如何设置一个简单的周期性事件来触发LED状态切换。
#### 初始化TIM2作为基础时间基线
```c
// TIM2中断每秒发生一次,在此函数内部完成计数溢出重装载以及更新频率设定
static void MX_TIM2_Init(void)
{
__HAL_RCC_TIM2_CLK_ENABLE();
htim2.Instance = TIM2;
htim2.Init.Prescaler = 8000 - 1; // 设置预分频系数为8000-1 (假设系统时钟源为8MHz),得到实际工作频率为1kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 自动重载寄存器ARR=999,则定时时间为1ms * 1000 = 1s
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK){
Error_Handler(); // 错误处理机制
}
}
```
#### 定义全局变量并注册回调函数
```c
uint32_t ledToggleCounter = 0U;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if(htim->Instance==TIM2){ // 判断是否来自TIM2产生的中断请求
++ledToggleCounter;
if((ledToggleCounter % 2)==0){ // 当计数值达到偶数次时改变PC13端口电平高低翻转从而点亮/熄灭连接在此处的LED指示灯
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
/* USER CODE BEGIN Callback 1 */
/* USER CODE END Callback 1 */
}
```
上述代码展示了如何创建一个每隔一秒就会触发一次的定时器中断服务程序(ISR)[^1]。每当ISR被调用的时候,`ledToggleCounter`会被增加一单位;当这个计数变为偶数时,便会执行一次针对指定GPIO引脚的操作——即让该引脚上的电压发生变化,进而使得外接于此管脚之上的LED发出光亮或者停止发光[^2]。
为了确保这段代码能够正常运作,还需要注意以下几点:
- 使用STM32CubeMX工具正确配置好相应的外设参数;
- 将以上两个部分加入到项目当中,并适当调整以适应具体的开发环境需求;
- 如果采用不同的MCU型号或是其他编译平台的话,可能需要做相应修改才能兼容运行。
阅读全文
相关推荐


















