高级定时器和基本定时器通用定时器有较大区别。
基本定时器就只能进行定时操作。且CNT只能加。
基本定时器能进行定时,PWM的生产,输入捕获啥的
高级定时器能定时/PWM。输入捕获,输出互补和死区刹车的生产。
高级定时器定时器1有4个中断函数/含中断源。
中断源:
TIM1_BRK_IRQn //打破中断 = 24, /*!< TIM1 Break Interru TIM1_UP_IRQn 更新中断//定时 = 25, /*!< TIM1 Update Inte TIM1_TRG_COM_IRQn 定时器触发器交换中断 = 26, /*!< TIM1 TIM1_CC_IRQn CCR寄存器中断
中断函数:
TIM1_BRK_IRQHandler ; TIM1 Break
TIM1_UP_IRQHandler ; TIM1 Update
TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
IM1_CC_IRQHandler
正常定时使用和其他没什么区别,就中断函数,中断源不同
使用:
1:开启相关时钟
2:初始化定时器
3:初始化NVIC
4:选择定时器中断源
5:CMD定时器 开启
时钟计算看参考前面文章
#include "time.h"
/*
函数名:void rgb_init(void)
功能:初始化GPIOB
形参:
*/
void rgb_init(void)
{
GPIO_InitTypeDef GPIOB_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GBIOB的时钟
GPIOB_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO模式 推挽
GPIOB_InitStruct.GPIO_Pin|=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;//引脚选择
GPIOB_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//输出速度
GPIO_Init(GPIOB,&GPIOB_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);//初始化时电平置高//电路驱动默认不启动
}
/*
函数名:void nvic_init(void)
功能:初始化nvic
形参:
*/
void nvic_init(void)
{
NVIC_InitTypeDef NVIC_tim1_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组
NVIC_tim1_InitStruct.NVIC_IRQChannel=TIM1_UP_IRQn;//NVIC中断源选择 // TIM1_BRK_IRQn //打破中断 = 24, /*!< TIM1 Break Interrupt */
// TIM1_UP_IRQn 更新中断//定时 = 25, /*!< TIM1 Update Interrupt */
// TIM1_TRG_COM_IRQn 定时器触发器交换中断 = 26, /*!< TIM1 Trigger and Commutation Interrupt */
// TIM1_CC_IRQn CCR寄存器中断
NVIC_tim1_InitStruct.NVIC_IRQChannelCmd=ENABLE;//开启定时器1的中断
NVIC_tim1_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//分组强
NVIC_tim1_InitStruct.NVIC_IRQChannelSubPriority=2;//子优先
NVIC_Init(&NVIC_tim1_InitStruct);
}
/*
函数名:void time2_init(void)
功能:初始化定时器2
形参:
*/
void time1_init(void)
{
TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//开启定时器2的时钟
TIM1_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//定时器不分频 分频 系统时钟/分频
TIM1_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计时模式 向上
TIM1_TimeBaseInitStruct.TIM_Period=719;//per 预分系数 决定频率
TIM1_TimeBaseInitStruct.TIM_Prescaler=9999;//arr 重载值 实际计算 定时器时钟/arr+1/per+1=时间 1/时间=
TIM1_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct);
TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE);//开启定时器2的中断
TIM_Cmd(TIM1,ENABLE);//定时器开始定时
}
/*
函数名:TIM2_IRQHandler(void)
功能:定时器2中断 0.1S进入中断
形参:
*/
u16 temp=0;
void TIM1_UP_IRQHandler(void) //有4个不同的中断函数
{
if(TIM_GetITStatus(TIM1,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(TIM1,TIM_IT_Update);
}
MAIN使用
NVIC在定时器初始化前就好了。