关于STM32定时器1的使用

来源:互联网 发布:淘宝确认自动收货时间 编辑:程序博客网 时间:2024/05/16 06:08

作为高级定时器,它的使用与通用定时器相比,使用起来比较复杂,它的功能也比较强大。它也可以当通用定时器使用,但是方法略有不同:

void TIM1_Int_Init(u16 arr,u16 psc)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   //时钟使能

 //TIM_OCInitTypeDef TIM_OCInitStructure;  //比较PWM的时候用。
 //TIM1 使用内部时钟
 //TIM_InternalClockConfig(TIM1);
 //TIM1基本设置
 //设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
 //TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
 //向上计数模式
 //TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
 TIM_TimeBaseStructure.TIM_Period = arr;  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
 TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //设置时钟分割:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  //根据指定的参数初始化TIMx的时间基数单位
 //清中断,以免一启用中断后立即产生中断
 TIM_ClearFlag(TIM1, TIM_FLAG_Update);
 //使能TIM1中断源
 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
 

 //Step3.中断NVIC设置:允许中断,设置优先级
 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;    //更新事件
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          //响应优先级1
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
 NVIC_Init(&NVIC_InitStructure);                            //写入设置

 //TIM1总开关:开启
// TIM_Cmd(TIM1, ENABLE);
}

//定时器1中断
void TIM1_UP_IRQHandler(void)
{
 if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
 {
  TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
  ResetTime++;
 }
}

这是我刚开始使用的时候,发现的问题是定时器1能使用,但是我把TIM3和它初始化一样的时候发现,时间跑起来居然慢了接近三倍,后来在网上查资料查了好久,也不知道原因最后找到需要加一条语句: TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;   在高级定时器中需要清零,在通用中可以不使用...
然后时间就了。

整体如下:


void TIM1_Int_Init(u16 arr,u16 psc)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   //时钟使能

 //TIM_OCInitTypeDef TIM_OCInitStructure;  //比较PWM的时候用。
 //TIM1 使用内部时钟
 //TIM_InternalClockConfig(TIM1);
 //TIM1基本设置
 //设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
 //TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
 //向上计数模式
 //TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
 TIM_TimeBaseStructure.TIM_Period = arr;  //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
 TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //设置时钟分割:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数器计数器清零  
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  //根据指定的参数初始化TIMx的时间基数单位
 //清中断,以免一启用中断后立即产生中断
 TIM_ClearFlag(TIM1, TIM_FLAG_Update);
 //使能TIM1中断源
 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
 

 //Step3.中断NVIC设置:允许中断,设置优先级
 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;    //更新事件
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          //响应优先级1
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
 NVIC_Init(&NVIC_InitStructure);                            //写入设置

 //TIM1总开关:开启
// TIM_Cmd(TIM1, ENABLE);
}

//定时器1中断
void TIM1_UP_IRQHandler(void)
{
 if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
 {
  TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
  ResetTime++;
 }
}


 

原创粉丝点击