蓝桥杯嵌入式滴答计时
时间: 2025-04-18 22:47:05 浏览: 27
### 蓝桥杯嵌入式系统滴答计时实现方法
#### 使用SysTick定时器实现LED闪烁
在蓝桥杯竞赛中,使用STM32微控制器的SysTick定时器可以方便地实现精确的时间延迟和周期性事件触发。通过配置SysTick定时器,可以在指定的时间间隔内执行特定的任务。
具体来说,在`while(1)`循环中调用`led_process()`函数来控制LED的状态变化[^2]:
```c
u32 ledTick;
u8 led_cnt;
void led_process(void) {
if (uwTick - ledTick < 1000) return;
ledTick = uwTick;
led_cnt++;
if (led_cnt > 5) led_cnt = 0;
if (led_cnt < 3) { // 当led_cnt为0, 1, 2时点亮LED
led_ctrl |= 0x01;
}
if (led_cnt > 2) { // 当led_cnt为3, 4时熄灭LED
led_ctrl &= ~0x01;
}
led_control(led_ctrl);
}
```
这段代码利用了全局变量`uwTick`作为系统滴答计数器,并且每次当经过1秒(即1000毫秒)后更新LED状态。这样就可以实现LED按照设定规律交替亮起和熄灭的效果。
#### SysTick定时器初始化设置
为了使上述功能正常工作,还需要正确初始化SysTick定时器。通常情况下,这一步骤是在启动文件或者主程序开始部分完成的。下面是一个简单的初始化例子[^3]:
```c
void SysTick_Init(void) {
/* 配置SysTick中断频率 */
if (SysTick_Config(SystemCoreClock / 1000)) {
while (1); // 如果配置失败,则进入死循环
}
}
int main(void) {
HAL_Init();
SystemClock_Config(); // 初始化系统时钟
SysTick_Init(); // 初始化SysTick定时器
while (1) {
led_process();
}
}
```
这里的关键在于调整`SysTick_Config`参数以匹配所需的中断频率。在这个实例中选择了每秒钟发生一次中断(`SystemCoreClock/1000`),从而使得`uwTick`能够记录下每一毫秒的变化情况。
#### 修改中断服务例程
对于更复杂的项目需求,可能需要自定义SysTick中断的服务例程(SVR),以便更好地管理多个任务之间的调度关系。可以通过编辑位于`stm32g4xx_it.c`中的默认SVR来进行扩展开发。
```c
extern volatile uint32_t uwTick;
void SysTick_Handler(void) {
uwTick++; // 更新全局滴答计数值
}
```
此段代码展示了如何在一个标准的SysTick中断处理函数中增加对全局变量`uwTick`的操作,确保其随时间递增,进而支持基于时间的应用逻辑判断。
阅读全文
相关推荐









