STM32,软件定时器封装代码
时间: 2023-12-20 10:46:35 浏览: 76
以下是一个简单的软件定时器封装代码示例,适用于STM32:
首先,定义一个定时器结构体,其中包含定时器 ID、定时器周期、定时器回调函数等信息:
```
typedef struct {
uint8_t id; // 定时器 ID
uint32_t period; // 定时器周期,单位为毫秒
void (*callback)(void); // 定时器回调函数
uint32_t tick; // 定时器计数器
} Timer_t;
```
接下来,定义一个定时器数组,并初始化为全 0:
```
#define MAX_TIMER_NUM 10 // 最大定时器数量
Timer_t Timer_List[MAX_TIMER_NUM] = {0};
```
然后,实现一个定时器初始化函数,用于配置定时器时钟和定时器中断:
```
void Timer_Init(void) {
// 配置定时器时钟为 1ms
SysTick_Config(SystemCoreClock / 1000);
}
```
接着,实现一个定时器注册函数,用于向定时器数组中添加定时器:
```
uint8_t Timer_Register(uint32_t period, void (*callback)(void)) {
uint8_t i;
for (i = 0; i < MAX_TIMER_NUM; i++) {
if (Timer_List[i].id == 0) { // 如果该定时器未被占用
Timer_List[i].id = i + 1;
Timer_List[i].period = period;
Timer_List[i].callback = callback;
Timer_List[i].tick = 0;
return Timer_List[i].id; // 返回定时器 ID
}
}
return 0; // 返回 0 表示注册失败
}
```
接着,实现一个定时器删除函数,用于从定时器数组中移除定时器:
```
void Timer_Delete(uint8_t id) {
uint8_t i;
for (i = 0; i < MAX_TIMER_NUM; i++) {
if (Timer_List[i].id == id) { // 如果找到该定时器
Timer_List[i].id = 0; // 将该定时器 ID 置为 0,表示未被占用
Timer_List[i].period = 0;
Timer_List[i].callback = NULL;
Timer_List[i].tick = 0;
break;
}
}
}
```
最后,实现一个定时器服务函数,在 SysTick 中断中调用该函数,用于判断定时器是否到期,如果到期则执行定时器回调函数:
```
void Timer_Service(void) {
uint8_t i;
for (i = 0; i < MAX_TIMER_NUM; i++) {
if (Timer_List[i].id != 0) { // 如果该定时器已被占用
Timer_List[i].tick++; // 定时器计数器加 1
if (Timer_List[i].tick >= Timer_List[i].period) { // 如果定时器到期
Timer_List[i].tick = 0; // 重置定时器计数器
Timer_List[i].callback(); // 执行定时器回调函数
}
}
}
}
```
在主函数中调用定时器初始化函数,然后在 SysTick 中断中调用定时器服务函数即可。
以上是一个简单的软件定时器封装代码示例,可以根据实际需求进行修改和扩展。
阅读全文