MCU:stm32L06 q3 L1 M8 y: d3 F. S
主要搞清楚系统时钟,我在上文设置系统时钟为HSE(外部高速时钟),设置为8M。
. D1 c- m8 G* ?# ~; ?4 \
( h5 P- g& n+ a+ t$ ? B: J/ {//SYSCLK=Fs*PLLMUL/PLLDIV;7 J! r( a& J; r) L7 O
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));% X9 i+ ~$ E3 W& W X/ z8 P+ Y
//SYSCLK =
" `& z5 {: K8 k+ W' z" d9 }//Fs 8M ' W5 p4 K1 U; B& {4 N" L$ ?' I+ t
//Fvco: 8M# c% ]0 ?0 J& f- F( \: }, B& y2 M
//SYSCLK: 系统时钟频率 8*8/2=32/ |* t$ t7 o: _6 i) U l7 |- D
//PLLMUL:倍频 8: U8 S/ o0 u+ z2 t) b+ S/ l, x
//PLLDIV:分频系数 2 0 C* q9 D) f# X7 J
( S" q) B& p, Z, e' k以上配置,设置AHB为 32M,AHB1为4M,AHB2为32M2 l" }- [" x+ \$ n5 ~3 q
7 z0 @- \3 }5 W7 A4 n7 p) J
通用定时器时钟为AHB1时钟的2倍,8M。; {9 {* Z$ V2 ~% R
9 X4 x2 N. D8 R
可以由如下公式计算定时时间,假设定时时间为10s,设置计数值(Period)为9999,1 ?: G ~ Y2 L" \/ p3 G9 G
0 k# d( p1 S* s6 L- c6 D则计数频率为(计数值+1)/(计数值)=1000Hz6 o" s1 {0 R0 E
5 Y @. Z) i% C) `# N分频系数(Prescaler )为定时器时钟(8M)/计数频率 = 分频系数+1,为7999。
+ h# R) G3 b; E( T- f7 ~" l$ a, A A& h1 H+ l1 ~% _- V! f
配置定时器代码如下:
$ Z" S# @! e' |) q& K. }' `( U: S' e* z9 n) w$ R+ t. m3 N5 F
- TIM_HandleTypeDef TIM2_Handler; //定时器句柄 : n* w1 o% G9 x c. G1 O Y; j/ q
- 1 N- j9 T/ g, j5 O9 g% |
- ' n+ O$ K: J9 J- |
- void TIM2_Init(void) //定时10s- _' a- v% N1 ]& V0 D; Z- J- z: [
- {
1 A5 E% ^9 u* I0 y e6 G - TIM2_Handler.Instance = TIM2;3 w% i# M9 p, ^8 V8 Y
- TIM2_Handler.Init.Prescaler = 7999;% I7 J. R0 v1 w( W* t
- TIM2_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;6 ]2 b& f* v2 [9 U5 G+ K) I1 o
- TIM2_Handler.Init.Period = 9999;
- Z; z! u' B# W0 n* | - TIM2_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
/ A( z7 P& i0 C$ E) T$ Q$ |6 q - HAL_TIM_Base_Init(&TIM2_Handler);" p$ N$ J& P& [9 w- T6 N
- : b+ a( T4 j) m6 R a7 l, f+ `
- HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
* L0 I) E2 l- k( ^2 w$ A
* a6 j. i/ e/ K5 h# F- \' R- }
5 Q5 T6 l* |( b; P8 e - 6 c) b! h+ @0 R, H) | S
- 0 w+ f; u- V8 X& ^. \6 r" V) [1 J7 q5 z
- //定时器底册驱动,开启时钟,设置中断优先级. j, l6 D( ~7 S3 A- Q, I
- //此函数会被HAL_TIM_Base_Init()函数调用7 W6 c/ X: Q+ W8 e$ _
- void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)! m. `4 q& U( \
- {
1 {$ ]8 I2 V. b- _- s3 x - if(htim->Instance==TIM2)9 a1 ?% e" X( b
- {
; G0 M! m- |0 }: n- e3 j6 a - __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM3时钟) f& V, u) }' V3 V9 J7 P$ x" S
- HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级37 \( \( T9 @' A* \
- HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM3中断 * |/ w! _ E3 _& F1 l. v
- }3 a( n+ N6 q! _: H& Z+ x1 B
- }& c3 U+ B* i2 ?4 u2 S
- 8 h' z- U# t2 K: z& F1 Z& N3 r! Z2 ?
- //定时器2中断服务函数 C c* n% P+ \' V0 M9 E0 v, l% `
- void TIM2_IRQHandler(void)* s, x, E- Z! n& {
- {' _1 p: J9 K: Q; A( K6 B
- HAL_TIM_IRQHandler(&TIM2_Handler);; Y; r5 N" E& e' K) k! N
- }9 o0 s% k$ A: q+ q
- ; y* P! z/ @# M5 K$ Y' A: W" Y0 v+ X
- 8 c @) g* H! ~9 K u
- uint16_t sec_10 = 0;
; ]% O1 P A4 [% Q% V2 o' D% C& O( Y
& U8 j' N. e8 b: |& `- //回调函数,定时器中断服务函数调用
( o! @" G+ z0 ]: v - void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
0 C( K; p5 c6 T- B$ A* \" { - {; T* L0 `( O Q: L x W) N
- if(htim==(&TIM2_Handler))
, [- o; P' [$ H) c+ \/ P - {
+ d5 P6 l0 j3 [! X: p4 H - // LED1=!LED1; //LED1反转
- t4 M+ r& }) ]+ W" B( ? - sec_10++;
" w3 r% _6 {( W& T! F - }( B" h! b& R) Y
- }/ N1 I7 `4 l) Y6 |0 q2 V
& ]4 ~( _, d' |7 L& E. ]
复制代码
& Y& o& o4 ^: z" {/ f9 u5 B% ]6 X% M$ C4 p
|