STM32定时器使用(一)时钟定时

定时器分类 1,基本定时器TIM6、TIM7;计时,能产生中断,没有输入输出引脚;
2,通用计时器TIM2、TIM3/TIM4/TIM5;计时、中断、比较/捕获,PWM方波输出,编码器接口;
3,高级定时器TIM1、TIM8;上面都具有,还具有三相6步电机的接口、刹车功能以及用于PWM驱动电路的四驱时间控制。
时钟源 TIM2-TIM7的时钟源是APB1
TIM1、TIM8的时钟源是APB2
应用代码 使用TIM2的基本定时器功能,配置过程
1、配置TIM2,打开时钟,重装载值设置(周期),时钟分频器,计数方式,使能中断

void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* 打开时钟 72MHZ */ TIM_TimeBaseStructure.TIM_Period=1000; /* 重装载值*/ TIM_TimeBaseStructure.TIM_Prescaler= 71; /*时钟预分频数72,也就是本来72M,现在是1M */ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 对外部时钟进行采样的时钟频率,这里没有用到 */ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //设置TIM2参数 TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除标志位 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中断TIM_Cmd(TIM2, ENABLE); //使能定时器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); /*先关闭,等待使用*/ }

接下来配置中断优先级
void TIM2_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //无主优先级,次优先级为16个 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //指定中断服务函数 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //这里0-15都可以 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

接下来写中断服务函数
extern volatile u32 time; //volatile是修饰字符,不用优化 void TIM2_IRQHandler(void) { if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) { time++; TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); } }

【STM32定时器使用(一)时钟定时】主函数的循环
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); //打开时钟开始计数 while(1) { if ( time == 1000 ) /* 1000 * 1 ms = 1s 周期,中断1000次,中断中期为1/1M = 1ms */ { time = 0; //做自己的事 } }

    推荐阅读