打印
[STM32F1]

STM32F1基本定时器TIM6实现时间片轮询模板

[复制链接]
244|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-12-5 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15903

帖子

13

粉丝