本帖最后由 强仔00001 于 2015-1-13 18:43 编辑
* x; t% q% {9 z- F5 l* p2 ]0 C
# b5 {) H: b4 K) C2 E转载自:http://bbs.eeworld.com.cn/thread-452537-1-1.html 9 a4 s3 L1 W" q: _ R& Y9 y
今天我跟大家探讨一下STM32L053R8的时钟系统。今天看芯片的参考手册,发现STM32L053R8的时钟系统很强大也比较复杂。: J4 b+ ]; X% v
在STM32L053R8这款芯片中的时钟源选择有5个,如下图:
( e) i1 O" V$ T5 k9 w( J4 m% K6 _
分别是: • HSI16 (high-speed internal) oscillator clock • HSE (high-speed external) oscillator clock • PLL clock • MSI (multispeed internal) oscillator clock • 37 kHz low speed internal RC (LSI RC) • 32.768 kHz low speed external crystal (LSE crystal) 其中能作为主系统时钟源的有4个,如下图: 5 p% M1 X, D) I
整个芯片的时钟树如下图: 关于时钟树这里我就不多说了,大家可以参考f10xx或者f4xx,值得注意的是用内部HSI和外部HSE时,或者经过PLL产生的系统时钟最大频率只能是32M。如下图:
下面我就用自己建的模板,使用内部的HSI然后通过PLL产生的时钟通过MCO1的PA8脚输出,通过示波器观察系统时钟的频率。 ; X* u6 j. _3 T9 J& a+ }* R
代码如下: - #include "stm32l0xx.h"4 U2 M; A/ y0 R: f
- 9 f0 w" c) T$ ?# [/ z: @8 p* U
- void LED_Init()
8 E' {! s- ^% q s* I- B2 R - {: y8 a! I) _' U' D- h% A: a
- GPIO_InitTypeDef GPIO_InitStruct;
6 D W# l4 l! _8 G - __GPIOA_CLK_ENABLE();* n8 u7 W/ p) D
-
A1 U4 X" O0 c* H - GPIO_InitStruct.Pin = (GPIO_PIN_5);
\8 k; {, s3 e/ r; w - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
! I9 L' o0 B1 l+ f# M! ? - GPIO_InitStruct.Pull = GPIO_PULLUP;
! s- O( b a2 [( y% T9 \ - GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
b8 @0 b7 w5 Q" h) f; _6 M! t - - n, x" V* u, U
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
1 T1 l5 \: N% Z' C; W& C/ i - / o t' K: G0 X4 U
- }" m S0 ?% {* Z; t: R i
+ O L# v+ t- T: P- static void Error_Handler(void)1 G% K S. Y# I& r& i- K4 z
- {, |/ s. A1 o3 E% z9 I; B
- /* Turn LED2 on */
5 P. Q5 l3 E" o0 e1 s1 W- }( I, O - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
$ @$ n4 `5 d- a -
2 a9 B2 x9 W6 Z: M4 |: D! [$ K - while(1)6 H, i1 X& \5 }0 |% ]
- {
" E! }, H6 X0 V: H- X4 m+ h! ? - }* F- Z5 l) M3 N3 C- z
- }/ S- M+ z" Y9 `% O8 ~
- void LSE_Init()
, x4 L% }. L \+ S3 y3 } - {
# s4 c/ }: g" r+ }* e# X - RCC_OscInitTypeDef RCC_OscInitStruct;
. g0 @, U; Y+ U- X - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
- L) f9 P* Z4 t% E3 K6 d7 p - & N4 O' X$ O* `) Y! l R: W" G; F) b
2 B$ S% }0 O" C& _+ ~- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
+ g* S) R2 v2 L - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;' \+ m8 Q0 D; }7 o3 C
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
* B, `0 v# i4 ~$ i - RCC_OscInitStruct.LSIState = RCC_LSI_OFF;6 f+ a6 p4 f% t" N' _- S: q
- if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)% U8 w3 a+ D1 K1 T
- {
2 A; Y, [) g; u& @3 S4 } - while(1) j0 ]+ l8 f" E
- {
* p9 g4 I: N$ u5 A$ V - Error_Handler();, E: B; I+ l: b1 ?
- }% n2 @# {9 J9 L* T! Z/ Q
- }
0 p- R9 e3 `, `0 E' B
' L( @0 `9 z1 g& A- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;0 c; B" @) w! T4 s u& i2 ^" g/ z
- PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;! \+ h4 Z0 c0 D
- if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)5 ~+ O' T4 ^; }% i! Y
- {
; q3 a; O' v5 e' |' _% f! | - Error_Handler();. D* C! k9 y8 _* w5 }
- }7 d6 U6 I; c; x( g* c: c
- }9 l! w9 P1 B$ H* F2 h4 [
4 Z3 B- S3 F3 N5 c/ @$ K- void LSI_Init()
9 ^- }' l3 R. {6 j2 p/ { - {
2 i3 g& ]7 r; g Y - RCC_OscInitTypeDef RCC_OscInitStruct;
/ Y ]4 g9 G5 K9 Y - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
( W$ L2 e# f, N
( M Z; T3 M: z5 x+ w ]+ N9 b
" w- e5 d' Z& t+ m/ E- w- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
* f! \7 c1 \7 V. X: H4 p - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
# {' k/ l; E) H# |! d) E4 V# ` - RCC_OscInitStruct.LSEState = RCC_LSI_ON;
" K* w& |; ~- b m5 k1 v - RCC_OscInitStruct.LSIState = RCC_LSE_OFF;/ O7 f, m% l: I6 ^. q
- if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)( E6 M- ~$ _9 ~& C
- { 9 t& P$ _/ l( y4 t8 T D
- while(1)1 h$ d- d: j7 Z& D5 c" x5 k/ s
- {
2 S) P) b6 Q! _2 y2 Y: T - Error_Handler();
1 \6 \+ @5 q E& P - }
7 n! K# z* `& S& k) F - }
4 B$ i# q# a5 H$ G. h" o/ I1 ^ - 1 a+ X6 q) P' W5 F* r! E H
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;6 _9 n6 J' Q9 O8 {: J
- PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
3 A- a" `1 B( w2 N" z' t - if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
- d- f. s6 m x5 P. r! @* v - { $ R7 H, Z9 g3 G9 t5 q7 {( }
- Error_Handler();" p, V% [4 M& W0 v" _
- }
+ A7 D0 r: I& l+ s - }
1 e0 { n2 c2 Y& } Y5 c - / g7 n. k2 F& S
- * f. F# i0 F/ W! A) D6 @
- void HSI_Init()
4 A9 \/ L) q- i+ ?, Z6 T3 J - {
& O( H m, z# G, X! x, p - RCC_OscInitTypeDef RCC_OscInitStruct;
9 W; P( k q% t! y$ k1 U - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;2 `- ^- z( W' _% _5 q4 x" J
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
4 h! j; k W% v - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ M8 X% l- w, ^; [- r/ X5 o - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;: c( \( u# D. Z7 ]7 U+ J* M
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;; |% C7 [7 x4 i; N( z6 ~
- RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_4;
L5 e; x* i& |9 l+ P1 A - RCC_OscInitStruct.HSICalibrationValue = 0x10;
' ]+ k7 r* C3 H# d" R! ]% x' U) P8 u -
& O6 A7 _/ {$ Y5 h* q4 p9 Q! n - if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
B) T* i9 |/ n0 l @5 I# K+ R/ H6 o2 z+ ] - {3 |0 J, F5 ?. q2 K
- /* Initialization Error */' f! l4 ? r7 `( A/ r
- Error_Handler();6 Q& T8 b# Y( V) X# B. S( p
- }
7 K. Q! f+ Q4 S1 B$ I# } - }
9 ` J+ k. g8 N7 M2 K
$ U2 o0 }4 M! j9 ^# L% R0 |- void PLL_Init()6 h7 i9 K7 }( y2 h% h5 G3 Y
- {
" R7 Q& d, C2 f; i% S! L2 l - RCC_ClkInitTypeDef RCC_ClkInitStruct;
0 D9 q. P! Q* z' B3 @0 v - " z9 F1 u* F6 o0 H( X
- RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
6 F4 e- o0 L/ g5 s0 t - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //RCC_SYSCLKSOURCE_PLLCLK
* Y" d) s- v. o2 W - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
% }/ e0 j4 }: d- v/ X - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; # S6 A1 N. p! O7 P4 E
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
6 x5 P: ^/ h+ J6 r" x! b1 Q - if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
" R2 I/ E+ S2 \8 l/ {. K - {0 C z4 g' g. w) X8 j: _. |0 p; b% i
- Error_Handler();
4 S! M9 @1 R, M) n - }
4 U% A# o1 D; ?+ ?- t. R - }
; Z3 n& _3 O. [; |) E& N6 r - 0 X# i o9 A* [# e7 G
- 2 X6 t" w) _( T/ Z8 l# L% C
/ p k m- D7 T1 O7 m- int main()
% ?: O2 r! D% L! r& N! M7 Z5 W - {
\& a5 S! ]/ m
) Q' k- |& }" p# G9 a- LED_Init();
( a/ q0 q& x3 d3 f, M$ |: X' L - __PWR_CLK_ENABLE();
. L: x4 }+ u3 o# L" N' q -
( y* P" L: S% d - / ~5 m9 f5 ?/ a7 d/ m
- //LSE_Init();
4 y2 \; L/ h/ p T* w6 U' N- ~ - HSI_Init();
! h$ u) A' {, j. D/ O0 l - PLL_Init();3 |& Q. l; q% c# k: X) i' y1 c3 n7 P
-
, d' K7 o6 f" d+ h' u4 L% q- A) I - //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_LSE, RCC_MCODIV_1); //LSE频率输出* C, Q! O) \3 J' e: N& \
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); //PLL输出
$ v4 C" S; B( D- `; f - # u f/ {. S) s2 f6 [% Z6 z0 V5 u
* u5 ~$ t3 ^% N. l5 I4 Z- while (1)
7 q3 P4 C. C9 u6 j, m) j - {
4 ?/ E1 {' n: r! a1 K - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,1);
7 [5 m5 Z9 Y! o$ l6 \9 j t - 6 r5 E0 U6 T- ^* o
- }) \3 D9 a1 T& s x2 J3 |1 v- ^4 U
- }6 u3 S* r7 U* g; u9 q( U
复制代码效果如下图:
附上源代码: |
你也在这里
哈哈 嗯啊 在这里看看你发的帖子 学习学习
谢谢支持