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

STM32高级定时器定时变慢

[复制链接]
STMCU小助手 发布时间:2021-8-19 14:04
在做一个项目时,为了节约时间将通用定时器的 定时代码直接改动用来驱动高级定时器,发现时钟比预想的慢了六七倍,百思不得其解。
- ~, u7 U6 n9 Q* N! d6 n+ ~( T. A' M% q0 D
8 p1 v) X3 }: V; i( a: ~
经过各种方式查找后发现是配置高级定时器时一个参数没有配置,造成有定时变慢; j3 s6 H- ^; n# N! V8 q4 N# L
' t# l- w* J$ W

( u2 F3 d9 Z6 ~; Z  改动之前
- t' j9 J8 X9 P  M9 @
  1. <font face="微软雅黑" size="3">
    , _. [# F8 v# s# }* d. q% {0 `
  2. static void TIM1_Mode_Config(void)
    " q. W* t" J/ W5 p9 D3 v2 k# ~
  3. {8 @) w1 O# f. i# e+ O
  4. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    , V4 M+ c3 K2 D% y3 G5 R! S/ {

  5. ) W- l* Z2 e* Q" X, K5 f% k3 E
  6.   /* Time base configuration,输出pwm频率为1KHZ */                 
    + b9 z) ^$ f6 v* R: U) Y( n
  7.   TIM_TimeBaseStructure.TIM_Period = 100-1;       //当定时器从0计数到100,即为100次,为一个定时周期4 B+ k- k9 T$ y: [6 L3 T) _
  8.   TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1;            //设置预分频:不预分频,即为72MHz
      q8 B+ I5 M$ ]$ Y2 g  K
  9.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频(这里用不到)+ r5 d$ y# P( v: ]! z) e
  10.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
    8 W: H2 _  l; k: X; F; d, j9 T
  11.   //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;( B7 _* `& ?* u8 s0 D3 z; Q
  12.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    * @; q9 c6 `5 u" X
  13. }
    + ]4 C5 ], W7 j! y3 m4 c; `$ o6 B
  14. </font>
复制代码
改动之后: p6 L. ~' V" _, K
  1. <font face="微软雅黑" size="3">static void TIM1_Mode_Config(void)
    # U; F/ A% y( W% a% \) J
  2. {
    4 p. O  o: R1 K7 n2 Y
  3. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;$ i6 R6 G5 T! Q& j2 _; w
  4.         TIM_OCInitTypeDef  TIM_OCInitStructure;
    , t1 \. h# X2 c# u( ~5 L5 d
  5. 2 ]) ~  P3 l5 N7 X
  6.   /* Time base configuration,输出pwm频率为1KHZ */                 
    ( W% @. R! r! U4 @/ a/ q& |
  7.   TIM_TimeBaseStructure.TIM_Period = 100-1;       //当定时器从0计数到100,即为100次,为一个定时周期
    3 U' j  m7 \0 N/ G& ^/ d
  8.   TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1;            //设置预分频:不预分频,即为72MHz8 o3 a/ ~  p7 G/ ^! m+ A' w: v
  9.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频(这里用不到)
    1 A, V* }- t" S" M6 g8 N
  10.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式  ~# e* ]5 d' H. G6 h
  11.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    8 s. A5 i' [- Z8 {5 C  t
  12.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);4 E* p: l4 A2 p% ?1 F4 V
  13. }
    & G; [% E: j) v& P. ^5 ^, T' N: W7 T
  14. </font>
复制代码
可以看出增加了TIM_RepetitionCounter 的配置,该参数表明向下计数到多少值时产生中断更新
! f! Y7 A% O% g2 L: w( R8 a0 o1 G) [0 P- M0 ^

) I/ k& q" V* J# S( T4 j固件库中的相关说明2 ]* {2 W% b( ]2 T8 r" B
1.png
* ~' j* H- p9 Y
8 \' p4 v; o' [0 O- W9 u1 S

4 q! a8 i9 n0 c) R查看固件库中的代码,发现库中更改了RCR寄存器的值  Y6 [6 e9 x+ }. L$ k/ H
2.png - p: i) H" s, S+ V. _9 r4 L0 K' a) x" R

4 h$ ]" D/ D# B+ U

& O% [4 q! u, B- P: b5 _7 |查看手册中关于该寄存器的描述
: o( e6 [+ \" o6 B( h 3.png $ X! e+ a% [" X" F9 \: P1 _
# q2 i% T' v+ O4 k; }& w5 O
) g; I: [" a" L0 D, d) {
该寄存器的复位值为0,所以导致定时器变慢的原因可能是TIM_TimeBaseStructure 结构体中的值TIM_RepetitionCounter没有初始化为0就传给了库函数,其值可能为随机值,从而造成问题。, f+ R9 E: J( Z3 N# u6 U' n
. K- f9 P7 Z- i: {: }! k' K0 l2 k

1 o+ K; b+ a7 C
赞 收藏 评论0 发布时间:2021-8-19 14:04

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版