PS: 根据实际使用情况修改。
头文件
#include "period.h"
// 定义时间片标志变量
PeriodFlags_t periodFlags = {0};
// 静态变量计时
static uint16_t counter_1ms = 0;
static uint16_t counter_10ms = 0;
static uint16_t counter_100ms = 0;
static uint16_t counter_500ms = 0;
static uint16_t counter_1s = 0;
/**
* @brief 定时器6初始化,1ms定时
*/
void Period_Init(void) {
// RCC 时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
// 定时器初始化配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; // 定时1ms:1ms = (Period + 1) / (72MHz / Prescaler)
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz / (71+1) = 1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
// 清除计数器
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
// 使能中断
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
// 使能定时器
TIM_Cmd(TIM6, ENABLE);
// 配置 NVIC
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief 定时器6中断处理函数
*/
void TIM6_IRQHandler (void) {
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
// 1ms 时间片
periodFlags.flag_1ms = 1;
// 10ms 时间片
if (++counter_1ms >= 10) {
counter_1ms = 0;
periodFlags.flag_10ms = 1;
}
// 100ms 时间片
if (++counter_10ms >= 100) {
counter_10ms = 0;
periodFlags.flag_100ms = 1;
}
// 500ms 时间片
if (++counter_100ms >= 500) {
counter_100ms = 0;
periodFlags.flag_500ms = 1;
}
// 1s 时间片
if (++counter_500ms >= 1000) {
counter_500ms = 0;
periodFlags.flag_1s = 1;
}
}
}
/**
* @brief 前后台系统处理函数
*/
void Period_Process(void) {
// 1ms任务
if (periodFlags.flag_1ms) {
periodFlags.flag_1ms = 0;
// 在这里添加1ms周期任务
}
// 10ms任务
if (periodFlags.flag_10ms) {
periodFlags.flag_10ms = 0;
// 在这里添加10ms周期任务
}
// 100ms任务
if (periodFlags.flag_100ms) {
periodFlags.flag_100ms = 0;
// 在这里添加100ms周期任务
}
// 500ms任务
if (periodFlags.flag_500ms) {
periodFlags.flag_500ms = 0;
// 在这里添加500ms周期任务
}
// 1s任务
if (periodFlags.flag_1s) {
periodFlags.flag_1s = 0;
// 在这里添加1s周期任务
}
}
源文件
#ifndef __PERIOD_H
#define __PERIOD_H
#include "stm32f10x.h"
// 定义时间片标志
typedef struct {
uint8_t flag_1ms;
uint8_t flag_10ms;
uint8_t flag_100ms;
uint8_t flag_500ms;
uint8_t flag_1s;
} PeriodFlags_t;
// 外部变量声明
extern PeriodFlags_t periodFlags;
// 函数声明
void Period_Init(void);
void Period_Process(void);
void Period_Timer5_IRQHandler(void);
#endif // __PERIOD_H
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40156019/article/details/143928033
|