stm32通用定时器中断

通用定时器主要由以下几个部分组成:
stm32通用定时器中断_第1张图片

(1)时基单元
主要包括:计数器寄存器、预分频寄存器和自动装载寄存器
(2)时钟发生器:产生时钟源
(3)输入捕获通道
(4)输出通道
其中定时器中断只涉及了(1)(2)两个部分:
stm32通用定时器中断_第2张图片

定时器中断流程如下:
(1)选择时钟源,需要操作从模式控制寄存器TIMx_SMCR的低3位,默认为000,预分频器直接由内部时钟驱动。
stm32通用定时器中断_第3张图片

(2)设置预分频寄存器TIMx_PSC
图4
默认调用SystemInit函数情况下:
SYSCLK=72M
AHB时钟=72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1时钟=2
所以,通用定时器时钟CK_INT=2*36M=72M
当设置CK_PSC+1为1,则CK_CNT和CK_INT一致,如图2波形图所示。

(3)设置控制寄存器TIMx_CR1、重装载寄存器TIMx_ARR以及中断使能寄存器TIMx_DIER等,选择计数模式,计数周期等。以向上计数模式为例,当计数寄存器计数到达设定值时,就会产生溢出,就会有更新事件和更新中断标志,如果使能中断,就会执行中断程序。

溢出时间计算:Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk
(ARR+1)计数次数*((PSC+1)/Tclk)单次计数时间
当采用系统初始化时,APB1时钟为36M,倍频后通用定时器时钟72M,即Tclk为72M,设置PSC为7199,则得到cnk的计数频率为72M/7200=10K,单次计数时间为0.1ms,再设置ARR为4999,则溢出时间为500ms,也就是每500ms产生一次溢出。

结合代码具体实现通用定时器中断:(以默认内部时钟和通用定时器3为例)
(1)使能定时器时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

(2)初始化定时器,配置ARR,PSC

TIM_TimeBaseInitTypeDef tis;
tis.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值 
 tis.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值
 tis.TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分割
 tis.TIM_CounterMode=TIM_CounterMode_Up;  //TIM向上计数模式
 TIM_TimeBaseInit(TIM3,&tis);//根据指定的参数初始化TIMx的时间基数单位

(3)开启定时器中断,并配置NVIC,一般在主函数进行中断分组
中断分组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

配置中断

 NVIC_InitTypeDef nvics;
 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,使能更新中断
 nvics.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
 nvics.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
 nvics.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
 nvics.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
 NVIC_Init(&nvics);  //初始化NVIC寄存器

(4)使能定时器

TIM_Cmd(TIM3, ENABLE);  //使能TIMx 

(5)编写中断服务函数

void TIM3_IRQHandler(void)   //TIM3中断
{
 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  {
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
  xxxx//执行的动作
  }
}

你可能感兴趣的:(STM32)