MCU:stm32L0
t' U. W; ^( b! `- v. v4 E主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。
! w0 g5 X1 f4 a
3 |" n, Q/ n" ~- f0 a+ C0 z$ j//SYSCLK=Fs*PLLMUL/PLLDIV;. C' W) V% y% @* J1 w2 B/ S- I
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));/ a1 S# v8 i7 S! l- c* x7 o
//SYSCLK =
1 W( n: @7 W4 o( h" \% Z/ d//Fs 8M # S8 U' B5 k# {
//Fvco: 8M
# X. f! T+ n3 O, T+ I//SYSCLK: 系统时钟频率 8*8/2=32: m Z# g9 k q. J
//PLLMUL:倍频 8
8 D! v' [7 V4 E+ R8 w" b8 ?1 Y//PLLDIV:分频系数 2 * y; ^* U2 k3 v# a0 m$ n
: k9 M: G" M+ ~" b以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M
( a( c1 l% i1 y& x: G" u# R/ e, h; v& ~# U- U
通用定时器时钟为AHB1时钟的2倍,8M。
" d4 r: |. s8 M, x. ]% P2 F W
0 f6 a2 h0 T) B T; o可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,; k( w, d+ i6 x: r
- F# @" o) ?1 ]$ k7 R
则计数频率为(计数值+1)/(计数值)=1000Hz( V3 k7 q; @1 o! S0 }
4 [2 ^9 O* g" E, @3 y( I
分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。
* X( G2 o* B, Z! l' J8 ^% X! s; W
1 {9 B1 C& i+ M3 r0 i, F; H配置定时器代码如下:
, e% b. ?% j( X9 u# j: j! A k+ ^
, g$ ?$ C: L k& ~ e- TIM_HandleTypeDef TIM2_Handler; //定时器句柄
& a9 s5 I& k" m- u
1 s p! f! j) M$ G/ a8 b- ! q/ v& N# N( n- q! F) T7 Y8 Z
- void TIM2_Init(void) //定时10s P& p/ g% Q: e! k
- {
& }# ]$ q t0 [$ K$ g - TIM2_Handler.Instance = TIM2;1 d* W* e. O# m) i
- TIM2_Handler.Init.Prescaler = 7999;+ }9 ]9 a( e) [
- TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
9 C1 Q( c' W1 n - TIM2_Handler.Init.Period = 9999;
% i: d/ o+ F) x2 i) D) ^+ Q - TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
* i& |$ I1 q6 e$ p8 d* L - HAL_TIM_Base_Init(&TIM2_Handler);
& Y9 |1 m( e7 x2 Z: Z- r; M - * D/ ^; ?( V! K$ f8 {
- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
4 i5 z' b+ t1 m i& O9 C- m - * L1 C# R4 c# F( D: c
- }
, p, S6 r( X2 V
- z5 {, f& ]) J! |7 Q9 i7 e
- h; v2 r' N1 l. E) |- //定时器底册驱动,开启时钟,设置中断优先级+ S0 }2 y! s" U" ]6 e3 U
- //此函数会被HAL_TIM_Base_Init()函数调用7 D1 h! \" ], o3 O
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)2 s6 w: h2 G, s* B8 _& H
- {
, v0 }0 p6 K8 m, J - if(htim->Instance==TIM2)
$ E8 w+ B0 W7 J' ]7 w - {
7 E1 y K8 ]5 P r - __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟
1 l+ `5 A A9 V9 i5 h* K3 g - HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
: c6 @# L3 f5 N5 Q - HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断 3 S' m$ ?4 V7 M; P8 m
- }
b" ~; h# Q4 y. N. G' L - }$ N- d9 J" B+ L) c5 v
# R: n% o" Y J/ E- S- //定时器2中断服务函数
' U {( R2 w, j; D4 G - void TIM2_IRQHandler(void)
R2 C$ p/ g! q - {
. `, d7 g" z' Z/ i - HAL_TIM_IRQHandler(&TIM2_Handler);5 Q3 F, `$ j0 s) ^# E% Y4 P, c5 @
- }
9 L+ ~9 e5 ~# B9 u" l2 ?" \/ M1 `" t - 1 K* u8 M( J9 e( t
- 5 e$ L, P( l7 j' ~$ {1 h
- uint16_t sec_10 = 0;
+ ?& u! G" k1 a! s
' _; N+ f. k' V4 Z6 p# f( m2 f- //回调函数,定时器中断服务函数调用6 L" }5 u3 Z: ]
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim): J* G* K8 W, Y4 {
- {3 D( G7 e6 ~0 g+ I
- if(htim==(&TIM2_Handler))
( x& c$ F: G. @9 a - {
/ W$ _* A1 ^/ {# B2 ] - // LED1=!LED1; //LED1反转 ( o8 B& K! t" r G! a
- sec_10++;
8 J M. w. f0 o/ Z - }
, u: \: O% e, p. `" m8 C - }
( j7 s6 j+ v3 x: z; K# P - ! n5 f# l' j- Y% P6 I0 p
复制代码
( h0 B5 Z& }& x" q [0 G7 q$ H2 ]- s
* D/ r" z) H9 S M( l- q G |