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