MCU:stm32L0
5 K P6 N/ {/ o主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。
) u3 J/ g' U/ ^: M+ }' T! A1 u1 v6 B4 @, E6 d
//SYSCLK=Fs*PLLMUL/PLLDIV;
6 U4 `- X" u4 z! {( h: V! Z, H//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));# ~8 s; m5 I; K' R# C% n
//SYSCLK = # z" ^- `. ?) o5 |+ A
//Fs 8M
) m" P. Y% L. [5 C! _//Fvco: 8M
" S2 Q7 s {/ c3 `. E//SYSCLK: 系统时钟频率 8*8/2=326 i# I5 B% C* n" T4 G6 \
//PLLMUL:倍频 8
. l% {+ S* S! p( g% ~( y. n0 r+ ^//PLLDIV:分频系数 2 0 ~& H' i' M$ ~) I- M
+ r q8 F s( I0 D3 s
以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M4 P. H9 [& b% u9 _2 ~
7 o# r& p: ~- ?3 u5 f通用定时器时钟为AHB1时钟的2倍,8M。
& w( F; t& g# Z+ G7 r: W7 u3 M" Y A$ q
+ t- U: ~, H) f8 E% ^1 w9 a9 [) t可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,
3 x8 h7 O5 Q- F3 y+ Y$ ?0 E
8 J8 }' l$ L' b( ~! Q则计数频率为(计数值+1)/(计数值)=1000Hz
9 x1 Z# H2 w3 G( W# p4 M" W5 a1 T1 j; o' U/ ^$ x& j0 Q; X
分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。
% K1 @4 n7 n8 t- ^3 U! [' ^" W/ v* x; v, f& ?
配置定时器代码如下:6 U+ x$ T B# P/ S! f
: f$ @5 M8 T' C+ Z8 J
- TIM_HandleTypeDef TIM2_Handler; //定时器句柄
& ^, F O' Y4 f5 E - * W$ q3 O% s; U" h9 v# a. _
I; r" G- g. r9 [" K- void TIM2_Init(void) //定时10s
4 K7 O/ R% X( | - {
. l5 i9 P8 E- Q2 p9 T - TIM2_Handler.Instance = TIM2;
+ j( D( B$ z6 g3 Z4 F - TIM2_Handler.Init.Prescaler = 7999;& b' V( y9 H0 r) M: e
- TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;! w$ o H4 c' {* ]* @0 q6 l! o- O
- TIM2_Handler.Init.Period = 9999;6 M( \8 q0 u1 a! ^ E9 h
- TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;9 h, Z1 n V2 D( Q; [, D( ?& l! |
- HAL_TIM_Base_Init(&TIM2_Handler);2 s5 _ k1 c4 ~) M5 V/ O8 G
5 z2 U+ j8 z0 d: r' G- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
+ u+ H, E, _& }* u
4 K' c/ y# W# B9 ^: @6 q- }
% c0 p- O: S+ L0 c( R" |+ o
' R1 P S( [7 ^9 G6 r- 0 e$ ~2 G+ Q/ g J3 D1 c+ y u% I& y
- //定时器底册驱动,开启时钟,设置中断优先级: y5 w) b' Q' {" h; r, u
- //此函数会被HAL_TIM_Base_Init()函数调用
/ P0 E; T- F( m4 _7 O1 _, q) ^ - void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)# g2 d3 _; E. }4 V9 r0 n, k; k
- {
* Y L0 h `0 [( h* E - if(htim->Instance==TIM2)5 e$ X, }& B% x# O) M
- {7 T+ Q1 D* t1 F4 v# n" \8 K
- __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟/ k. L/ B+ J G' y5 r
- HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
8 o) C `! ^' a4 H - HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断 ' K/ q4 ~6 x' X/ D: @
- }
* D" G! h. q4 n2 g1 t - }0 S/ z3 U$ z6 C/ O+ X; H# T# ]
+ y5 ?& e9 S' b+ H- //定时器2中断服务函数7 y( F: Z# h7 d( _8 U! W
- void TIM2_IRQHandler(void)
# h& |# x: O1 K7 X - {* P: B$ R% r3 _) w* @& H Q
- HAL_TIM_IRQHandler(&TIM2_Handler);2 e; r2 `: x6 ?* q: e
- }: S9 |3 o3 s$ @8 D1 \
0 G* y( F0 e/ P0 U# d- 2 ~! L' B( r: P% ~' D: B
- uint16_t sec_10 = 0;
v. `9 `0 }- n& Q) I: i7 r. w - + j. B9 [- F8 Z/ `0 N
- //回调函数,定时器中断服务函数调用! W# V4 F& ~1 |% x! I1 D2 M
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# S$ |/ X9 Y, G& j
- {' l" D2 G+ c* A- @4 d
- if(htim==(&TIM2_Handler))
: }% k3 K5 P" O. q# P - {" z8 q, F* `( l
- // LED1=!LED1; //LED1反转 ; X! a/ n) Y8 J/ F2 u& w
- sec_10++;9 p5 @: @; \, q) p
- }
, A8 A- Z5 E0 ]5 [: r" l# ^ - }6 U. t- M8 ~, y7 |# p9 R
/ y, A8 |( d, y5 c& e; d. }
复制代码 " t2 a4 X! ]" R( ~5 Y- x* B
' i/ \& E. v1 H7 E7 M- y5 c |