STM32用一个定时器封装多个定时函数调用
- 用一个定时器开一个1ms的中断:
头文件宏定义如下:
#define BASIC_TIM TIM6
#define BASIC_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BASIC_TIM_CLK RCC_APB1Periph_TIM6
#define BASIC_TIM_Period 1000-1
#define BASIC_TIM_Prescaler 71
#define BASIC_TIM_IRQ TIM6_IRQn
#define BASIC_TIM_IRQHandler TIM6_IRQHandler
extern uint32_t LibVarTimer[10]; //°´¼ü´¥·¢,×ö¸ßµçƽ´æ´¢
extern BOOL LibTimer(uint8_t Channal,BOOL Trigger,uint32_t Time,BOOL Signal);
配置函数如下:
static void BASIC_TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;
TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
//TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
TIM_Cmd(BASIC_TIM, ENABLE);
}
中断优先级配置如下:
static void BASIC_TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断函数如下:
void BASIC_TIM_IRQHandler(void)
{
uint8_t i;
if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET )
{
for(i=0;i<10;i++)
{
LibVarTimer[i]++;
}
TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
}
}
2.开始封装函数
uint32_t LibVarTimer[10]={0,0,0,0,0,0,0,0,0,0};
uint8_t LivVarTimeTriggerLast[10];
uint8_t LibVarTimeEdgeStart[10];
uint8_t LibVarTimeSignalLast[10];
/* ******************************************************
** 输入参数:Channal:通道;Trigger:电平;Time:时间;Signal:输入;
** 返回参数:溢出产生一次上升沿触发
** *************************************************** */
BOOL LibTimer(uint8_t Channal,BOOL Trigger,uint32_t Time,BOOL Signal)
{
uint8_t Result=0;
if(Channal<10)
{
switch(Trigger)
{
case 0:
//低电平
if(LivVarTimeTriggerLast[Channal]!=0 || Signal!=0)
{
LibVarTimer[Channal] = 0;
}
Result = 0;
while(LibVarTimer[Channal]>=Time)
{
LibVarTimer[Channal] -= Time;
Result = 1;
}
break;
case 1:
//高电平
if(LivVarTimeTriggerLast[Channal]!=1 || Signal!=1)
{
LibVarTimer[Channal] = 0;
}
Result = 0;
while(LibVarTimer[Channal]>=Time)
{
LibVarTimer[Channal] -= Time;
Result = 1;
}
break;
case 2:
//上升沿
if(LivVarTimeTriggerLast[Channal]!=2)
{
LibVarTimer[Channal] = 0;
LibVarTimeEdgeStart[Channal] = 0;
}
if(LibVarTimeEdgeStart[Channal]==0)
{
LibVarTimer[Channal] = 0;
}
if(Signal>0 && LibVarTimeSignalLast[Channal]==0)
{
LibVarTimeEdgeStart[Channal] = 1;
}
Result = 0;
while(LibVarTimer[Channal]>=Time)
{
LibVarTimer[Channal] -= Time;
LibVarTimeEdgeStart[Channal] = 0;
Result = 1;
}
break;
case 3:
//下降沿
if(LivVarTimeTriggerLast[Channal]!=3)
{
LibVarTimer[Channal] = 0;
LibVarTimeEdgeStart[Channal] = 0;
}
if(LibVarTimeEdgeStart[Channal]==0)
{
LibVarTimer[Channal] = 0;
}
if(Signal==0 && LibVarTimeSignalLast[Channal]>0)
{
LibVarTimeEdgeStart[Channal] = 1;
}
Result = 0;
while(LibVarTimer[Channal]>=Time)
{
LibVarTimer[Channal] -= Time;
LibVarTimeEdgeStart[Channal] = 0;
Result = 1;
}
break;
default:
Result = 0;
}
LivVarTimeTriggerLast[Channal] = Trigger;
LibVarTimeSignalLast[Channal] = Signal;
}
return Result;
}
由一个定时器封装出10个函数可以调用,
缺点:比较占内除,