本文为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单片机参阅规划