编写基础RCC(Reset and Clock Control)# A8 r: C8 Q n8 N
- [$ B2 U8 H0 P* x3 z7 U5 ~
; v- s1 k- t! v, d% R
1 b# m/ ?- ^$ x+ _AHB、APB1、APB2最大频率都是170MHz。
( k7 B+ x2 j1 E5 p9 U8 S5 l6 R* u- N) P8 r, }
( j/ [5 M8 R S" j# ]5 {
* u7 c$ d3 z5 w
& \, I2 g5 d: ^ {; ]4 Q7 l9 M# W9 c% _7 }" W
时钟树: I$ Q7 d0 k3 h& Y6 X1 B
5 B8 U) T: C$ H
要想配置时钟首先必须要看明白时钟树。" t9 n9 i7 _6 w( j, D0 M) @
$ V9 k" X7 |' [- s% r* T4 N! x! V% G% A# `& T5 w2 J6 `5 g
: y, P# J0 l) z( P
PLL& e- x5 H) P5 i
5 j4 u b$ ~7 B2 U- C
配置时钟精髓就是PLL倍频,因此搞清楚了它就很好解决了。
7 g( h3 y0 i7 N; `# B8 o手册上对PLL配置步骤如下图:
" w8 G) g2 f7 P3 Q
$ F- b0 b, A4 t6 o
首先通过上面的时钟树也可以看出来PLL的时钟源有两种:HSI、HSE。PLL的分频、倍频配置在RCC_PLLCFGR寄存器中。* I# u6 H( x8 q5 t; a- e" ^$ r
配置PLL的过程是:8 ~9 e$ q3 N5 ?& b: b! `
, ~* e9 P+ l- \7 [, S% G, o4 y2 r; B
3 \/ R P5 l' F! m4 x( L
- 将RCC_CR的PLLON位清零来关闭PLL。
- 查询RCC_CR的PLLRDY是否被清零了,如果该位为0说明PLL已经关闭。
- 配置分频、倍频系数等(单纯的使能或者关闭PLL_P、PLL_Q或者PLL_R不需要这些步骤,直接操作即可)。
- 将PLLON设置为1,再次启用PLL。
- 通过在RCC_PLLCFGR寄存器中配置PLLPEN、PLLQEN、PLLREN来启用所需的PLL输出。 注:PLL输出频率不得大于170MHz。 当一个时钟源被直接使用或通过PLL作为一个系统时钟,是不可能停止它。
: U ^% T, |4 j q" `+ S$ b
# p, Z. Y/ r' f
+ B% ~3 o3 B k; ?6 \( Z0 I5 T
PWR
, f, h3 S y0 q) U! l) L4 s1 s' o7 U$ M; p
在不同的工作频率下,对应的电源模式也不一样。 ; c0 o& _' q& }( z! q) u& X
可能是为了满足不同频率下的功耗管理,高时钟对应高内核电压,我使用TI的5529时也有倍频时修改内核电压的的操作。
8 S( |9 }" A# Z2 z, b, Ag474的电源模式与各个时钟频率对应关系如下表:
5 d( E" ~' f& O" P9 w+ n2 Z) f 9 P' _. _' X% M, w; E
& i7 N7 ^' F, z0 l' g# S" V& m/ @( S
) {5 ~4 _/ B8 T( w* [1 v
PWR_CR1的VOS[1:0]对应Range2和Range1:
/ g( R* j( J5 m9 b, r$ M" r% g) ]: q5 \" |* b; g
* `- ?9 L! H5 u' b
% @# h# g' j7 V8 A: R
& v w% n' \9 `' u R至于Range1的normal模式和boost模式是在PWR_CR5寄存器的R1MODE位配置,R1MODE为0就是boost模式:
?% a6 u) X M# O3 C) r E5 _4 q- \4 [) I6 y/ \: K% C' }
; p* y" o0 x! ^2 W
( E; t+ q. @& M4 V3 s# u# A P 1 v" k/ N# X* t; }
g474的R1MODE位与SYSCLK的对应关系如下:" ?+ @$ s) D# O) N; j+ j" j
; E/ V' w5 H. D' O# `1 X/ ]2 `. ^ 7 H7 H$ I* h' x0 X1 Q0 n( n7 x7 t4 q
9 b% }& i) u- f9 _ 2 t" Q. ]4 f5 x
手册中还介绍了从range_normal切换到range_boost模式的步骤:
, B$ n% S" v% ~# c
- F; Z4 A) K5 }/ ?: H. Y % o5 i3 G/ y- ~9 s( l* b
& _- i& g1 l: [: l# J2 g! b
( h" E' S3 l% `/ ^& y4 |
" u) _) S( ~3 g4 w) |/ ]0 Y. Y- 在切换到更高的系统频率之前,系统时钟必须用AHB分频器除以2。
- 清除的R1MODE位在PWR_CR5寄存器中。
- 在range1 boost模式中,根据新的频率目标调整等待状态的数量。
- 配置并切换到新的系统频率。
- 等待至少1us,然后重新配置AHB预压器以获得所需的HCLK时钟频率
4 z: P# V4 X: X! r0 \) T3 Z8 P; X9 h7 R" [& w
& {" q, }; M' z$ _
7 I, t( I/ t7 d N- k FLASH
# }& S# f* n' d) `+ Y; [
$ ?) k: V8 F/ M9 M这个是我原来忽略的地方,原来就配置了PLL和PWR,然后倍频到140MHz就是极限了,后来我反复查阅手册,才发现了原来少了对FLASH的访问比率的配置。(可以看到上面的range_normal切换到range_boost模式步骤里已经提到了修改FLASH访问比率的事,但是由于没看懂是什么意思,还以为是延时1us,因此配置170MHz时候就失败了。)
/ _9 p) ^( l8 p5 }
上面提到range_normal切换到range_boost步骤里有这么一句:
8 H) p, F5 d' L! I
- 在range1 boost模式中,根据新的频率目标调整等待状态的数量(FLASH_ACR的LATENCY位)。/ _( o) @) h" _9 i: A
2 A5 n. p) {1 q, X5 e( k. B
那么就看看这个 FLASH_ACR 的 LATENCY到底是个什么。
1 k/ C3 {9 O7 L+ x( }查阅手册找到这个寄存器:
1 a' Q2 { X3 K, Z2 M4 B; B- s
( K5 \7 @3 r5 X/ J& H
7 p2 _# u5 J2 W3 T7 W ( |- \$ O% i7 j8 l! x
可以看到LATENCY在最低位:/ I% \, {9 C* }8 q7 u
0 F$ d" j& H, G; F4 | 6 x4 z# C1 x/ @1 ]6 W
% B6 L# ]0 V6 V: l : A( q5 f# \% d, T
1 M5 D( {, `. t8 zLATENCY[3:0]:这些位表示SYSCLK(系统时钟)周期与Flash访问时间的比率。 - T% j. N) _; B. w N% g7 C5 m) J; G
知道了它是干嘛的,那么它到底设置为多少合适呢?如下图所示:
( \1 e0 g! B( f# o: o
1 e% u4 H" S! T* Z' g) E# `
) _. b; ^ B% w% u2 e0 ? 1 [) E9 c. L6 a9 k3 d O4 E
为了正确地从闪存读取数据,等待状态(延迟)的数量必须根据CPU时钟(HCLK)的频率和内部电压范围的设备VCORE被正确地编程在闪存访问控制寄存器(FLASH_ACR)。参考第6.1.5节:动态电压缩放管理。表29显示了等待状态和CPU时钟频率之间的对应关系。% E5 ^2 T0 Q1 j) U: u7 y7 _
- }0 J6 V' h m0 ^' t K, K
对号入座,我要设置为170MHz,模式为Range 1 Boost模式,那么对应LATENCY值应该为4WS,因此将其配置为4。
- m- b5 y! i1 U* T
FLASH->ACR |= FLASH_ACR_LATENCY_4WS; ) O& s7 d7 d. V; ?0 ?+ P) @: t
配置函数" a& w9 F) A: b* U2 {
/ W2 G! R7 V, v& k0 d7 w有了上面的概念就可以进行编写时钟函数了。- b/ @. i$ e( Q1 x* D7 \- E
步骤如下:
, ]0 J& d3 r6 O, }) Z: O( r/ w
- 开启HSE(鄙人的板子HSE为8MHz)并确认HSE就绪;
- 关闭PLL并确认PLL已经关闭;
- AHB二分频;
- 配置为range1_boost(默认复位为range1_normal模式);
- 配置FLASH_ACR的访问时间比率;
- 配置PLL;
- 打开PLL并确认PLL就绪;
- 使能PLL_R;
- 配置系统时钟为PLL输入,并确认系统时钟就绪;
- 延时至少1us后切换AHB为不分频。 D- T$ ^) Z, B0 Z* ? g
' x5 Z& I3 j2 z5 x. d5 ?$ S
" F$ [' |2 d& q+ ~7 n" A
- u8 SYSCLK_140MHz(void)4 V; b0 |1 [1 o; Q8 g
- {* y5 G" g0 x C8 C+ ?2 l! O
- u16 temp = 0x2000;7 R3 O% {8 d8 p! D/ N( i, s" I; b M
- RCC->CR |= RCC_CR_HSEON;//打开HSE
' p. y9 t' Y$ D# s+ o - while((!(RCC->CR & RCC_CR_HSERDY))&&(--temp));//等待HSE就绪- I2 p# j: l# n. |* y& M
- if(!temp)//检查是否超时
* s2 l, R6 L9 I: U - {
, n4 P6 n3 x/ a) Y$ O - return FAILED;/ f6 ]4 w% [2 Z; ]( D5 g n' Z
- }
4 N0 L0 l1 I" \: O# F# H5 o - RCC->CR &= ~RCC_CR_PLLON;//关闭PLL
2 _ h2 P/ A% R& t1 |' p - temp = 0x2000;, T5 S. m. g% G6 z- S- H+ W# ]# K5 [
- while((RCC->CR & RCC_CR_PLLRDY) && (--temp));//等待PLL下线- t0 w: _ S! z: F4 h
- if(!temp)//检查是否超时
- O1 t. ~& }* S" s - {
$ E" Z) u) j5 Z" K - return FAILED;- y+ _6 p- j7 F& A! S
- }5 u' h, x7 U/ f! h# g
- RCC->CFGR = RCC_CFGR_PPRE2_DIV2|RCC_CFGR_PPRE1_DIV4|RCC_CFGR_HPRE_DIV2|RCC_CFGR_SW_HSI;1 d- I/ e' U6 L5 i; k
- //系统时钟选择内部高速时钟,AHB二分频,APB1四分频,APB2二分频6 b9 E7 u& R+ ]- f. d1 y
- temp = 0x2000;- t$ I; M3 P$ _4 {5 F( j, R
- while(--temp);//等待AHB稳定4 w- N/ |$ V3 K" C9 C b8 X
- PWR->CR5 &= ~PWR_CR5_R1MODE;//设置为range1_boost模式6 U7 I1 n+ t" A6 y' n5 n. I
- FLASH->ACR &= ~FLASH_ACR_LATENCY;//清除LATENCY
+ d5 X% R2 K+ t; B% P - FLASH->ACR |= FLASH_ACR_LATENCY_4WS;//配置LATENCY为4WS6 O! q* x4 h8 D) ?
- temp = 0x2000;
, C3 |6 Q9 l7 H7 [. {& g - while(--temp);//等待系统稳定
6 W! J/ P. X& P7 G% v6 l - RCC->PLLCFGR = (70<<RCC_PLLCFGR_PLLN_Pos)|(1<<RCC_PLLCFGR_PLLM_Pos)|RCC_PLLCFGR_PLLSRC_HSE;//(8*70)/2 = VCO = 280MHz- ^3 O8 Q2 Y+ Q2 e; X* s
- RCC->CR |= RCC_CR_PLLON;//打开PLL
3 ]5 N& J: ~0 G# O; z* B; d - temp = 0xf000;
9 T$ O$ T% k2 g! ` - while((!(RCC->CR & RCC_CR_PLLRDY)) && (--temp));//等待PLL准备就绪
2 @! y( F# a) Q0 d4 @7 x - if(!temp)
3 \9 |) A8 }( W N c - {
& `* v/ z3 x G2 c V1 z) f$ v - return FAILED;( U! p5 n& [% z5 J' T
- }( Q+ f K7 x `. I
- RCC->PLLCFGR |= RCC_PLLCFGR_PLLREN;//使能PLL_R( {% g) w8 I- r/ Y1 t
- RCC->CFGR |= RCC_CFGR_SW_PLL;//设置系统时钟选择PLL
# N) O& U* f: g5 j - temp = 0xf000;
7 S7 _1 ?7 L" g8 i* _1 G, m' J j - while(((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS) && (--temp));//等待系统设置PLL主时钟完成标志位置位
4 S. B+ X6 c v) W - if(temp)& y4 ?; K( h( F( S# C. g
- {0 L* W0 \2 |8 O1 K
- temp = 0;$ D# E- Y( H% A
- while(--temp);//等待系统稳定
) z* V, [( x: G7 ~( I4 C" x- |/ Q U) G - RCC->CFGR &= ~RCC_CFGR_HPRE;//AHB 不分频 == SYSCLK& _8 D$ O; X2 z0 E) r
- return SUCCEED;: [9 v' ]( E9 `; U/ c3 T2 U+ K
- }6 k7 M1 Q2 v4 q
- else
( h6 K1 m, J6 b - {
- r) x! Z& v; d9 m: X" P - return FAILED;
2 ?* T2 B3 j2 d; e8 | - } & Y& i4 [0 i# }; m7 B
- }
复制代码
, ?* J% Y" b! w1 i* u' a5 x% [$ ]; S5 S: m/ l3 X
然后就配置结束了,通过定时器验证确实为170MHz。
8 F* a& w4 f8 Z8 I6 K" E+ U: D/ v
3 \7 o9 S2 u& M. ]5 N 附录:RCC寄存器0 ~# k; l. G: p" k0 B0 X
9 Y2 b/ H9 Q9 {' g4 l. p+ ~最后: + ]( ~8 R# t8 }5 P# Z
附上本人写的寄存器配置,方便个人配置,要啥直接删注释就好: 6 G* P' z1 X4 u# P! s& \# }
- //================================RCC->CR========================================4 K. ?( Y3 W2 ~' T' k8 v% M0 [! n
- RCC->CR |= 0 //default: 0x0000 0063
$ W+ H4 C( Z/ C) { - // //RCC_CR_PLLRDY //bit25【read only】: PLL Ready: F7 L$ g0 C" G8 X
- // |RCC_CR_PLLON //bit24: 使能PLL。9 r1 ~& c' J3 C1 N9 K+ Q) p o
- // |RCC_CR_CSSON //bit19: 时钟安全系统使能。0 OFF ; 1 ON
t7 F* O. h3 ]% Z; P D" Z' }& b, S - // |RCC_CR_HSEBYP //bit18: 0 HSE晶振不旁路 1 HSE晶振旁路
. s4 R3 A- ]7 E5 j; v - // //RCC_CR_HSERDY //bit17【read only】: HSE Ready' M: M6 [2 j8 v
- |RCC_CR_HSEON //bit16: 使能HSE
: C! s% m4 Z# H' X( R8 ^ - // |RCC_CR_HSIRDY //bit10: HSI16时钟准备就绪
( Q$ L' z7 h/ x0 `/ Y) h0 H - // |RCC_CR_HSIKERON //bit09: 停止模式HSI是否启动
, A/ \& O/ A9 z9 r1 `( j& n" K - // |RCC_CR_HSION //bit08: 1 HSION 0 OFF. j- U6 ~2 Q& i; q7 s9 B! j* s
- ;
* {# C3 U; m. @; E2 [9 Q$ _! Q
/ F+ m P/ b l7 {' o- ?- //================================RCC->PLLCFGR ========================================
' s7 Z$ d4 O0 `0 {$ C$ D9 G - RCC->PLLCFGR = 0 //default: 0x0000 10000 f9 l& z3 n: p% k0 U8 A
- // |RCC_PLLCFGR_PLLPDIV //bit31-27[4:0]: P 分频 给ADC用" K! L _; B, N1 `" R
- // 00000: PLL “P” clock is controlled by the bit PLLP
" x4 Y" c( e, z$ z! O Z! c - // 00001: Reserved.
& Y, C- c5 d. @0 A6 e. n - // 00010: PLL “P” clock = VCO / 26 E' g, k" A- L* D4 _9 R
- // ....; w, j9 M- c2 N9 W; j5 _
- // 11111: PLL “P” clock = VCO / 31
5 U& o' B# {5 E$ @5 |' c - // |RCC_PLLCFGR_PLLR //bit26-25[1:0]: 锁相环R 分频
- K# o1 Q1 V# l4 B - /// // 00: PLLR = 2$ p& j* ? @) j4 r
- // 01: PLLR = 4* l' {1 d2 n! ^
- // 10: PLLR = 6
5 e4 }1 N9 O* \/ U7 e5 w0 ` - // 11: PLLR = 8
' r/ J( Q) F5 l* l' o - // |RCC_PLLCFGR_PLLREN //bit24: PLLR使能% h' \3 C% d2 \8 [9 Z
- // |RCC_PLLCFGR_PLLQ_0 //bit22-21[1:0]: Q分频,USB用。分频参数与R分频一样& j3 ?6 y& V3 n7 g( e/ X
- // |RCC_PLLCFGR_PLLQEN //bit20: PLLQ使能2 Q7 |/ {4 o: ~5 n: f1 M6 R
- // |RCC_PLLCFGR_PLLP //bit17: P 分频# n- A" [5 A6 Y3 y: t5 P
- // 0: PLLP = 7# e" k; K2 [- g7 M$ D7 E0 n/ L/ w
- // 1: PLLP = 171 n# a7 Y7 ~4 V9 r5 S" p0 Z! m
- // |RCC_PLLCFGR_PLLPEN //bit16: PLLP 使能4 a! }4 z& g$ z
- //----------------------- VCO = 280MHz
+ [: q1 F) r* x. |5 G - |(70<<RCC_PLLCFGR_PLLN_Pos)//bit14-08[6:0]: PLL的倍频 不能小于8
9 a$ f: }6 _1 ^( G5 r - // 0000000: PLLN = 0 wrong configuration, _/ Z9 S) q; C! y& q9 L4 v) Z
- // 0000001: PLLN = 1 wrong configuration
% e2 t7 c# o1 @, q5 U - // ...: @6 `" P: W( _, k, H( I
- // 0000111: PLLN = 7 wrong configuration2 V9 P: d0 s2 }0 b7 [8 g7 e! C
- // 0001000: PLLN = 8$ H) \2 f" K5 r) q
- // 0001001: PLLN = 9
) P4 d4 V" Z! ?% a - // ...
$ P1 j" o+ A& p( R - // 1111111: PLLN = 1272 ^4 r4 D$ ?% Y
- |(1<<RCC_PLLCFGR_PLLM_Pos)//bit07-04[3:0]: PLL初始分频+ V2 k; O8 {" ?" W( r
- // 0000: PLLM = 1
3 e8 O3 m$ q8 n/ \' z9 d# B - /// // 0001: PLLM = 27 _8 _5 s1 {+ o( V% W0 r. ]6 ^
- // 0010: PLLM = 3
$ F# G3 B. p( r+ J- U - // 0011: PLLM = 43 y8 u/ t0 U. Z( s7 ~2 ?; ?
- // 0100: PLLM = 5
6 J: Q% ]: y5 u$ m5 y' ~ - // 0101: PLLM = 62 z, s6 T+ N0 Q3 n0 @- e
- // 0110: PLLM = 7
2 E6 a ~/ f( A' v+ r - // 0111: PLLM = 89 y0 M' C) W4 V2 [/ l
- // 1000: PLLSYSM = 9
. R& B- a. ]! g+ J - // ...3 q; P0 T3 h; m3 \
- // 1111: PLLSYSM= 169 X. K/ A4 V' z% L. k5 h Y4 s
- |RCC_PLLCFGR_PLLSRC //bit01-00[1:0]: PLL时钟源选择。' z( ?9 E2 Y G3 t- e+ d
- // 00: No clock sent to PLL
$ w. J" q5 Z( Z3 q; q: U ~ - // 01: No clock sent to PLL
4 m2 A/ `- s7 j - // 10: HSI16 clock selected as PLL clock entry
0 U1 W8 c' L8 h1 }+ c - /// // 11: HSE clock selected as PLL clock entry
3 _8 C' k$ Z3 f. i# j( N5 L" E8 z - ;5 R- v/ y: Z- m& o* o: N
- 3 s0 f' U( R- y- S' R u; H
- //================================RCC->CFGR========================================$ Q( f, U1 ]/ ^, b! P/ T3 v# e* @
- RCC->CFGR = 0 //default: 0x0000 00055 ^! l5 z( v% i' d7 H
- // |RCC_CFGR_MCOPRE //bit30-28[2:0]: MCO输出时钟分频
5 g: P7 b" t! B - // 000: MCO is divided by 1
9 y, j* U. z2 r0 ]! Z% P* ? - // 001: MCO is divided by 22 S6 H5 W/ S7 C5 P* G/ U/ Y
- // 010: MCO is divided by 41 Z& H% a+ E8 H/ X$ }
- // 011: MCO is divided by 8- T; D( Y& s, l1 ?; o9 `" r; n" ]
- // 100: MCO is divided by 16- W2 n9 V2 O! c! t q8 h1 [
- // Others: not allowed
. {# b9 A3 x( J7 [: O - // |RCC_CFGR_MCOSEL //bit27-24[3:0]: MCO输出时钟选择
0 \! P5 E0 ]9 N/ q( I - // 0000: MCO output disabled, no clock on MCO) F7 Q* o. @4 l6 [* P
- // 0001: SYSCLK system clock selected |! s4 d9 l& F6 d5 A: O
- // 0010: Reserved, must be kept at reset value
' a j# P9 r: Z6 S8 w3 w - // 0011: HSI16 clock selected6 ?! f% f/ v! u! D
- // 0100: HSE clock selected
% Z5 e2 I; {! H, {# ^0 F - // 0101: Main PLL clock selected& ]9 o3 m( l( k3 V v ]
- // 0110: LSI clock selected r$ \+ Z* J3 X4 d2 S- a
- // 0111: LSE clock selected3 `. x. | M" w
- // 1000: Internal HSI48 clock selected! O6 b5 q( |7 R4 s" v5 P
- |RCC_CFGR_PPRE2_DIV2 //bit13-11[2:0]: APB2预分频
7 H( U c4 g& d/ F3 T! {# }0 u - // 0xx: HCLK not divided( n) r/ h7 M. Y8 `- u& g9 e
- // 100: HCLK divided by 2
% `0 A2 A) Q$ r1 \ - // 101: HCLK divided by 4
! V* Q1 k L% B2 i2 p. F - // 110: HCLK divided by 8
4 v4 d" i, I8 x& q3 O7 Q( `! s4 \ - // 111: HCLK divided by 16: R, v( a7 O; I7 @
- |RCC_CFGR_PPRE1_DIV4 //bit10-08[2:0]: APB1预分频
- p5 `; _: f S - // 0xx: HCLK not divided/ O* s$ K6 U1 G9 J+ W# g7 K3 y8 ?
- // 100: HCLK divided by 2
0 [" Y z$ C6 d# N - // 101: HCLK divided by 4- \# j" r; [5 H/ M6 `
- // 110: HCLK divided by 8
- A# H; P2 V/ l' E* z - // 111: HCLK divided by 16
3 S& I4 P+ C5 _7 j) G( ?1 ] - // |RCC_CFGR_HPRE //bit07-04[3:0]: AHB预分频(改变core电压之前应该先查看这些时钟频率)
" W6 [% f9 H# \- t6 n" R$ v% x6 u - // 0xxx: SYSCLK not divided& O! x( h) i6 t# O/ ~* i5 [$ b
- // 1000: SYSCLK divided by 2
& S1 R5 \6 d- e6 f9 R, H - // 1001: SYSCLK divided by 4
( X( x$ c, V/ X$ G - // 1010: SYSCLK divided by 8
2 N, c& e6 p7 U8 Z: X. r W! ^/ b - // 1011: SYSCLK divided by 16* N+ T6 G' m" a' {
- // 1100: SYSCLK divided by 64
( h, Z% C' x! _ s+ j - // 1101: SYSCLK divided by 128# O) g' H. v" Q. r+ a
- // 1110: SYSCLK divided by 256
+ {* r. J) k, d% r, i - // 1111: SYSCLK divided by 512/ g8 r- m0 _9 R. o" ^8 `! w
- //RCC_CFGR_SWS //bit03-02[1:0]【read only】:系统时钟源选择状态,该位与SW对应。
8 P% z. u5 O9 s - |RCC_CFGR_SW //bit01-00[1:0]: 系统时钟源选择。
2 G. G S: a' C( \* P9 P - // 00: Reserved, must be kept at reset value" D/ r* _4 ^! l! [
- // 01: HSI16 selected as system clock
' |$ t5 t o0 w: ` - // 10: HSE selected as system clock
" r; Y- B9 b& f! h - /// // 11: PLL selected as system clock
: \: D1 M& q8 G3 l; G8 l - ;
复制代码下面是RCC寄存器: : Y9 D# l4 _/ E1 A( V$ I
2 C6 B% H+ B$ p( B* S9 @9 V( t
- void RCC_Init(void)
7 f/ G) m9 w4 J0 T+ r8 g - {
* y" G0 g6 V5 G! H* F7 [: G6 F! v' u. ~ - //--------------------------------------------------------------------------------------//
4 i* R& `. _3 |& ~% S) ]* | - //---------------------------------------- AHB1 ----------------------------------------//1 z( {8 s! v& j
- //--------------------------------------------------------------------------------------//' o7 ~8 C, S/ l4 H! _- E. W: t
- RCC->AHB1RSTR |= 0 //default: 0x0000 0000( B3 n+ r4 P8 K
- // |RCC_AHB1RSTR_CRCRST //bit12
: |4 h5 X/ h+ d t) O" Z* j - // |RCC_AHB1RSTR_FLASHRST //bit08 i' U- L; a% i4 u+ S+ j& V8 `% x
- // |RCC_AHB1RSTR_FMACRST //bit04. k5 L$ B0 E9 D& A: g. n
- // |RCC_AHB1RSTR_CORDICRST //bit03
" f9 d7 a* P( z$ S/ Y. W - // |RCC_AHB1RSTR_DMAMUX1RST //bit025 X& u# L s6 d1 h, }% O
- // |RCC_AHB1RSTR_DMA2RST //bit01. Y% `4 p$ O" U% i6 i; l
- // |RCC_AHB1RSTR_DMA1RST //bit00
/ i2 b$ J) Z' l1 X - ;: O; p2 ]6 t: s; J2 P
- RCC->AHB1RSTR &= 0xffffffff //default: 0x0000 0000
: }9 M6 G9 Z d9 p3 q - // &~RCC_AHB1RSTR_CRCRST //bit12; ?9 p. p' I: a* |; X& i5 O
- // &~RCC_AHB1RSTR_FLASHRST //bit08
' ^- ]1 V' c( @3 p G8 p - // &~RCC_AHB1RSTR_FMACRST //bit04
0 V% O& `+ F; Q6 e; B& J - // &~RCC_AHB1RSTR_CORDICRST //bit03
; b) Q O8 A! \! {. s$ O" G v' D. V( v - // &~RCC_AHB1RSTR_DMAMUX1RST //bit02
: F) g% \; t. m; P - // &~RCC_AHB1RSTR_DMA2RST //bit01
; }& e" X- l. g* n9 z( y) Z# U - // &~RCC_AHB1RSTR_DMA1RST //bit004 Y) i% E7 G* Z; O- k
- ;% F: `& ~# d! h) V' Y8 S; x
-
3 r+ Z& U9 A5 E. n - RCC->AHB1ENR |= 0 //default: 0x0000 0100
) C% C/ Q4 @) T - // |RCC_AHB1ENR_CRCEN //bit12
- o- t. G8 @$ w9 H5 o0 `+ @9 h+ b - // |RCC_AHB1ENR_FLASHEN //bit086 r8 S/ ?+ d" I% ^+ [# N3 h/ c% O7 s
- // |RCC_AHB1ENR_FMACEN //bit04 ]/ a, i" x1 x4 g# p8 x. e/ Y
- // |RCC_AHB1ENR_CORDICEN //bit03
: o0 q, j- H+ o( ~ - // |RCC_AHB1ENR_DMAMUX1EN //bit02
; ~) S: Z: |( }* L" y# b7 l+ Q2 J - // |RCC_AHB1ENR_DMA2EN //bit01' y+ j$ b9 f1 ?* K9 e
- // |RCC_AHB1ENR_DMA1EN //bit00% Y5 t( t" i+ o$ X. E
- ;7 a" \+ [1 G! m" O' Z
- //--------------------------------------------------------------------------------------//1 W) D4 F$ y4 v. w/ L* m6 J) x4 D
- //---------------------------------------- AHB2 ----------------------------------------//$ U. e- ^% ^$ a, M1 r
- //--------------------------------------------------------------------------------------//
2 I/ E, F# M" m& p - RCC->AHB2RSTR |= 0 //defualt: 0x0000 0000- B Q' N- e S: t9 ]
- // |RCC_AHB2RSTR_RNGRST //bit26% i' l# I$ Q$ l3 y8 p& f9 M
- // |RCC_AHB2RSTR_RNGRST //bit24
8 [2 F: `; k* O5 [# r - // |RCC_AHB2RSTR_DAC4RST //bit19
5 c' P& l4 C: x- _7 J0 x - // |RCC_AHB2RSTR_DAC3RST //bit18& Q' `( r8 ^+ Z! V$ y
- // |RCC_AHB2RSTR_DAC2RST //bit17
7 ? R! Y v8 v - // |RCC_AHB2RSTR_DAC1RST //bit165 W* B" Y% b8 K2 }! G
- // |RCC_AHB2RSTR_ADC345RST //bit14 g8 n) X) r1 I3 [/ _& y8 ^- k
- // |RCC_AHB2RSTR_ADC12RST //bit139 Q* Z0 M" f: f6 B
- // |RCC_AHB2RSTR_GPIOGRST //bit069 d; E( T( n. L+ t
- // |RCC_AHB2RSTR_GPIOFRST //bit05
3 |/ C& R1 y) w0 |8 ` - // |RCC_AHB2RSTR_GPIOERST //bit044 {! l& Q! S# ]5 P
- // |RCC_AHB2RSTR_GPIODRST //bit03
# Q+ R: T3 J, _1 c8 ^9 h v6 `- u - |RCC_AHB2RSTR_GPIOCRST //bit02% N9 a3 c# A4 B b8 f9 T3 \/ t
- // |RCC_AHB2RSTR_GPIOBRST //bit01: Y, F/ D7 O5 A2 K7 f# Y% F8 K
- // |RCC_AHB2RSTR_GPIOARST //bit00
% j Y0 d2 R. t! l3 ^0 b$ h - ;
% U$ J5 T: D2 | - RCC->AHB2RSTR &= 0xffffffff //defualt: 0x0000 0000
& E9 F+ L0 R- K; J( @' Q - // &~RCC_AHB2RSTR_RNGRST //bit26
; L) b# }; d6 [$ s - // &~RCC_AHB2RSTR_RNGRST //bit241 `6 d& A2 L f7 t# v; b
- // &~RCC_AHB2RSTR_DAC4RST //bit19
) F! |# p+ E% n - // &~RCC_AHB2RSTR_DAC3RST //bit18
7 k* G$ p$ c5 b" v - // &~RCC_AHB2RSTR_DAC2RST //bit17
; g" n$ c& @ v7 a) n% K/ s* k - // &~RCC_AHB2RSTR_DAC1RST //bit16
- X8 q) p( z3 g - // &~RCC_AHB2RSTR_ADC345RST //bit14
W' m6 Z! ^3 F* | - // &~RCC_AHB2RSTR_ADC12RST //bit13" x3 J( h( B+ e5 W4 W
- // &~RCC_AHB2RSTR_GPIOGRST //bit06: p: K( T5 Q) \ [
- // &~RCC_AHB2RSTR_GPIOFRST //bit05
! l8 j' v, S4 E) @, n" q- V( ~ - // &~RCC_AHB2RSTR_GPIOERST //bit04
6 }: a% ]: ~" r7 t1 Z+ L - // &~RCC_AHB2RSTR_GPIODRST //bit03$ }7 t. O% F& @- i
- &~RCC_AHB2RSTR_GPIOCRST //bit02
4 K3 }) m% P+ u5 H% _: y- ^ - // &~RCC_AHB2RSTR_GPIOBRST //bit015 Z3 b d" a1 D& r
- // &~RCC_AHB2RSTR_GPIOARST //bit000 F& @# C4 q# x8 f
- ;' Y0 x+ c2 k3 A& d/ Q& E/ a; H* q9 o
- RCC->AHB2ENR = 0 //default: 0x0000 0000
8 i( ?1 v( O% f# C% O9 s# K - // |RCC_AHB2ENR_RNGEN //bit26- d1 a- o$ e& [ w! x# }2 X- O6 z! Q
- // |RCC_AHB2ENR_DAC4EN //bit192 N/ y3 G8 D# H. o- @6 a4 b0 |
- // |RCC_AHB2ENR_DAC3EN //bit18- [2 T3 C: ] v, t4 K( f
- // |RCC_AHB2ENR_DAC2EN //bit17
1 v/ [# ]$ M7 l' U, e2 ?4 f: t; @ - // |RCC_AHB2ENR_DAC1EN //bit16" _/ T4 j8 s c3 r5 V& N
- // |RCC_AHB2ENR_ADC345EN //bit14
' i. D/ n& C4 T- m& D, G$ W G" M - // |RCC_AHB2ENR_ADC12EN //bit134 h' \* N" G1 m
- // |RCC_AHB2ENR_GPIOGEN //bit06
$ b1 ]) a" x* k3 i* d - // |RCC_AHB2ENR_GPIOFEN //bit05* @; w7 ^# L$ B5 y9 `* G o t
- // |RCC_AHB2ENR_GPIOEEN //bit04
6 b% g y5 X! n - // |RCC_AHB2ENR_GPIODEN //bit03
, \9 h& F! i/ \; N/ P% V - |RCC_AHB2ENR_GPIOCEN //bit02! a6 _% |% ?% G y6 L
- // |RCC_AHB2ENR_GPIOBEN //bit01
0 O$ e* H/ g% W - // |RCC_AHB2ENR_GPIOAEN //bit00# p( Z) \* D v# l! f9 B
- ;
) U. s0 |2 j' t y( H - //--------------------------------------------------------------------------------------//% s9 w" p; t, a, X$ l) `/ O
- //---------------------------------------- AHB3 ----------------------------------------//
" }: y6 n$ X8 w: N% J ] - //--------------------------------------------------------------------------------------//
9 o3 d% b3 T- w: M - RCC->AHB3RSTR |= 0 //default:0x0000 00009 m, S! a9 V9 H0 g3 |
- // |RCC_AHB3RSTR_QSPIRST //bit08! W5 d* M4 Y9 F& a
- // |RCC_AHB3RSTR_FMCRST //bit00
4 m$ g9 A( n5 {1 R5 a" R - ;
* \4 P2 l7 E( m - RCC->AHB3RSTR &= 0xffffffff //default:0x0000 0000
8 ?; ]7 n3 T; u% }5 a - // &~RCC_AHB3RSTR_QSPIRST //bit08/ U' Q2 V5 l6 ]4 y# \
- // &~RCC_AHB3RSTR_FMCRST //bit00
6 ]: V5 V/ X E W$ s - ;
0 r0 O! l& C5 L& ^- w4 s% ? - - T& ~1 \5 s5 Y3 L, m( N$ N. U
- RCC->AHB3ENR |= 0 //default: 0x0000 0000
) a7 a* s4 o- ]- ?+ J6 U - // |RCC_AHB3ENR_QSPIEN //bit08( m* ]+ a5 w: _% Y' e8 H( M6 U
- // |RCC_AHB3ENR_FMCEN //bit00, u& X9 s) _0 U; c; s$ s5 f" k
- ;
y# {7 |9 x+ p' ^4 ?8 X- S - //--------------------------------------------------------------------------------------/// {. B' U8 y) t0 @3 I7 f' G
- //---------------------------------------- APB1 ----------------------------------------//
! ?, H; U8 \1 z+ Z& k! B - //--------------------------------------------------------------------------------------//
0 p8 K: x9 g" f4 B - RCC->APB1RSTR1 |= 0 //default: 0x0000 0000
5 q' ^: w$ Z7 s- y! Z5 | - // |RCC_APB1RSTR1_LPTIM1RST //bit314 @$ K# t9 x* E3 m8 N3 ?
- // |RCC_APB1RSTR1_I2C3RST //bit30: a/ K# o% C- r& v. T* F+ F
- // |RCC_APB1RSTR1_PWRRST //bit28
+ K8 T* v. {2 \, |* j9 Y4 X. q* Y - // |RCC_APB1RSTR1_FDCANRST //bit25
3 s) O4 f1 ?' O- U, W, P - // |RCC_APB1RSTR1_USBRST //bit23& X$ v5 z+ U; X8 E
- // |RCC_APB1RSTR1_I2C2RST //bit22
& ~! ?0 c$ w' y0 k$ W ` p" ~ - // |RCC_APB1RSTR1_I2C1RST //bit21
" W ?* r1 O. t - // |RCC_APB1RSTR1_UART5RST //bit20. r h/ I' M I0 c( O x% B
- // |RCC_APB1RSTR1_UART4RST //bit19/ z4 { J- x }8 Q7 w- H
- // |RCC_APB1RSTR1_USART3RST //bit18
/ T: R+ e2 U' |1 T, y' G9 O - // |RCC_APB1RSTR1_USART2RST //bit17! z0 j' `3 B, [6 @+ S
- // |RCC_APB1RSTR1_SPI3RST //bit15
1 S/ ?) F( |2 g$ X9 l8 Y% v/ r - // |RCC_APB1RSTR1_SPI2RST //bit14
6 ?- G7 r' n1 n8 q. D* q5 | - // |RCC_APB1RSTR1_CRSRST //bit08$ E/ u, _1 s8 B$ Y* }+ `
- |RCC_APB1RSTR1_TIM7RST //bit05
( b' I0 k7 q6 D& C& m6 [ - // |RCC_APB1RSTR1_TIM6RST //bit04
0 z% i& o2 N4 [) r1 a; _" T - // |RCC_APB1RSTR1_TIM5RST //bit03! b! m, \5 t1 U3 C) }- L/ k
- // |RCC_APB1RSTR1_TIM4RST //bit021 b% F7 V) n6 E4 L3 Q( s
- // |RCC_APB1RSTR1_TIM3RST //bit01
! m c1 A" h$ D$ l) o3 w# @, y3 I - // |RCC_APB1RSTR1_TIM2RST //bit00
% L$ q2 s' t+ _- b) w3 q - ;
8 v( D, Z4 ~' E* m8 F t - RCC->APB1RSTR1 &= 0xffffffff//default: 0x0000 0000& d+ E& W+ U: C1 r/ J
- // &~RCC_APB1RSTR1_LPTIM1RST //bit31
% R A8 |% U. H! m" z - // &~RCC_APB1RSTR1_I2C3RST //bit30
* c+ C1 d, y! Y* z7 Q4 q" }# j2 n - // &~RCC_APB1RSTR1_PWRRST //bit28( N$ s( P% s* p6 L
- // &~RCC_APB1RSTR1_FDCANRST //bit25# _1 S! g5 j2 z
- // &~RCC_APB1RSTR1_USBRST //bit23
! t Y1 H7 v1 [$ j& c - // &~RCC_APB1RSTR1_I2C2RST //bit22
$ A- p; X( b o - // &~RCC_APB1RSTR1_I2C1RST //bit216 D/ m6 A. E* @& m
- // &~RCC_APB1RSTR1_UART5RST //bit20
" J7 |* D, T- g0 u8 P% P7 i, ]: l; x - // &~RCC_APB1RSTR1_UART4RST //bit19' D0 B5 \9 q# g. H
- // &~RCC_APB1RSTR1_USART3RST //bit18' E4 q, O9 a% M/ B7 x% L
- // &~RCC_APB1RSTR1_USART2RST //bit17
# V r% P9 n# A0 m - // &~RCC_APB1RSTR1_SPI3RST //bit151 A: L0 i% ]! ~& B' C
- // &~RCC_APB1RSTR1_SPI2RST //bit14. Q5 O& j& s2 [* C1 @, ?) m
- // &~RCC_APB1RSTR1_CRSRST //bit08) a+ P( W4 F$ f
- &~RCC_APB1RSTR1_TIM7RST //bit057 b4 u# o# {$ _
- // &~RCC_APB1RSTR1_TIM6RST //bit04; {8 F: k: l) A, Y
- // &~RCC_APB1RSTR1_TIM5RST //bit03# z$ T) V) Z" O
- // &~RCC_APB1RSTR1_TIM4RST //bit026 W9 I. A% L: x2 h
- // &~RCC_APB1RSTR1_TIM3RST //bit01
% P& L* W' v8 N+ j. N2 d - // &~RCC_APB1RSTR1_TIM2RST //bit000 M. S3 _; \5 A- u" R5 s
- ;
& {; A. }. @" ~0 S - * O, y) [' W+ a# W6 S/ ^
- RCC->APB1ENR1 |= 0 //default: 0x0000 0400
4 A( x; ~' Q8 o+ p/ J" o* ] - // |RCC_APB1ENR1_LPTIM1EN //bit31
; r) y' O( N; ?3 f8 ^ - // |RCC_APB1ENR1_I2C3EN //bit301 R l# B0 k. l
- // |RCC_APB1ENR1_PWREN //bit28
) C& q0 \. I/ [- A) h& x - // |RCC_APB1ENR1_FDCANEN //bit25! S1 u& {+ a, Z+ }( W. w
- // |RCC_APB1ENR1_USBEN //bit23
" Z: y0 P$ X- T, Z- I- F, V$ J1 j# Y - // |RCC_APB1ENR1_I2C2EN //bit22
}2 d0 K) m, \& |& A - // |RCC_APB1ENR1_I2C1EN //bit21* a/ X$ e! Y2 ^2 i' J+ b- x# L# i
- // |RCC_APB1ENR1_UART5EN //bit20
: @1 \& s2 v4 B( N- l3 ^# M; r - // |RCC_APB1ENR1_UART4EN //bit190 t- L. p6 ~2 h2 u" x& Y4 C1 v
- // |RCC_APB1ENR1_USART3EN //bit180 {$ b& h6 K5 V0 V+ q
- // |RCC_APB1ENR1_USART2EN //bit171 C% [; C. \$ p( ^* i0 r$ |
- // |RCC_APB1ENR1_SPI3EN //bit15- C7 I) N. d. j- @
- // |RCC_APB1ENR1_SPI2EN //bit141 d( j9 r& C& m7 p: N) y
- // |RCC_APB1ENR1_WWDGEN //bit11* l3 R6 W( @! A
- // |RCC_APB1ENR1_RTCAPBEN //bit10
6 ?1 F" Z- i% Z" O+ E - // |RCC_APB1ENR1_CRSEN //bit081 H: V; t! C+ ^& s) j; t
- |RCC_APB1ENR1_TIM7EN //bit05
9 d3 G) Q; ]* b - // |RCC_APB1ENR1_TIM6EN //bit04
c/ ^( l2 r! Y9 f: L& ?% Z9 I- o3 N - // |RCC_APB1ENR1_TIM5EN //bit03/ G; Y# @) v" S7 u( j
- // |RCC_APB1ENR1_TIM4EN //bit02! \. {8 w! ~' K% p! I3 h4 \3 Z
- // |RCC_APB1ENR1_TIM3EN //bit01
# q' X- Y* m3 J& A* R3 C - // |RCC_APB1ENR1_TIM2EN //bit00
6 w2 a A1 x# Z% s( R. N7 j+ W - ;
* o) Y' `* s! @# Q& c/ l
F- Z1 Y- A/ q8 e0 n( C# }- & m( C/ A" C! v* W9 u
- RCC->APB1RSTR2 |= 0 //default: 0x0000 0000
Z1 m2 g* I: l, n- n - // |RCC_APB1RSTR2_UCPD1RST //bit08
# @% S" v' V- Q' L - // |RCC_APB1RSTR2_I2C4RST //bit01: N/ E! B9 w& P* i
- // |RCC_APB1RSTR2_LPUART1RST //bit006 K$ c- I3 `9 k' w+ r- Z
- ;
; }/ J, N5 h5 l% G) \: O - RCC->APB1RSTR2 &= 0xffffffff//default: 0x0000 0000* _4 p+ j3 `- X4 h2 P
- // &~RCC_APB1RSTR2_UCPD1RST //bit08
% M0 W6 g' R( B/ N - // &~RCC_APB1RSTR2_I2C4RST //bit01
2 c( O) [6 v8 I5 S m5 d - // &~RCC_APB1RSTR2_LPUART1RST //bit00. s; Y2 m5 O8 H
- ;
1 \' y$ o" o' i
3 ]1 x5 V# ?; W- r- RCC->APB1ENR2 |= 0 //default: 0x0000 0000
" G- K( B( ^8 f4 f8 U8 b4 Q6 E - // |RCC_APB1ENR2_UCPD1EN //bit08
3 v! t' z6 G9 A$ |! V/ _ Z - // |RCC_APB1ENR2_I2C4EN //bit010 ]0 } B7 b* l" e2 @# C! h0 Q8 \
- // |RCC_APB1ENR2_LPUART1EN //bit00
3 H& e6 m! G( }- z" V/ R - ;( |$ o1 y! R% K
- //--------------------------------------------------------------------------------------//1 m) T0 }- e9 F$ y
- //---------------------------------------- APB2 ----------------------------------------//$ X) V9 T0 A# I/ |
- //--------------------------------------------------------------------------------------//
, o+ G! A& Y$ Y5 i - RCC->APB2RSTR |= 0 //default: 0x0000 0000
' T/ L U; \5 U# J& }2 ^ - // |RCC_APB2RSTR_HRTIM1RST //bit268 X' S4 _! E, A% G
- // |RCC_APB2RSTR_SAI1RST //bit21
0 r6 b' }) m3 b/ i - // |RCC_APB2RSTR_TIM20RST //bit20
# h, K, U, s" q7 r/ Q - // |RCC_APB2RSTR_TIM17RST //bit18
4 ~! Y# u( `. Q& @ g - // |RCC_APB2RSTR_TIM16RST //bit17. k/ |# x( r' B9 f( _
- // |RCC_APB2RSTR_TIM15RST //bit16
1 N; o( s' y0 s( @# S l+ }# m% F - // |RCC_APB2RSTR_SPI4RST //bit150 @2 G9 `! @3 ^3 v0 K3 s4 l2 m5 Q+ h
- // |RCC_APB2RSTR_USART1RST //bit148 {+ f3 O! T9 O' w. r5 j
- // |RCC_APB2RSTR_TIM8RST //bit13( L8 h d2 r3 I' U
- // |RCC_APB2RSTR_SPI1RST //bit12
' p; Y. t" @; u: |6 I6 i: r - // |RCC_APB2RSTR_TIM1RST //bit11* v T" X) h* _
- // |RCC_APB2RSTR_SYSCFGRST //bit00, K) ~1 J# k% y* C
- ;
" Y" T: D( o, S% `5 e) y! a - RCC->APB2RSTR &= 0xffffffff //default: 0x0000 0000
# @2 E' B1 i1 b( Z0 U& d* ^ - // &~RCC_APB2RSTR_HRTIM1RST //bit26, M3 V& @1 e' p$ ?5 u
- // &~RCC_APB2RSTR_SAI1RST //bit21
G. k/ f# ~( l, _* ~' x# K4 b% R% j! Z - // &~RCC_APB2RSTR_TIM20RST //bit20
+ l' @6 S& \2 Z4 z- a! W: k - // &~RCC_APB2RSTR_TIM17RST //bit18 z) D! l7 ], Q+ T9 f/ D8 R
- // &~RCC_APB2RSTR_TIM16RST //bit17
2 b% w+ i% P: d5 c o2 z - // &~RCC_APB2RSTR_TIM15RST //bit16
5 v w Y4 ]5 P( b( H7 w/ B! Z1 E - // &~RCC_APB2RSTR_SPI4RST //bit154 C9 b: c7 T# | t5 g: }6 e, A
- // &~RCC_APB2RSTR_USART1RST //bit14, N& D: L R! x( g: o" C
- // &~RCC_APB2RSTR_TIM8RST //bit13 R- ~* i3 X# b8 B! X3 Z4 ~3 ~7 o1 ^
- // &~RCC_APB2RSTR_SPI1RST //bit12
& R. ?9 U+ b; T6 X) J2 V - // &~RCC_APB2RSTR_TIM1RST //bit11* ~% N+ b& O$ P6 b2 R6 m
- // &~RCC_APB2RSTR_SYSCFGRST //bit00( D/ e% }/ x7 t9 o
- ;& _7 Q' X+ s# N; d X6 |( v# ?
- 6 } X. @8 v2 f: {
- RCC->APB2ENR |= 0 //default: 0x0000 0000
* C+ m, u$ ?% b! o0 R. q - // |RCC_APB2ENR_HRTIM1EN //bit26
; l9 V1 k: D- [, z0 {6 A8 }* u - // |RCC_APB2ENR_SAI1EN //bit21+ N1 I8 a8 i, s `% C
- // |RCC_APB2ENR_TIM20EN //bit20
& J( a ?4 Q6 a% i$ @8 Q - // |RCC_APB2ENR_TIM17EN //bit18
7 P0 d+ j3 p2 S; r0 q - // |RCC_APB2ENR_TIM16EN //bit17
& }( F# t- J0 \* |& v2 a8 V) l - // |RCC_APB2ENR_TIM15EN //bit16
- Z7 x* f6 I( y2 A- l" M - // |RCC_APB2ENR_SPI4EN //bit15
# o! i6 {$ K; r - // |RCC_APB2ENR_USART1EN //bit14
5 b0 F$ E7 x& F5 q7 D( l T* d - // |RCC_APB2ENR_TIM8EN //bit13
8 X$ c: Q5 @( }, p4 j - // |RCC_APB2ENR_SPI1EN //bit122 f6 r% ^5 Y4 H- r: o" S$ h1 T
- // |RCC_APB2ENR_TIM1EN //bit11( M' v2 v! N4 ?$ f5 S
- // |RCC_APB2ENR_SYSCFGEN //bit00
, X+ v; Z& o+ J - ;8 F( ~" i5 V2 m Z1 B
- }
; E4 H6 z. \$ h: o1 B* h
复制代码
3 r: v8 m& f7 e3 h0 [
- Q; ]/ W( i0 w6 p& A; @
0 M2 N- K& G) a# C3 W; K4 o1 j
6 f5 y6 c$ i8 p" M% [, C% B1 H9 h5 Y |