写一个STM32单片机systick系统定时器的包含属性、对象、状态、延时、控制封装结构。要给出最优的封装的全部代码,而且只能使用STM32标准库,不能使用HAL库或者LL库,
时间: 2024-05-09 21:20:18 浏览: 89
STM32MP157实现Systick高精度延时【支持STM32MP1系列单片机_HAL库驱动】.zip
该封装结构包含以下属性:
1. 周期:定时器中断周期,即计数器每隔多少个时钟周期就会触发一次中断。
2. 计数值:定时器计数器的初始值。
3. 中断回调函数:定时器中断触发时调用的回调函数。
该封装结构包含以下对象:
1. 定时器初始化对象:用于初始化定时器的各项属性。
2. 定时器对象:用于控制定时器的启停和计数器值的读取。
该封装结构包含以下状态:
1. 初始化状态:引脚配置、时钟配置和中断配置。
2. 运行状态:定时器开始计数并在到达设定的周期时触发中断。
3. 停止状态:定时器停止计数,不会触发中断。
该封装结构包含以下延时:
1. 精确延时:使用定时器进行精确的微秒级延时。
该封装结构包含以下控制封装代码:
```c
#include "stm32f10x.h"
// 定义计数值和周期
#define COUNT_VALUE 9
#define TICK_PERIOD 1000
// 定义定时器初始化对象
typedef struct {
uint16_t period;
uint16_t count_value;
void (*callback)(void);
} Timer_InitTypeDef;
// 定义定时器对象
typedef struct {
TIM_TypeDef *instance;
Timer_InitTypeDef init;
} Timer_HandleTypeDef;
// 初始化定时器
void init_timer(Timer_HandleTypeDef *htim) {
// 开启定时器时钟
if (htim->instance == TIM1) {
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
} else if (htim->instance == TIM2) {
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
} else if (htim->instance == TIM3) {
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
} else if (htim->instance == TIM4) {
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
}
// 配置定时器
htim->instance->PSC = SystemCoreClock / TICK_PERIOD - 1;
htim->instance->ARR = htim->init.period - 1;
htim->instance->CNT = htim->init.count_value;
htim->instance->CR1 = TIM_CR1_URS | TIM_CR1_CEN;
// 配置定时器中断
NVIC_EnableIRQ(TIM2_IRQn);
htim->instance->DIER = TIM_DIER_UIE;
}
// 启动定时器
void start_timer(Timer_HandleTypeDef *htim) {
// 开启定时器
htim->instance->CR1 |= TIM_CR1_CEN;
}
// 停止定时器
void stop_timer(Timer_HandleTypeDef *htim) {
// 关闭定时器
htim->instance->CR1 &= ~TIM_CR1_CEN;
}
// 读取定时器计数器的值
uint16_t read_timer_counter(Timer_HandleTypeDef *htim) {
return htim->instance->CNT;
}
// 定时器中断处理函数
void TIM2_IRQHandler(void) {
// 清除中断标志位
TIM2->SR &= ~TIM_SR_UIF;
// 调用回调函数
TIM2->ARR = 0;
TIM2->CNT = 0;
TIM2->CR1 &= ~TIM_CR1_CEN;
TIM2->SR &= ~TIM_SR_UIF;
TIM2->ARR = htim2.init.period - 1;
TIM2->CNT = htim2.init.count_value;
TIM2->CR1 |= TIM_CR1_CEN;
htim2.init.callback();
}
// 精确延时函数
void delay_us(uint32_t us) {
// 初始化定时器
Timer_HandleTypeDef htim;
htim.instance = TIM2;
htim.init.period = 0xFFFF;
htim.init.count_value = 0;
htim.init.callback = NULL;
init_timer(&htim);
// 启动定时器
start_timer(&htim);
// 等待定时器计数器达到指定值
while (read_timer_counter(&htim) < us);
// 停止定时器
stop_timer(&htim);
}
// 测试程序
int main(void) {
// 初始化定时器
Timer_HandleTypeDef htim;
htim.instance = TIM2;
htim.init.period = TICK_PERIOD;
htim.init.count_value = COUNT_VALUE;
htim.init.callback = NULL;
init_timer(&htim);
// 启动定时器
start_timer(&htim);
// 主循环
while (1) {
// 精确延时 1 秒
delay_us(1000000);
}
}
```
阅读全文