MCU:stm32L0
. h# Q' T* D, t. Z主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。" H- | X2 z5 \
) N7 D" i5 R6 N2 @# p
//SYSCLK=Fs*PLLMUL/PLLDIV;) O1 R& I& }0 X- J
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));7 \, ^, N d( a. D
//SYSCLK = . k1 E6 F5 ]( V7 |
//Fs 8M
4 C+ N1 j+ K* k' |! n) ~. `//Fvco: 8M
, [1 S( R) k: P2 X+ R" A//SYSCLK: 系统时钟频率 8*8/2=32/ t) W/ Q( d/ d. Q( d7 F* {
//PLLMUL:倍频 8
% e+ ^+ C, O; S//PLLDIV:分频系数 2 , n$ z& a# M# K5 U& o: j
- i4 c+ C: V- Z以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M& o3 Q7 w) @, N* A
9 v4 L/ u2 @. d8 t/ E
通用定时器时钟为AHB1时钟的2倍,8M。" y9 S( t7 \7 d1 ~5 l3 G( A" {
4 `7 z3 E2 J6 V k Y" j- C1 C可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,# i# L X( T: |
+ o' v3 r) J9 H0 B! J( g- F则计数频率为(计数值+1)/(计数值)=1000Hz: G( s e& d, v' U5 s1 m# z& \: E4 R) [
7 m$ S6 x/ {- u3 Y* g分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。3 w9 Z, n9 ^1 b* M
2 g0 E+ _/ _# E4 _3 l
配置定时器代码如下:
& A, B; n' o3 F1 {" @. W3 V2 W
) e$ ?4 v! s! H- TIM_HandleTypeDef TIM2_Handler; //定时器句柄
) z# U5 d, Q2 k$ g j7 X& Z2 u
+ h6 ?' L$ j! F( |" s7 Y
* N& G9 I F4 X4 J v- void TIM2_Init(void) //定时10s' X9 i2 F6 d6 X. B' d+ [
- {' y# g: x/ h, P! V$ q m' L
- TIM2_Handler.Instance = TIM2;
3 |* `) Z8 e+ ^4 q. d( G; L - TIM2_Handler.Init.Prescaler = 7999;
* F5 n! f4 Z0 A! |# p: ], p" ^- X. k - TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;7 w4 J, t2 N) I
- TIM2_Handler.Init.Period = 9999;; r; a {) ~9 N1 F3 W q
- TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;+ F" d0 e7 b$ y: Q
- HAL_TIM_Base_Init(&TIM2_Handler);% C# w; f& l( P$ t
) Y' A8 G7 c4 \7 ?: g- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
& ?# k- T. p( [4 B# ?7 v \ - ; V8 d+ j' i# y" y0 i
- }( J: N* t* T" e3 ^! ^: t A
; `6 Z# f$ X L2 O7 T9 z% S
6 G7 @2 _+ ~$ C+ T7 o, G- //定时器底册驱动,开启时钟,设置中断优先级
5 h1 [: ~1 c2 J - //此函数会被HAL_TIM_Base_Init()函数调用4 y; D* Q0 t( Z2 }/ n9 O( {
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)* Y1 o. t9 q) G( n6 g
- {
: e; |8 _. {7 m/ ^% j7 ?$ | - if(htim->Instance==TIM2): R- |/ q+ u3 U
- {
* \. l% n" E" ?' J8 S2 J - __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟
$ M/ p6 ?7 d, t1 }- c - HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3) | K; v- u, F e
- HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断
2 G$ h, q) q) D( B" K3 ~+ } - }
+ x' b; Z$ G/ b, r* Y( B - }
# g# O& O, w: p# L5 u
. T+ ], |" B' `- //定时器2中断服务函数
: `! ]0 f) b" z$ X6 h - void TIM2_IRQHandler(void)) u+ O _7 K$ N! M" S" c# b
- {1 b1 b) C1 A. ^ B6 v. A% \1 N
- HAL_TIM_IRQHandler(&TIM2_Handler);
3 F3 W# A, W6 U - }- f% q h, |* ~
& J) j' D& W' Z' D: l5 R# M/ c- ) p1 j: J7 P+ i6 ]% t$ ]
- uint16_t sec_10 = 0;" @1 k' _, I7 e$ b b
- }& A* |4 {# z/ h' S/ |
- //回调函数,定时器中断服务函数调用
5 a" G5 j( y2 L2 x. I, q- U& \ - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
" n2 B# x, `! }% ]: ~ - {, M. [' |0 L- j$ N! T
- if(htim==(&TIM2_Handler))& J, ]( ]" n2 z6 P3 F z
- {4 ` P, @ V; I7 U
- // LED1=!LED1; //LED1反转 : v* X8 g, f: J& G
- sec_10++;
! l0 _- \# d0 v/ n$ Y: F - }
2 T2 v) z2 v" {8 F - }
?9 S* D. v' ^5 Z; p2 |, x
0 r5 q- }" @% m
复制代码
2 J! P; I: y! A1 g' [+ @+ a; W; C, k2 V% x! j. J+ J( l
|