你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开发项目:定时器预装载寄存器(ARR)

[复制链接]
STMCU小助手 发布时间:2022-4-14 10:31
项目背景) a8 Y$ n7 Q6 S
笔者在进行某项目开发时,需要实时调节定时器的周期,以控制定时器下次更新中断的时间。, V! F4 }$ G6 K

3 e/ \" A: F/ V+ M预装载寄存器
+ w6 h5 B/ e/ X自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器)。. E9 i7 k# U! w
+ f* B$ ^9 R$ Z3 N: M$ p; U
在图中可以看到auto-reload register这个框有一个阴影,有些其它寄存器也有用阴影表示,如我用蓝色标出的Capture/Compare寄存器;有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);正如手册上的14.3.1节所说,根据TIMx_CR1寄存器中APRE位的设置,preload register的内容可以随时传送到shadow register,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把preload register的内容传送到shadow register。/ t) B0 S5 k3 K0 f& `- M7 B7 T

& Y7 f' ?4 s# R1 G+ @5 O+ }1 Z $%BLBB226AZSI2ZXI4VB61S.png ' u* o+ ^% ]+ D  P2 {

  g9 O" E# i6 `4 ]) g实现方法
: }6 O) @0 p! }禁用预装载寄存器,修改ARR的值(TIM_Period)会直接操作影子寄存器,新的ARR值将立即生效:
9 D* c8 x9 h# ^6 C- f
( u, s* `' d1 S6 j. o
  1. TIM_ARRPreloadConfig(TIM4, DISABLE);
复制代码
& v, i/ ~! k3 |
使能预装在寄存器,修改ARR的值(TIM_Period)会操作预装载寄存器,直到更新事件后,ARR预装载寄存器的值才会被拷贝到影子寄存器中:1 z/ ]7 I* U; W

' F$ b5 \6 C  e( l. g
  1. TIM_ARRPreloadConfig(TIM4, ENABLE);
复制代码

9 K* S& {. T: S* H( N9 Z. f4 ATIM_ARRPreloadConfig函数的定义如下:
! A& Z) g. _1 _% F( s+ r" S. [# L7 F0 Q3 e9 s8 J
  1. /**
    0 K  J! }4 O7 F0 S5 C2 g
  2.   * @brief  Enables or disables TIMx peripheral Preload register on ARR.
    * d+ y$ o+ O* R
  3.   * @param  TIMx: where x can be  1 to 17 to select the TIM peripheral.
    ) ^% v% c0 C% ]* F/ M( {& g
  4.   * @param  NewState: new state of the TIMx peripheral Preload register6 v" M1 q3 L+ T6 H. _
  5.   *   This parameter can be: ENABLE or DISABLE.: q+ m# \7 C9 c) A
  6.   * @retval None
    ; e* d6 [4 t5 Z& T) W
  7.   *// e8 W. ^( v4 U8 r2 b* |' Z5 |
  8. void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)7 V) x2 t1 ]5 X3 `7 x* M
  9. {% F% P7 B- ]) _$ v* U
  10.   /* Check the parameters */: p: ^0 @4 {- M3 C# R0 }# ]& a7 [
  11.   assert_param(IS_TIM_ALL_PERIPH(TIMx));5 l3 A  f) c6 q' ^$ @2 H
  12.   assert_param(IS_FUNCTIONAL_STATE(NewState));2 s7 Q& Y$ U. X2 s% I* a
  13.   if (NewState != DISABLE)
    : O) {1 {) F+ g% O2 g' X, f+ Q
  14.   {
    . r/ S& N: J3 I9 k) Y- X% B5 R
  15.     /* Set the ARR Preload Bit */
    # d, V1 J; |1 G% z
  16.     TIMx->CR1 |= TIM_CR1_ARPE;6 t& ~, V1 ~/ `* _8 k# U
  17.   }3 r( X0 P% a1 K: n: a2 b
  18.   else* S) K  w* L6 k% `
  19.   {8 R" \( }+ \  W3 R! j1 c
  20.     /* Reset the ARR Preload Bit */1 {2 j( O, Z: l  V% W- R
  21.     TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE);
      ^+ {5 j/ ^2 N8 I1 F: M
  22.   }
    5 a  s) o3 q4 c* {/ T* }+ t; }
  23. }
    # U0 x" |8 L# A( k/ r
复制代码
8 f( e: S* f$ l" B! u

$ _8 U% u/ ~2 k- ]" L6 L* c4 k8 z2 L
收藏 评论0 发布时间:2022-4-14 10:31

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版