MCU:stm32L0
+ P; m4 R) M) X8 w4 p主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。# f% x8 s( r6 ~
, v, z5 W; S0 [6 z7 |: D; f$ T7 h//SYSCLK=Fs*PLLMUL/PLLDIV;! ]8 S$ p: R! A6 E' B: L4 d$ G
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));+ P8 u4 s6 Z( G' `
//SYSCLK =
. h5 K0 ~0 t* [7 d/ r//Fs 8M
1 o) ~ r+ J5 t" x//Fvco: 8M4 I' d& J6 \5 a3 x
//SYSCLK: 系统时钟频率 8*8/2=32
! x, H) l: ~. d/ r& p& R//PLLMUL:倍频 8! B& b: p, _6 n# g8 A2 o; n
//PLLDIV:分频系数 2 8 F, Y, a# f! L1 G! z
$ k, q1 r# W, \% J: ] I8 q
以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M
( T: [* I2 Z. }5 E% {) l7 q
4 l0 S& H: O# E通用定时器时钟为AHB1时钟的2倍,8M。0 K3 \/ r+ x i4 Z; X
( `1 o1 z& F2 M2 v% l& \# E
可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,* M, w+ c8 k) b: w
1 J* Q, P" P; r, U, w0 A
则计数频率为(计数值+1)/(计数值)=1000Hz+ d6 |" G$ w8 Z5 _
" Y; B2 W! m& O' i, u$ H) U; n
分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。
5 f7 f* @# g" @% e
+ K* B3 N, [% e8 I- c0 G3 c: }配置定时器代码如下:6 I6 D3 ]% Y, D* f
9 [5 }+ x" G* ?4 b$ Y- TIM_HandleTypeDef TIM2_Handler; //定时器句柄 : K) I; r5 c7 C2 j5 t' Q% f+ ?
- 1 s. q: m% L4 w- \6 w1 E% s7 ?
- - `' s- G; ~$ o! h+ m( s2 \: s# g
- void TIM2_Init(void) //定时10s
+ F; Z8 I/ g6 h/ A# g6 Y - {
1 m; t. e; g. g4 c( b! f - TIM2_Handler.Instance = TIM2;
8 x! |) |6 E [. h: J' G& u - TIM2_Handler.Init.Prescaler = 7999;2 F0 C+ f1 k3 S
- TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;) \6 r/ P6 L5 s# \" d
- TIM2_Handler.Init.Period = 9999;2 t3 H9 F7 L* G8 f6 J# F
- TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;! L3 i O$ V6 a+ i. G+ l X
- HAL_TIM_Base_Init(&TIM2_Handler);
7 w3 _% u; a8 P9 `. }
* F0 P6 H" ?& s; N) I7 R" d9 k' l! B- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
- @6 r0 O9 C$ n - ) |; v+ R) c1 }0 y( j9 P
- }! d$ ?9 t; h; n* W3 U7 ^! A! |
- + d1 N% Z) e# T6 ^
( o; r: W8 b! r3 y! ?- //定时器底册驱动,开启时钟,设置中断优先级: V' g' S! U% t5 B7 X0 o
- //此函数会被HAL_TIM_Base_Init()函数调用, z+ ]( H0 ~; ~: _! r8 P4 ^# P4 B+ [4 q& L
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
2 g/ U+ q4 W0 @6 n6 d - {
- \6 E7 R# b0 J0 A+ V$ {2 { - if(htim->Instance==TIM2)
5 ]8 ~8 W9 n. B/ r' A' z n - {0 c/ W( a5 i0 N8 q
- __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟5 I9 N% d( Q( y+ q
- HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3, }3 ~0 d8 L* C# G/ \
- HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断 + O/ I/ m# M1 A0 }; b
- }
/ Y# f3 `& J; C4 t9 ^9 J# |- p - }
, R/ C' K7 U1 |6 J6 [3 K( i- j
- \4 N7 L9 @! Y- //定时器2中断服务函数% p3 V- s2 e( ?. c0 C! Q6 U
- void TIM2_IRQHandler(void)) g/ q* k, K9 M M
- {
# K- h" j' A+ P) j' V - HAL_TIM_IRQHandler(&TIM2_Handler);
# B+ k' m& m* Y4 J; z - }4 z$ u& p/ Y1 Z# }. z& E) B
2 j2 Q3 R( }& p. s- $ }8 u( C+ A0 d/ z3 k0 L
- uint16_t sec_10 = 0;
4 j) V" R5 d, ?; z6 l, u- ^( v. C5 ^. P - . r* C8 q8 \+ q' N, W
- //回调函数,定时器中断服务函数调用
4 K3 |! Z7 w/ ~ H3 a* L& U( W - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)3 \- w7 g3 q3 K o$ R# b
- {
5 P% P9 [4 v+ R9 H- m0 J9 h - if(htim==(&TIM2_Handler))$ I9 }; i$ r2 {7 B& u
- {9 z0 d2 ~7 S& `; U
- // LED1=!LED1; //LED1反转 ; \5 F- m7 T' V, S( X- y! o! R) u
- sec_10++;5 {) K' r; J: h g7 {6 P& R
- }
# ^2 Z( f* U o x2 o3 U6 @ - }: H7 K9 c. M+ w3 @1 ^: v% w8 x
1 A' k; S/ {# |% G# I
复制代码 - j3 n& q* _2 W+ A) @2 g/ Z
% ]' v% l3 `4 e% X3 s+ Q
|