在做一个项目时,为了节约时间将通用定时器的 定时代码直接改动用来驱动高级定时器,发现时钟比预想的慢了六七倍,百思不得其解。
- ~, 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 @- <font face="微软雅黑" size="3">
, _. [# F8 v# s# }* d. q% {0 ` - static void TIM1_Mode_Config(void)
" q. W* t" J/ W5 p9 D3 v2 k# ~ - {8 @) w1 O# f. i# e+ O
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
, V4 M+ c3 K2 D% y3 G5 R! S/ { -
) W- l* Z2 e* Q" X, K5 f% k3 E - /* Time base configuration,输出pwm频率为1KHZ */
+ b9 z) ^$ f6 v* R: U) Y( n - TIM_TimeBaseStructure.TIM_Period = 100-1; //当定时器从0计数到100,即为100次,为一个定时周期4 B+ k- k9 T$ y: [6 L3 T) _
- TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1; //设置预分频:不预分频,即为72MHz
q8 B+ I5 M$ ]$ Y2 g K - TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(这里用不到)+ r5 d$ y# P( v: ]! z) e
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
8 W: H2 _ l; k: X; F; d, j9 T - //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;( B7 _* `& ?* u8 s0 D3 z; Q
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
* @; q9 c6 `5 u" X - }
+ ]4 C5 ], W7 j! y3 m4 c; `$ o6 B - </font>
复制代码 改动之后: p6 L. ~' V" _, K
- <font face="微软雅黑" size="3">static void TIM1_Mode_Config(void)
# U; F/ A% y( W% a% \) J - {
4 p. O o: R1 K7 n2 Y - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;$ i6 R6 G5 T! Q& j2 _; w
- TIM_OCInitTypeDef TIM_OCInitStructure;
, t1 \. h# X2 c# u( ~5 L5 d - 2 ]) ~ P3 l5 N7 X
- /* Time base configuration,输出pwm频率为1KHZ */
( W% @. R! r! U4 @/ a/ q& | - TIM_TimeBaseStructure.TIM_Period = 100-1; //当定时器从0计数到100,即为100次,为一个定时周期
3 U' j m7 \0 N/ G& ^/ d - TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/100000)-1; //设置预分频:不预分频,即为72MHz8 o3 a/ ~ p7 G/ ^! m+ A' w: v
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(这里用不到)
1 A, V* }- t" S" M6 g8 N - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 ~# e* ]5 d' H. G6 h
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
8 s. A5 i' [- Z8 {5 C t - TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);4 E* p: l4 A2 p% ?1 F4 V
- }
& G; [% E: j) v& P. ^5 ^, T' N: W7 T - </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
* ~' 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
- 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
$ 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 |