您的位置 首页 分销

STM32之定时器

本文为STM32定时器设计大体简介。

本文为STM32守时器规划大体简介。

一、守时器简介

1、时钟来历

2、守时器结构(以根本守时器为例)

二、根本守时器的编程办法

1、根本守时器的寄存器

2、例程

/**

* @brief 守时器6的初始化,守时周期0.01s

* @param 无

* @retval 无

*/

void TIM6_Init(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

/* 时基初始化 */

TIM_TimeBaseStructure.TIM_Period = 99; //当守时器从0计数到99,即守时周期为100次

TIM_TimeBaseStructure.TIM_Prescaler = 7199; //设置预分频:10KHz

TIM_TimeBaseInit(TIM6, TIM_TimeBaseStructure);

TIM_ARRPreloadConfig(TIM6, ENABLE); //使能TIM6重载寄存器ARR

/* 设置更新恳求源只在计数器上溢或下溢时产生中止 */

TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Global);

/* 守时器6的上溢或下溢中止使能 */

TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

/* 守时器6发动 */

TIM_Cmd(TIM6, ENABLE); //使能守时器6

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

/* 守时器6的NVIC中止装备 */

NVIC_TIM6_Configuration();

}

三、疑问与回答

以下问题皆以根本守时器为例进行论述

1、何谓更新事情

更新事情便是指这个事情产生后,将会将守时器的寄存器进行更新,以使守时器作业在新的装备下,例如当一个守时周期完毕(计数器上溢)或许其他事情。

2、何谓主动重装载寄存器(auto-reload register)

主动重装载寄存器决议了守时器的上溢机遇,当守时器的计数器中数值达到了主动重装载寄存器规则的值,计数器就要归零。也便是说主动重装载寄存器决议了守时器的周期。假定TIMx_ARR=0x36,并且分频系数为1,则可以看到下边的状况。

3、主动重装载寄存器和预加载寄存器的差异与联络

当“TIMx_CR1.ARPE = 1”的时分,STM32中有主动重装载寄存器和预加载寄存器(TIMx_ARR)。

预加载寄存器是主动重装载寄存器的“影子”,也便是预加载寄存器是主动重装载寄存器的缓冲器。主动重装载寄存器的功能在2点现已阐明,可是主动重装载寄存器不是用户用程序可以直接进行操作的,用户需求借助于预加载寄存器(缓冲区)才干拜访它。

其意图是为了确保主动重装载寄存器在适宜的时分被修正,不允许其随意被修正,不然或许导致在过渡的时分产生不希望的成果。

这是什么一个概念呢?

在守时器一个周期完毕的时分,产生了一个更新中止,咱们在中止服务程序中修正预加载寄存器(TIMx_ARR),可是并没有直接写入到主动重装载寄存器。在中止刚一产生的时分(早于咱们的服务程序),本来TIMx_ARR的值被硬件主动装入主动重装载寄存器中。所以下一个守时器周期的长度取决于“本来TIMx_ARR的值”,而非咱们在中止服务程序中的修正值。

那么什么时分,咱们的修正值才起作用呢?

当下一个守时器周期完毕的时分,咱们对TIMx_ARR的修正值就被硬件主动写入到主动重装载寄存器中,所以咱们的修正值鄙人下个守时器周期才起作用。

而当“TIMx_CR1.ARPE = 0”的时分,STM32中只要主动重装载寄存器(TIMx_ARR),没有预加载寄存器。主动重装载寄存器没有缓冲区,对TIMx_ARR的修正,也便是直接对主动重装载寄存器的修正。

这种景象又怎样看呢?

在守时器一个周期完毕的时分,产生了一个更新中止,咱们在中止服务程序中修正主动重装载寄存器(TIMx_ARR)。所以下一个守时器周期的守时长度要取决于咱们的这个修正值。

总结:

① TIMx_CR1.ARPE = 0,主动重装载寄存器没有缓冲区,对TIMx_ARR的修正直接影响下一个周期的守时长度。

② TIMx_CR1.ARPE = 1,主动重装载寄存器有缓冲区,对TIMx_ARR的修正影响的是下下一个周期的守时长度。

③ TIMx_CR1.ARPE = 1,主动重装载寄存器有缓冲区预加载寄存器(TIMx_ARR),预加载寄存器更新到主动重装载寄存器的机遇是:当守时器一个守时周期完毕产生一个更新事情的时分。

④ TIMx_CR1.ARPE = 1,留意咱们在写程序的时分,给TIMx_ARR赋值,并没有真实的写入到主动重装载寄存器中,而是写入到了预加载寄存器中。

当咱们需求守时器以T1和T2替换作业:

⑤ TIMx_CR1.ARPE = 0,主动重装载寄存器没有缓冲区,咱们是在T1守时周期现已开端一瞬间的时分,才去设定守时周期T1长度;在T2守时周期现已开端一瞬间的时分,才去设定守时周期T2长度。由于当T1完毕的时分,中止产生后,咱们在中止程序中设定守时周期为T2。其实,此刻守时器周期T2现已开端一段时刻了。要知道守时器一个周期完毕的时分,硬件主动进入下一个周期的计数,而不受软件的操控。

⑥ TIMx_CR1.ARPE = 1,主动重装载寄存器有缓冲区,咱们是在T1守时周期一开端,就去设定守时周期T1的长度;在T2守时周期一开端,就去设定守时周期T2的长度。由于当T1完毕的时分,更新事情产生(中止也产生),(咱们在上一个守时周期的中止程序中现已设定守时周期为T2),TIMx_ARR中的T2值被硬件更新进入到主动重装载寄存器中。

⑦ 当T1、T2两个周期都很大的时分,需求ticks比较多,两种方法都不会呈现过错。

可是当T1、T2两个周期都很小的时分,需求ticks比较少,关于“TIMx_CR1.ARPE = 0”的状况,就有或许呈现问题。由于有或许在T1守时周期现已超越T1时刻长度的时分,才去设定守时周期T1;在T2周期现已超越T2时刻长度的时分,才去设定守时周期T2。

总结:

在需求不断切换守时器的周期时,并且周期都比较短,程序员需求经过预加载寄存器合作主动重装载寄存器,来操作守时器,以确保守时器周期的平稳过渡。

主动重装载寄存器是预加载的,每次读写主动重装载寄存器时,实际上是经过读写预加载寄存器完成。依据TIMx_CR1 寄存器中的主动重装载预加载使能位(ARPE) ,写入预加载寄存器的内容可以当即或在每次更新事情时,传送到它的影子寄存器。

  • STM32单片机中文官网
  • STM32单片机官方开发工具
  • STM32单片机参阅规划

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/150939.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部