STM32定时器简介
STM32定时器有多种分为高级定时器、通用定时器、基本定时器
[tr]主要功能高级定时器通用定时器基本定时器[/tr]内部时钟源是是是
![]()
另外的三种特殊的定时器:独立看门狗定时器、窗口看门狗定时器、系统滴答定时器(集成在Cortex-MX内部的SysTick定时器)
计数模式
1.向上计数模式:控制寄存器TIMx_CR1中CMS等于00,DIR=0时选择向上计数模式。向上计数模式中计数器从零开始向上计数到自动装载值(TIMx_ARR计数器中),当计数溢出的时候产生一个计数器溢出时间。同时产生一个更新事件。在TIMx_EGR寄存器中设置UG位,同时产生一个更新事件。
2.向下计数模式:控制寄存器TIMx_CR1中CMS等于00,DIR=1时选择向下计数模式。向下计数模式中计数器从装入的值开始向下计数到0(该装入值为TIMx_ARR计数器的值),然后从自动装入的值重新向下计数,同时产生一个更新事件。在TIMx_EGR寄存器中设置UG位,同时产生一个更新事件。
3.中央对齐模式(向上向下计数模式):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后在从0开始重新计数。
在库函数开发中可以选择以下函数选择:
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;//例如计数模式选择向上计数模式 通用定时器的使用流程
1.中断设置
注意中断通道的选择根据不同的定时器。由于不同的定时器产生不同的中断请求,针对不同的定时器应该选择不同的中断通道。代码如下
NVIC_InitStructure.NVIC_IRQChannel = NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_InitStructure.NVIC_IRQChannelCmd = NVIC_Init(&NVIC_InitStructure); 2.定时器中断配置
STM32F103的高级控制定时器使用的是APB2,基本定时器和其他定时器使用APB1总线。预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。因为这个控制寄存器带有缓冲器,它能够在运行时被改变。新的预分频器的参数在下一次更新事件到来时被采用。当预分频系数从1变成2时:
![]()
当预分频系数从1变成4时:
![]()
注意:在完成时基设置之后需要清除中断标志位以及使能TIM中断源。
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动装载值 TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //设置预分频系数 TIM_TimeBaseInitStrue.TIM_RepetitionCounter= TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //清除中断标志位 中断服务程序:
void TIM3_IRQHandler(void)//该函数原型在启动文件中{ if(TIM_GetITStatus(TIM3,TIM_IT_Update)) { TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除定时中断标志 } } 相关计算公式(在系统时钟为72MHz情况下):
TIM_Period*(TIM_Prescaler+1)/72000000
其中TIM_Period为计数值,TIM_Prescaler为预分频系数。