定时器时间计算:定时器时钟/分频/PER/ARR=频率 。时间=1/频率
若用定时器的PWM控制步进电机驱动器,则要看相关电机的驱动频率,然后开启中断选择CCx做为中断源(定时器的计时器和比较去比),进入一次中断就说明发了一次脉冲。
1:开启成功定时器的时钟。
2:初始化定时器(部分参数只有高级定时器才有/基本定时器只能CNT加计时,不可以减)
3:配置相关定时器的中断NVIC
4:开启定时器中断;
5:CMD定时器:就开始定时了。定时时间看第一句
进入中断后,记得清除中断标志位哇。
配置:
/*
函数名:void time2_init(void)
功能:初始化定时器2
形参:
*/
void time2_init(void)
{
TIM_TimeBaseInitTypeDef TIM2_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器2的时钟
TIM2_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//定时器不分频 分频 系统时钟/分频
TIM2_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计时模式 向上
TIM2_TimeBaseInitStruct.TIM_Period=719;//per 预分系数 决定频率
TIM2_TimeBaseInitStruct.TIM_Prescaler=9999;//arr 重载值 实际计算 定时器时钟/arr+1/per+1=时间 1/时间=
TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseInitStruct);
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);//开启定时器2的中断
TIM_Cmd(TIM2,ENABLE);//定时器开始定时
}
NCIV:
void nvic_init(void)
{
NVIC_InitTypeDef NVIC_tim2_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组
NVIC_tim2_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//NVIC中断源选择
NVIC_tim2_InitStruct.NVIC_IRQChannelCmd=ENABLE;//开启定时器2的中断
NVIC_tim2_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//分组强
NVIC_tim2_InitStruct.NVIC_IRQChannelSubPriority=2;//子优先
NVIC_Init(&NVIC_tim2_InitStruct);
}
中断函数
/*
函数名:TIM2_IRQHandler(void)
功能:定时器2中断 0.1S进入中断
形参:
*/
u16 temp=0;
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
temp++;
if(temp<10)
{
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);
}
else if(temp>10&&temp<=20)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);
if(temp>=20)
{
temp=0;
}
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}