STM32单片机软件定时器
时间: 2025-01-08 13:40:57 浏览: 32
### STM32单片机中的软件定时器实现
在嵌入式开发中,STM32系列微控制器广泛应用于各种应用场景。对于STM32而言,除了硬件定时器外,还可以通过编写特定的程序逻辑来创建软件定时器。
#### 创建滴答中断服务函数
为了使能软件定时器功能,在系统初始化阶段需配置SysTick定时器作为系统的滴答源。每次计数溢出都会触发一次ISR (Interrupt Service Routine),即所谓的“心跳”。在此期间可以处理多个独立的时间间隔事件[^1]。
```c
void SysTick_Handler(void)
{
static uint32_t counter = 0;
// 增加全局时间变量
counter++;
}
```
#### 定义并管理定时任务列表
定义一个结构体用于存储每个待执行的任务信息及其对应的超时期限。每当进入滴答中断时遍历该链表检查是否有任何已到期的工作项需要被唤醒或调用回调函数[^2]。
```c
typedef struct {
uint32_t timeout; /*< Timeout value */
void (*callback)(void);/*< Callback function pointer */
} sw_timer_t;
sw_timer_t timer_list[MAX_TIMERS];
uint8_t active_timers = 0;
```
#### 注册新的定时请求
提供API接口让用户能够方便地注册新任务到上述维护着所有活动实例的数据集合里去;同时也要考虑如何取消已经存在的预约以及查询剩余存活周期等功能需求[^3]。
```c
bool add_sw_timer(uint32_t ms, void(*cb)(void))
{
if(active_timers >= MAX_TIMERS){
return false;
}
timer_list[active_timers].timeout = ms + systick_counter;
timer_list[active_timers++].callback = cb;
return true;
}
// 取消指定索引处的定时器
void remove_sw_timer(int index)
{
if(index < active_timers){
memset(&timer_list[index], 0 , sizeof(sw_timer_t));
while(index < active_timers - 1){
timer_list[index] = timer_list[index + 1];
++index;
}
--active_timers;
}
}
```
#### 处理过期事件
最后一步是在`SysTick_Handler()`内部加入代码片段用来轮询整个队列寻找那些已经达到预设时限的对象,并立即激活相应的响应机制完成预期操作[^4]。
```c
void SysTick_Handler(void)
{
static uint32_t counter = 0;
int i;
// 更新全局时间戳
counter++;
for(i=0;i<active_timers;++i){
if(timer_list[i].timeout <= counter && timer_list[i].callback != NULL){
// 执行回调
timer_list[i].callback();
// 移除已完成的定时器
remove_sw_timer(i);
break;
}
}
}
```
阅读全文
相关推荐
















