写一个STM32单片机systick系统定时器的包含属性、对象、状态控制封装结构。要给出最优的封装的全部代码,而且只能使用STM32标准库,不能使用HAL库或者LL库,
时间: 2024-05-12 13:18:49 浏览: 177
以下是一个基于STM32标准库的systick系统定时器的封装结构。
属性:
- uint32_t ticks:定时器计数器
- uint32_t interval:定时器间隔时间
- bool running:定时器运行状态
对象:
- void (*callback)(void):定时器回调函数
状态控制:
- void start():启动定时器
- void stop():停止定时器
- void set_interval(uint32_t interval):设置定时器间隔时间
- bool is_running():获取定时器运行状态
代码如下:
```c
#include "stm32f10x.h"
typedef struct {
uint32_t ticks;
uint32_t interval;
bool running;
void (*callback)(void);
} systick_timer_t;
static systick_timer_t systick_timer;
void systick_timer_init() {
systick_timer.ticks = 0;
systick_timer.interval = 0;
systick_timer.running = false;
systick_timer.callback = NULL;
SysTick->LOAD = SystemCoreClock / 1000 - 1; // 1ms
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk;
}
void systick_timer_handler() {
if (systick_timer.running) {
systick_timer.ticks++;
if (systick_timer.ticks >= systick_timer.interval) {
systick_timer.ticks = 0;
if (systick_timer.callback != NULL) {
systick_timer.callback();
}
}
}
}
void systick_timer_start() {
systick_timer.running = true;
}
void systick_timer_stop() {
systick_timer.running = false;
systick_timer.ticks = 0;
}
void systick_timer_set_interval(uint32_t interval) {
systick_timer.interval = interval;
}
bool systick_timer_is_running() {
return systick_timer.running;
}
void systick_timer_set_callback(void (*callback)(void)) {
systick_timer.callback = callback;
}
void SysTick_Handler() {
systick_timer_handler();
}
```
使用方法:
初始化定时器:
```c
systick_timer_init();
```
设置回调函数:
```c
void timer_callback() {
// 定时器到达指定时间后执行的操作
}
systick_timer_set_callback(timer_callback);
```
启动定时器:
```c
systick_timer_start();
```
停止定时器:
```c
systick_timer_stop();
```
设置定时器间隔时间:
```c
systick_timer_set_interval(1000); // 1秒
```
获取定时器运行状态:
```c
bool running = systick_timer_is_running();
```
阅读全文