MCU:stm32L01 _- Z S! t0 W
主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。
+ G# [, ]/ X- N5 c6 q+ V8 g/ H$ _' t. w: i: j! A5 v
//SYSCLK=Fs*PLLMUL/PLLDIV;
% V" k4 \. t+ u" M, Y3 S//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));( D& A* _6 g) {& T1 B6 J7 N
//SYSCLK =
$ Y. r0 ?6 V( ?3 x1 A, `6 U, s//Fs 8M
* Z0 d4 { i! ~& t5 X$ X3 F1 [' W//Fvco: 8M7 G) W- Y' E) T p: |' y
//SYSCLK: 系统时钟频率 8*8/2=32
1 ?$ _; m+ H$ r& I9 s5 s+ }//PLLMUL:倍频 8
4 j; Y$ m4 E# `' C//PLLDIV:分频系数 2
3 d: b+ Q, @/ C7 W
9 s8 G. O" ^' T. c7 v _以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M
7 W; z6 Q, m. R1 L; C; l2 ~ B; t9 s c" g
通用定时器时钟为AHB1时钟的2倍,8M。9 B! n" `3 ?3 J+ b- }
8 B/ ]- `, A7 \2 c9 L- T. c7 D
可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,
' R1 ^ Q8 Z$ F0 y+ p X0 V2 R4 d, k( a% m
则计数频率为(计数值+1)/(计数值)=1000Hz
4 p7 a- B! N' h+ h1 r! V$ u9 C6 i2 Z) o* |
分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。' z0 o7 C$ Y% j* s. b B( L1 k v
$ j! i3 d: p/ s% x
配置定时器代码如下:
( i! t& r# `$ A0 M2 p
5 L5 a# V' L) \. L f- K7 j) d- TIM_HandleTypeDef TIM2_Handler; //定时器句柄
0 x9 r+ I# e0 e& O3 x ^0 x
/ A3 U: D+ l: y% C- . I* p2 A$ l" x. |/ Q* E% ]9 G
- void TIM2_Init(void) //定时10s
2 t$ {. N9 ^! o$ z - {1 x2 z5 E6 d1 T- m- c! n
- TIM2_Handler.Instance = TIM2;/ U6 B& S4 p, T1 A$ r: @' M% H
- TIM2_Handler.Init.Prescaler = 7999;% V" v5 ^& C, P3 S8 B6 J1 k2 I
- TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
. |8 t; @' w- j; g/ V5 h* S. F- j - TIM2_Handler.Init.Period = 9999;/ } l4 \( G- l( l l0 @, ]# [
- TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
! V+ {" q2 C8 g$ V! [7 r - HAL_TIM_Base_Init(&TIM2_Handler);$ [* ^9 B( a; r" M6 E* P
- - c7 U/ h F1 `0 p! m
- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
0 O! I* a7 |$ r; B; C( ~/ G% g
4 v- T7 a! b7 t8 U- }
$ H; m }8 Q0 q: z- x. S4 d - + ?" j+ E" G2 A! Y6 `: p
- : ~& T4 J8 ]' {, h8 ^0 Z! J
- //定时器底册驱动,开启时钟,设置中断优先级0 \* g! v7 a" i5 o5 P
- //此函数会被HAL_TIM_Base_Init()函数调用
( i$ W8 Z7 ~4 k8 Z - void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)5 n( z' b/ b N. O. l7 ]8 a; Y
- {& h+ b$ L5 h) w/ p( i' \0 o1 ]( F
- if(htim->Instance==TIM2)% ^9 @" u" ~2 U
- {
9 A- w2 C' K& @, N' J* @; x. m - __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟
: n1 T, G' N: `% t" y) r( `$ i7 T - HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
1 a& D2 `+ Y7 W4 f - HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断 & V4 |# y" ?- R( X2 E5 m
- }8 V8 F4 q6 M/ a" r; y
- }
4 f4 l. S9 o* U; C% n
, U) I& G2 q! W- //定时器2中断服务函数
0 P- A3 X6 P& O) z- m - void TIM2_IRQHandler(void)7 ]2 D8 d, |* C: i! ~. d0 X9 E
- {
: ]" T" `; a3 Z! w/ M* W! M - HAL_TIM_IRQHandler(&TIM2_Handler);' ?5 z5 I) A+ m8 C/ [) T4 r1 z* s
- }
$ m' u: T( ~2 B+ Y: b- r' f) U
+ b% q4 `& |7 y/ u0 Y1 k8 t' F- 4 L# Z6 i4 B* a
- uint16_t sec_10 = 0;
. @9 o: J$ b, U, W, H0 Y
- O' A3 x, C! y! Q5 g- //回调函数,定时器中断服务函数调用
6 \* C: _, ?; v, S7 Z - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); L# V; v) Q, D2 I, X
- {# P0 w$ L: E0 }2 F
- if(htim==(&TIM2_Handler))
1 O3 D9 W/ y1 m0 ], k2 ~$ A# C/ T - {
$ {' M! R+ a, [+ g8 W' d) C' h - // LED1=!LED1; //LED1反转
2 J; ]& D" T/ h1 j5 L - sec_10++;' Q3 n5 e# z; _1 E
- }0 @8 L4 ~9 S$ t# s! e" t
- }
7 Y2 T( J$ Z: i2 A" t% N - 4 h1 m3 |8 o! k/ y
复制代码 - J2 @! @( q' \, u) R
# T' I0 f: R, d1 s8 {. g |