#define MAX_SOFTTIMER 4
static Timer_typedef TimerList[10];
/*************************************************************
Function : SoftTimer_TimerInit
Description: 定时器配置
Input : none
return : none
*************************************************************/
static void SoftTimer_TimerInit(void)
{
u8 i = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 2 - 1;//最大计数值为1
TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;//分频36000,时钟节拍为72M/36000/2=1000,即1ms
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟不分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//增计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM2, ENABLE);//自动重装
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//打开定时器更新中断
TIM_Cmd(TIM2, ENABLE);//打开定时器
for(i = 0; i < MAX_SOFTTIMER; i++) //初始化MAX_SOFTTIMER个软定时器
{
TimerList[i].Timeoutcnt = 1000001;//超时初值
TimerList[i].Timeout = 1000001; //超时的装载值
TimerList[i].Timeoutfuc = (void*)0;//超时的回调函数
TimerList[i].Parameter = (void*)0;//超时的参数
}
}
typedef struct __TIMER
{
u32 Timeoutcnt; //超时计数值
u32 Timeout; //超时重装值
void (*Timeoutfuc)(void* parameter); //超时回调函数
void* Parameter; //回调传递的参数
u8 Timerflag; //超时方式
}Timer_typedef;
/*************************************************************
Function : SoftTimer_Int_Config
Description: 定时器中断配置
Input : none
return : none
*************************************************************/
static void SoftTimer_Int_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //设置中断有优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*************************************************************
Function : SoftTimer_Init
Description: 软定时器初始化
Input : none
return : none
*************************************************************/
void SoftTimer_Init(void)
{
SoftTimer_TimerInit();
SoftTimer_Int_Config();
}
/*************************************************************
Function : SoftTimer_TimerStart
Description: 软定时器开始计时
Input : TimerIdent-软定时器索引
TimeOut-超时计数值
Timeoutfuc(parameter)-超时回调函数
parameter-传递的参数
flag-定时方式:
-TIMER_ONESHOT-单次定时
-TIMER_PERIOD-周期定时
return : none
*************************************************************/
void SoftTimer_TimerStart(u8 TimerIdent, u32 TimeOut, void (*Timeoutfuc)(void* parameter), void* parameter, u8 flag)
{
if(TimerIdent >= MAX_SOFTTIMER)
{
return;
}
__disable_irq(); //关闭总中断,不可重入
TimerList[TimerIdent].Timeoutcnt = TimeOut; //设置超时计数初值
TimerList[TimerIdent].Timeout = TimeOut; //设置超时的转载值
TimerList[TimerIdent].Timeoutfuc = Timeoutfuc; //设置超时的回调函数
TimerList[TimerIdent].Parameter = parameter; //设置超时的参数
TimerList[TimerIdent].Timerflag = flag; //设置超时标志
__enable_irq(); //打开总中断
}
/*************************************************************
Function : SoftTimer_TimerReset
Description: 软定时器复位
Input : none
return : none
*************************************************************/
void SoftTimer_TimerReset(u8 TimerIdent)
{
if(TimerIdent >= MAX_SOFTTIMER)
{
return;
}
TimerList[TimerIdent].Timeoutcnt = 1000001; //超时初值
TimerList[TimerIdent].Timeout = 1000001; //超时的装载值
TimerList[TimerIdent].Timeoutfuc = (void*)0; //超时的回调函数
TimerList[TimerIdent].Parameter = (void*)0; //超时的参数
}
/*************************************************************
Function : SoftTimer_TimerRestart
Description: 软定时器重启,只有之前启动过的软定时器才能重启
Input : none
return : none
*************************************************************/
void SoftTimer_TimerRestart(u8 TimerIdent, u32 TimeOut)
{
if(TimerIdent >= MAX_SOFTTIMER)
{
return;
}
if(TimerList[TimerIdent].Timeout != 1000001)//保证这路软定时器有效且已经曾经启动过
{
TimerList[TimerIdent].Timeoutcnt = TimeOut;//重新设置超时时间
TimerList[TimerIdent].Timeout = TimeOut; //重新设置超时转载值
}
}
/*************************************************************
Function : SoftTimer_TimerStop
Description: 停止软定时器,停止正在计时的软定时器
Input : none
return : none
*************************************************************/
void SoftTimer_TimerStop(u8 TimerIdent)
{
if(TimerIdent >= MAX_SOFTTIMER)
{
return;
}
TimerList[TimerIdent].Timeoutcnt = 1000001;
}
/*************************************************************
Function : SoftTimer_Execute
Description: 周期执行函数
Input : none
return : none
*************************************************************/
void SoftTimer_Execute(void)
{
u8 i = 0;
for(i = 0; i < MAX_SOFTTIMER; i++)
{
if((TimerList[i].Timeoutcnt != 0) && (TimerList[i].Timeoutcnt <= 1000000))
{
TimerList[i].Timeoutcnt--;
if(TimerList[i].Timeoutcnt == 0)
{
if(TimerList[i].Timerflag != TIMER_PERIOD)//单次计时
{
TimerList[i].Timeoutcnt = 1000001;//设置超时初值,超出1000000所以不会继续计数
}
else//周期计时
{
TimerList[i].Timeoutcnt = TimerList[i].Timeout;//重新设置超时计数值
}
TimerList[i].Timeoutfuc(TimerList[i].Parameter); //执行回调函数
}
}
}
}
#ifndef __SOFTTIMER_H__
#define __SOFTTIMER_H__
#include "stm32f10x.h"
#define TIMER_ONESHOT 0 //单次定时
#define TIMER_PERIOD 1 //周期定时
typedef struct __TIMER
{
u32 Timeoutcnt; //超时计数值
u32 Timeout; //超时重装值
void (*Timeoutfuc)(void* parameter); //超时回调函数
void* Parameter; //回调传递的参数
u8 Timerflag; //超时方式
}Timer_typedef;
void SoftTimer_Init(void);
void SoftTimer_TimerStart(u8 TimerIdent, u32 TimeOut, void (*Timeoutfuc)(void* parameter), void* parameter, u8 flag);
void SoftTimer_TimerReset(u8 TimerIdent);
void SoftTimer_TimerRestart(u8 TimerIdent, u32 TimeOut);
void SoftTimer_TimerStop(u8 TimerIdent);
void SoftTimer_Execute(void);
#endif
/*************************************************************
Function : TIM2_IRQHandler
Description: 定时器2中断服务程序
Input : none
return : none
*************************************************************/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
SoftTimer_Execute();
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
PRINTF("\nmain() is running!\r\n");
SoftTimer_Init();
SoftTimer_TimerStart(0, 2000, SoftTimer0Callback, (void*)"SoftTimer0 timeout", TIMER_ONESHOT);//打开软定时器0,超时时间:1s
SoftTimer_TimerStart(1, 1000, SoftTimer1Callback, (void*)"SoftTimer1 timeout", TIMER_PERIOD); //打开软定时器1,超时时间:2s
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
SoftTimer_TimerStop(1);//关闭软定时器1
PRINTF("SoftTimer stop!\r\n");
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
SoftTimer_TimerRestart(1, 500);//软定时器1重启,设置新的定时时间
PRINTF("SoftTimer restart, timeout:500ms!\r\n");
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
SoftTimer_TimerReset(1); //软定时器1复位
PRINTF("SoftTimer reset!\r\n");
while(1)
{
}
}
/*************************************************************
Function : SoftTimer0Callback
Description: 软定时器0超时回调函数
Input : parameter-传递的参数
return : none
*************************************************************/
void SoftTimer0Callback(void *parameter)
{
PRINTF("%s\r\n", (char *)parameter);
}
/*************************************************************
Function : SoftTimer1Callback
Description: 软定时器1超时回调函数
Input : parameter-传递的参数
return : none
*************************************************************/
void SoftTimer1Callback(void *parameter)
{
LED1_Toggle();
PRINTF("%s\r\n", (char *)parameter);
}
上一篇:STM32串口IAP
下一篇:STM32 串口DMA接收
推荐阅读最新更新时间:2024-03-16 15:14