[STM32F1] 基于STM32实现软件定时器

[复制链接]
3410|6
 楼主| z755924843 发表于 2018-8-7 15:46 | 显示全部楼层 |阅读模式
基于STM32实现软件定时器,在软件定时器时间到达后调用回掉函数,执行特定功能,功能上比较简单 ,主要是分享出来 ,为大家提供一个思路。
不废话直接上代码:

#include "timer.h"



timer_t  timerlist[TIMER_LIST_MAX];
uint32_t timer3_tick =0;

extern void timer0_backcall_func(void);

       
void timer_task(void)
{
        uint8_t i;
        for(i=0;i<TIMER_LIST_MAX ;i++){
                if(timerlist[i].state==0)continue;
                else{
                        timerlist[i].count++;
                }
                if(timerlist[i].count==timerlist[i].expire){
                        timerlist[i].count = 0;
//                        if(timerlist[i].opt==0){//此单次定时器功能暂时不用
//                                timerlist[i].expire = 0;
//                        }
                        timerlist[i].callback();
                }
        }
       
}

/**
* 开启定时器
* num 定时器编号  val 计数时间
*/
void timer_enable(uint8_t num,uint32_t  val,void (* timer_backcall_func) (void))
{
        timerlist[num].state  = 1;//定时器使用情况
        timerlist[num].expire =  val+timer3_tick;//定时值
        timerlist[num].callback = timer_backcall_func;
}


void timer_disable(uint8_t num)
{
        timerlist[num].state = 0;
}


void Timer3_init(void)
{

    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;



    /* TIM3 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period =200;   //count max number 50000, time 50ms
    TIM_TimeBaseStructure.TIM_Prescaler = 720-1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


    /* TIM Interrupts enable */
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

    /* Enable the TIM3 gloabal Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
        TIM_Cmd(TIM3, ENABLE);


}
void TIM3_IRQHandler(void)
{
       
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        timer3_tick++;
                timer_task();
    }
       
}

/***************************************************/

#ifndef _TIMER_H_
#define _TIMER_H_

#include "stm32f10x.h"


#define TIMER_LIST_MAX   5 /*定时器数量*/
typedef void   (*tmr_fnct_ptr) (void);
typedef uint8_t TMR_STATE;



typedef struct{
    uint32_t        expire;                 /* 定时器到期时间             */
    uint32_t        count;                                        /*定时器计数*/
    tmr_fnct_ptr    callback;               /* 回调函数                   */
    uint8_t         state;                  /* 定时器状态                  */
    uint8_t        opt;                    /* 操作类型 1连续 0单次         */
}timer_t;

void Timer3_init(void);
void Timer3_enable(void);
void Timer3_disable(void);

#endif





xiaoqizi 发表于 2018-8-8 13:07 | 显示全部楼层
所谓的软件定时器是指芯片自带的time?
木木guainv 发表于 2018-8-8 13:09 | 显示全部楼层
用的哪种时钟啊
天灵灵地灵灵 发表于 2018-8-8 19:05 | 显示全部楼层
这个方法可以。
小灵通2018 发表于 2018-8-8 21:05 | 显示全部楼层
最好用code格式。
wowu 发表于 2018-8-9 10:54 | 显示全部楼层
能定时的最大时长是多少啊
lihui567 发表于 2019-6-1 17:10 | 显示全部楼层
软件定时器在硬件定时器资源不足的情况下作用非常明显,用滴答定时器做为时基
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:嵌入式相关网站喜欢的朋友了解一下http://www.micropython.group

31

主题

260

帖子

40

粉丝
快速回复 在线客服 返回列表 返回顶部