文章
博客 网店

 STM32F1定时器简单定时示例


高级定时器定时 (TIM1):

void Timer1Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef         NVIC_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 
  //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  NVIC_Init(&NVIC_InitStructure); 

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//注意此项是必须的
        TIM_TimeBaseStructure.TIM_Period = 10000; 
        TIM_TimeBaseStructure.TIM_Prescaler =7200;  
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 

        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM1, ENABLE);  
}
//中断函数
void TIM1_UP_IRQHandler(void)  
{  
  TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
  ////
}  



通用定时器TIM3:

void Timer3Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef         NVIC_InitStructure;
  
  //tim3
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  

  //(注:总线分频器大于1时TIM3时钟为总线时钟的两倍,也就是72MHz,祥情参考STM32参考手册7.2节)
  TIM_TimeBaseStructure.TIM_Period =10000;      //上限值
  TIM_TimeBaseStructure.TIM_Prescaler = 7200;    //预分频
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1  ;  //滤波器分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
  
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//中断允许
  TIM_Cmd(TIM3, ENABLE);  
}

//中断函数
void TIM3_IRQHandler(void)
{
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  
  ////
}


系统定时器应用示例

volatile uint32_t g_SysTimer; //系统定时1ms计数器

//初始化,既配置系统定时器
void SysTickInit(void)
{
 g_SysTimer=0;   
 SysTick_Config(72000); //系统时钟/1000=产生一ms中断  
}

//获取当前定时值
uint32_t GetCurrentTick(void)
 {
   uint32_t ret;
   CLI();
   ret=g_SysTimer;
   SEI();
   return ret;
 }

//计算从定时值t过去时间
uint32_t GetPassedTick(uint32_t t)
{
 uint32_t cur=GetCurrentTick();

 if(cur>=t)
   return (cur-t);

 return (cur+(0xffffffff-t));
}

//精确延时
void SysDelayMs(uint32_t t)
{
 uint32_t tick=GetCurrentTick();
 while(GetPassedTick(tick)<t);
}

//系统定时器中断函数
void SysTick_Handler( void )
{
  g_SysTimer++;  
}


芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved