MCU:stm32L0
8 _+ k! A: ^0 ^% B. j. F, l8 D# ]主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。
7 f& ^% U3 I3 k6 @5 s
" n- q! J# u3 w l& ~/ ^//SYSCLK=Fs*PLLMUL/PLLDIV;$ {* }/ L+ L4 q+ a- M
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));" X5 A) Z& f( l8 b
//SYSCLK = 1 H; ?! G F# O* I( y1 o
//Fs 8M $ v8 w4 G/ f! k7 _' `9 u. c
//Fvco: 8M
4 Q# m+ R% f s//SYSCLK: 系统时钟频率 8*8/2=321 D' N/ ~. a' q8 S
//PLLMUL:倍频 8; d& a% }6 n# U, |3 D
//PLLDIV:分频系数 2
) T+ `, Z8 Z* g6 G' l
. o) ]5 l: t4 J) r# M# R8 B以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M
5 i) v% O8 }! g8 H: a: r9 N- m& n$ }5 a
通用定时器时钟为AHB1时钟的2倍,8M。
- O0 S# \! V: n: S& o! j7 D+ A' Q, r1 g% A7 Q
可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,
; Q/ X, G2 m9 Q
" P# b4 g+ E2 P" b" X( i1 w( r则计数频率为(计数值+1)/(计数值)=1000Hz* N8 u8 z. Q6 H1 w/ y6 U# f* V& N. x0 C
2 u- c6 a! ?( T# Z# I+ H分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。
/ e9 U$ T$ ~% f/ Z- F, n% r& \' [9 m6 P1 {1 V8 {( ]
配置定时器代码如下:
- E' q5 @) s8 X# z5 e: }0 M m
& e, N/ W1 S. q+ l% B P- TIM_HandleTypeDef TIM2_Handler; //定时器句柄
2 L4 t4 g" L& t6 e) E% _ - ! m B7 h) {1 ]
; o! y) c- u1 n3 _- void TIM2_Init(void) //定时10s
0 L- Q0 P2 U+ n& h2 }' l1 a3 X - {7 E; [& R2 t/ _* d [
- TIM2_Handler.Instance = TIM2;0 f3 s: g' a3 @# |% }
- TIM2_Handler.Init.Prescaler = 7999;" J# U8 @: }: V: N" l
- TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
6 i5 Y# q7 V. V" I8 f3 {6 f - TIM2_Handler.Init.Period = 9999;' E4 Y( e) u) V- r M j3 O+ n# j* w
- TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;, l, W1 b: C) H4 L% F
- HAL_TIM_Base_Init(&TIM2_Handler);
: J* U. ]* g% F. x - O: X: k Y( G% ]( r: k
- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
; o% l5 _) W) x( t - , o5 {8 t2 K6 ?+ f
- }0 Q' X. t8 s x m2 L0 P0 V% S
2 @& b/ b: d6 Q5 F% I) Y9 k
& \! n! W5 Q( _8 A Z9 T! [- //定时器底册驱动,开启时钟,设置中断优先级
3 j/ r1 {: v! l6 f+ c - //此函数会被HAL_TIM_Base_Init()函数调用
: q* A) I d- I - void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
+ e0 S6 }% K3 { - {% O/ K; j2 k* {- v+ T
- if(htim->Instance==TIM2)6 ?+ ?' r1 G: R* W3 p; ]: g
- {. |/ ?1 a, ~9 _5 V0 W6 ^
- __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟" B- K& h. ]+ _6 C$ E, u
- HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3; h2 h* I( ]1 C. d7 z4 D+ ~
- HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断 6 R L1 ?& N) t" C5 i- {' `, j
- }. z4 d9 a7 z1 W( S
- }
0 p' B ^/ e) u) v" b - ' f- I( |1 O6 A: }; o3 E4 f
- //定时器2中断服务函数
7 H( E1 S( E b/ f - void TIM2_IRQHandler(void)
* Q8 _( u7 X9 Y2 J3 R* O - {
' D5 N! ]! z! v - HAL_TIM_IRQHandler(&TIM2_Handler);% F+ z3 o" l2 ~* i9 u
- }' s* E8 z, B2 o
- ( z3 M/ D- ?# g4 U/ ]( l/ N
- 3 P, b, u+ j# j1 H- ^
- uint16_t sec_10 = 0;
' D5 n. `& T8 ^* N) [ - - A: S9 x W P3 X
- //回调函数,定时器中断服务函数调用
9 _/ g1 h c+ l ?- g6 Z - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
" z( [; A& z5 q+ l) U6 D - {
" S, K- s$ M Q: h - if(htim==(&TIM2_Handler))
" t3 ~) z. }( R$ L' C# w8 G - {
4 T3 Z8 \* q" l3 W+ o - // LED1=!LED1; //LED1反转
6 a# x* F; `4 u4 Z4 }" ?3 O - sec_10++;
7 D Z0 T! U0 Q+ L" D6 E8 b - }
0 D- s% @$ C8 M/ r" l - }
* A# V# j; _* P' }, _: \% g - 4 o8 p0 f: q2 {8 s
复制代码
2 w5 N) Z4 h5 v4 E7 m& h; l$ ]/ V" _( _5 l* m% b4 \
|