STM32定时器自动重装载寄存器和预加载寄存器的区别与联系

当“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。

总结:

在需要不断切换定时器的周期时,而且周期都比较短,程序员需要通过预加载寄存器配合自动重装载寄存器,来操作定时器,以保证定时器周期的平稳过渡。

  • 25
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于STM32F10x系列微控制器,定时器装载是一种常见的操作。定时器装载是指在定时器倒计数到达设值后,自动重新加载设值,用于实现定时功能。 在STM32F10x系列微控制器中,有多个定时器可供使用,例如TIM1、TIM2、TIM3等。下面以TIM2为例来说明定时器装载。 首先,你需要初始化定时器的相关寄存器,设置定时器的工作模式和分频值。然后,设置定时器自动装载值,即通过修改ARR寄存器设置设值。 下面是一个简单的示例代码,用于设置TIM2定时器装载功能: ```c #include "stm32f10x.h" void TIM2_Init(void) { // 使能定时器2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 设置定时器2的工作模式为向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置分频值为7200,即定时器时钟频率为72MHz/7200 = 10kHz TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 设置自动装载值为10000,即定时器溢出时间为1秒 TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // 应用定时器初始化配置 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 使能定时器2 TIM_Cmd(TIM2, ENABLE); } ``` 在上述代码中,我们将定时器2的工作模式设置为向上计数模式,分频值设置为7200(即定时器时钟频率为72MHz/7200 = 10kHz),自动装载值设置为10000(即定时器溢出时间为1秒)。 通过调用TIM_TimeBaseInit函数将配置应用到定时器2,然后使能定时器2。 这样,定时器2就会以10kHz的频率计数,并在计数到10000时自动重新加载设值,实现定时功能。 注意:以上代码仅为示例,实际应用中需要根据具体需求进行适当的修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值