你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用C++写单片机程序STM32F103+自建固件库+FreeRTOS gcc编译器  

[复制链接]
freemancn 发布时间:2019-8-17 18:13
阅读主题, 点击返回1楼
收藏 5 评论31 发布时间:2019-8-17 18:13
31个回答
freemancn 回答时间:2020-11-19 21:43:03
mylovemcu 发表于 2020-11-13 14:08+ |( i8 b  ~% K0 T1 L2 W
老师去哪了  怎么不更新了  搞一个库上来学习一下
" T( e1 `6 i  ^. Z  Z2 H7 x想看看你的顶层库怎么写的  我现在也在用C++  底层库太费 ...

% T$ m5 t. Q- S2 J1 q分享一个
* U) S2 G) N( I0 H' T6 j3 d8 `- x9 _- C
#ifndef RCC_HPP_
; Z0 t% Z) O) ^/ X$ w9 J#define RCC_HPP_( Z2 k8 b1 P4 t; y+ f2 H

8 I1 C3 m6 Q3 Q2 e#include "STM32F103.h"
, X7 N5 @5 O$ R, i8 V
' Z" I5 }! V8 H. Y1 [namespace MCU$ X. \. C+ G9 W3 G4 \8 I1 A, `5 a
{
0 H. z. F5 s6 T9 d8 A7 o        namespace STM32F103; W& V9 ~- W* }5 {3 [% `. A' {
        {; ]5 H2 \" }& E9 |. N
                struct RegisterRCC
% o; k4 e) M9 o                {% z3 M8 D7 g% Y; R6 t" x4 Q
                        volatile union
3 a9 a7 N# t$ ?                        {' z- G- l$ n- I8 c" K$ R8 N" C) `
                                volatile uint32_t Value;! {* @% W# o( Z' f, s  T
                        1 v2 W! N) ?/ J: j/ m
                                volatile struct
  x* l1 l% C# l, B                                {3 q# a2 N5 {1 g& r
                                        volatile uint32_t HSION : 1;
; r! x9 y! n( R; J                                        volatile const uint32_t HSIRDY : 1;$ y- O2 l7 w# x, o: J& S& x: H
                                        volatile uint32_t RESERVED1 : 1;: I3 o8 {( @- ~8 {
                                        volatile uint32_t HSITRIM : 5;/ W7 |8 j1 g4 w
                                        volatile const uint32_t HSICAL : 8;
- v1 L8 t7 P. p2 a* @0 g                                        volatile uint32_t HSEON : 1;5 ^6 A  w  k, ~' Q4 Y5 c
                                        volatile const uint32_t HSERDY : 1;7 h! i1 A+ l6 J
                                        volatile uint32_t HSEBYP : 1;& w2 L" i% e2 u, c  h1 N
                                        volatile uint32_t CSSON : 1;0 f/ j( K/ ]6 a3 @
                                        volatile uint32_t RESERVDE2 : 4;3 Z9 u/ n& s3 W. |( o$ m
                                        volatile uint32_t PLLON : 1;
# S" `" T  S$ Y                                        volatile const uint32_t PLLRDY : 1;
. @4 ?; h4 h/ @2 M! @; e( V                                        volatile uint32_t RESERVDE3 : 6;
, S! p3 t4 s1 ~* B! ^9 M4 x                                }Bit;
7 S( I' d$ O" f1 B                        }CR;
  h3 Y) @" M0 |/ o' \. V8 o0 L2 K5 z0 B) [; G3 }
                        volatile union
' T' j. Q9 O& i6 x8 b5 \                        {- E# }  I. ]: T
                                volatile uint32_t Value;
1 k5 W2 {; z" S/ c) c- u& I                        & r- I; n) H5 n& \, B% U
                                volatile struct+ u6 U( x: t4 t' b1 ]6 A
                                {
, I3 T+ B  k0 ~  V: v                                        volatile uint32_t SW : 2;
% [1 v0 J3 t" o                                        volatile const uint32_t SWS : 2;
) d- K& ]( R$ m$ K6 I) r                                        volatile uint32_t HPRE : 4;
# Z- |( A6 @% C# T                                        volatile uint32_t PPRE1 : 3;
. @9 a, r+ \' V/ X                                        volatile uint32_t PPRE2 : 3;( Q- b6 G" u0 }3 m
                                        volatile uint32_t ADCPRE : 2;" s3 ]. m4 r9 ], I9 G
                                        volatile uint32_t PLLSRC : 1;
2 N) w; m) }+ ~) H& Z; m, {9 p                                        volatile uint32_t PLLXTPRE : 1;/ x) c4 C9 @0 S2 A
                                        volatile uint32_t PLLMUL : 4;* i) G! ?) l$ V$ U0 g; b4 v) D5 R# ?; c
                                        volatile uint32_t USBPRE : 1;
  ?; O- e& }3 [6 |9 Z                                        volatile uint32_t RESERVED1 : 1;9 I* r( Z, x& Y% y8 I/ y
                                        volatile uint32_t MCO : 3;+ v2 C. H) c3 m2 U
                                        volatile uint32_t RESERVED2 : 5;
$ _# G$ R( _5 r$ e5 l                                }Bit;. Y" [( a. x/ u6 H7 K$ X( C' A
                        }CFGR;
7 G' S- r, `( d9 N& v/ O2 Y                8 U" U: }8 ?5 {% q- N
                        volatile union
: k8 ~  ^! p' V1 j                        {+ U! P9 S8 e0 `
                                volatile uint32_t Value;3 I9 P: ^- v+ V* Y' M
                        
7 w: e7 z9 ^% z4 y4 R0 {                                volatile struct9 R1 l5 T9 E6 v6 @+ g
                                {  s; a1 l/ Z4 }0 t
                                        volatile const uint32_t LSIRDYF : 1;( C& [# i- E- M7 }; F. K+ {
                                        volatile const uint32_t LSERDYF : 1;
0 h' Y% G: u2 x; t- {3 i                                        volatile const uint32_t HSIRDYF : 1;
& s7 b+ e# b) l/ A9 o                                        volatile const uint32_t HSERDYF : 1;
  K" n) b% d; T- F9 z+ _                                        volatile const uint32_t PLLRDYF : 1;6 {+ M* s; `5 M  l+ F4 I
                                        volatile const uint32_t PLL2RDYF : 1;' g# J) {# j$ j$ k& ~- x
                                        volatile const uint32_t PLL3RDYF : 1;" W' v* K5 k& O* E) h4 Z( z- h; h
                                        volatile const uint32_t CSSF : 1;5 w- x* ^/ R& z, V
                                        volatile uint32_t LSIRDYIE : 1;
# W# u+ X. q( I% L                                        volatile uint32_t LSERDYIE : 1;
6 o; f4 A. ]! t* w5 Z# N1 z& {                                        volatile uint32_t HSIRDYIE : 1;, k( k& p" e* f
                                        volatile uint32_t HSERDYIE : 1;( d# p) N- O# r. W
                                        volatile uint32_t PLLRDYIE : 1;# x8 H3 d9 T$ _+ o2 i8 X
                                        volatile const uint32_t PLL2RDYE : 1;
; F3 _! u! m. H; b                                        volatile const uint32_t PLL3RDYE : 1;
2 g* t0 g' X* }- d                                        volatile uint32_t RESERVED1 : 1;
+ ~# C  d8 A" f9 q9 _                                        volatile uint32_t LSIRDYC : 1;
; t7 f' E) `; v' S) f3 L+ |- g. R                                        volatile uint32_t LSERDYC : 1;
5 M! s+ v" n! i0 _4 U                                        volatile uint32_t HISRDYC : 1;0 @: @0 X" h6 W  p( l
                                        volatile uint32_t HSERDYC : 1;/ [4 R+ [; r$ z8 H6 G
                                        volatile uint32_t PLLRDYC : 1;; |  g/ l/ g& }  r
                                        volatile uint32_t PLL2RDYC : 1;( b. z5 c5 ~6 n6 H" v9 P
                                        volatile uint32_t PLL3RDYC : 1;4 K! A1 [, Q1 |  y8 E
                                        volatile uint32_t CSSC : 1;9 [; j: W+ b1 F
                                        volatile uint32_t RESERVED2 : 8;  d/ U" Q+ \3 w8 b
                                }Bit;
) u' a4 c1 k8 i) T) a% ^9 e7 q' X                        }CIR;4 X) |& y- B3 u* U2 W
                5 ?) n4 E2 U3 O( c9 m! S. n6 a
                        volatile union
$ H1 s; Y. m. O: W' Z$ T3 f                        {
" y8 V* N. F- ~& t( M' |9 ~                                volatile uint32_t Value;
3 h# W. r3 Z5 s  t                        
& D2 v# m) }3 @! u                                volatile struct' F- N( t" d/ p* h! d6 A
                                {9 F" V" B6 {% k7 Y9 V6 a8 ~
                                        volatile uint16_t AFIORST : 1;
$ z: C# g  f& d- A5 p                                        volatile uint16_t RESERVED1 : 1;
8 t9 Y% p) F" q$ e: C; R                                        volatile uint16_t IOPARST : 1;1 ]3 L2 i8 S. V. L  r! A
                                        volatile uint16_t IOPBRST : 1;4 I8 K$ i# i0 q- G9 Y" A4 o, n2 C
                                        volatile uint16_t IOPCRST : 1;
2 @0 ~' Q& C0 {  H" V                                        volatile uint16_t IOPDRST : 1;
6 Z# {4 `2 e" o9 f) `+ ]                                        volatile uint16_t IOPERST : 1;3 A: \1 N. r2 r! G
                                        volatile uint16_t IOPFRST : 1;
9 H: o- G  u3 D: {' a  w                                        volatile uint16_t IOPGRST : 1;
1 g  L1 h2 X; n- j# U1 H                                        volatile uint16_t ADC1RST : 1;3 d* K. Q  T$ w3 S% N$ J! C! L/ X
                                        volatile uint16_t ADC2RST : 1;7 K* k* k3 P2 q3 C
                                        volatile uint16_t TIM1RST : 1;
2 f4 p* e6 K8 h7 t& Y  ?                                        volatile uint16_t SPI1RST : 1;
- X& C" n" k  N9 x- m+ N                                        volatile uint16_t TIM8RST : 1;! a# N) l( X: M2 W- h
                                        volatile uint16_t USART1RST : 1;
, X2 f4 m  h7 l' ]* g% Z  c                                        volatile uint16_t ADC3RST : 1;
7 J: B. ?& F6 [6 {( z" N                                        volatile uint16_t RESERVED2 : 16;9 d# F( N3 m- z9 }: Q
                                }Bit;
2 F, ]* t( R7 z0 G# k8 |+ w4 y& f' k                        }APB2RSTR;/ {7 i( L, g* L, |9 z/ f: T  D
               
$ K) p% D3 R. E* o                        volatile union# [& t# S( Z0 G8 \
                        {
9 X4 v- u& \0 L: P' a. {                                volatile uint32_t Value;
' m9 w) a# ^5 |6 Y  k. l% x                        4 E( O" N; [: f$ R* s; U0 p) v
                                volatile struct
4 Z- B$ P' j% k                                {2 V: P/ i- M- u' A9 O
                                        volatile uint32_t TIM2RST : 1;3 ]6 V7 N) w. I7 g, D7 k8 R5 v3 x
                                        volatile uint32_t TIM3RST : 1;' d* c5 M( \2 k4 p- g* t
                                        volatile uint32_t TIM4RST : 1;
2 o8 \( @6 C9 \+ B2 g* p  R) z                                        volatile uint32_t TIM5RST : 1;! x# R8 F+ k; P( E% Y, B( |& a
                                        volatile uint32_t TIM6RST : 1;& E: ~* y! b  B. [
                                        volatile uint32_t TIM7RST : 1;" u8 P4 p# l  n) ~5 o1 l9 n& Q
                                        volatile uint32_t RESERVED1 : 2;' g) w& f3 b( g( ^+ F7 [# X
                                        volatile uint32_t RESERVED2 : 3;
# j$ K/ P8 Y+ P# F; o* N                                        volatile uint32_t WWDGRST : 1;0 ~1 ~$ U& `- [1 M) _& N$ I0 W3 J
                                        volatile uint32_t RESERVED3 : 2;' T0 k; C' A5 W+ e  O
                                        volatile uint32_t SPI2RST : 1;
! J+ V6 ]3 j: S& @                                        volatile uint32_t SPI3RST : 1;; O: S  u! U  T! i6 ~5 ~3 l* ]
                                        volatile uint32_t RESERVED4 : 1;2 e7 p- t, `7 a/ B2 [
                                        volatile uint32_t USART2RST : 1;
% O6 t. L, L6 `                                        volatile uint32_t USART3RST : 1;2 l9 i- v9 e: s
                                        volatile uint32_t USART4RST : 1;
& I; q6 c+ x; m* A9 A  t                                        volatile uint32_t USART5RST : 1;
7 a/ Y3 o' y! S9 ?+ t3 z1 j                                        volatile uint32_t I2C1RST : 1;$ k0 f; I3 k. V
                                        volatile uint32_t I2C2RST : 1;, v0 \5 P$ o7 J) J* ~6 I5 P
                                        volatile uint32_t USBRST : 1;
' t- p3 \: m- O& G( I7 R3 m0 L                                        volatile uint32_t RESERVED5 : 1;* Y" E9 C/ V2 ^" J# w8 l. N; h9 _
                                        volatile uint32_t CANRST : 1;# n; ^% e) q( |, ]
                                        volatile uint32_t RESERVED6 : 1;, V6 \' A+ R) }/ U8 F/ C
                                        volatile uint32_t BKPRST : 1;' {+ z* S9 G' X* N, T, K
                                        volatile uint32_t PWRRST : 1;, F  z6 ]1 }$ V) U2 Y) B0 m+ p
                                        volatile uint32_t DACRST : 1;
& d9 I7 s5 i5 }2 t- X# s                                        volatile uint32_t RESERVED7 : 2;
2 x7 W2 P) W& f4 U8 X8 O& Q/ y                                }Bit;
) T7 G5 _% @! q                        }APB1RSTR;3 S' K3 ^* e! S' g% T
                0 I' Z& G: O' R+ ?2 c5 z; Z
                        volatile union$ m$ A; R! Y% U6 w5 m1 d
                        {
3 G3 A! X/ ?0 F7 K; Z4 b                                volatile uint32_t Value;/ a1 M* b2 F& t- P( @: b% L$ M1 \
                        2 ^1 }( @& ^$ U; ?$ ]1 ?" X
                                volatile struct
- `4 C* p$ X6 ]* }7 o. _                                {. J- E5 ~. n, P4 ], k6 z5 H+ @
                                        volatile uint16_t DMA1EN : 1;  F% z1 {* F6 M1 g( v) `. s" h% T
                                        volatile uint16_t DMA2EN : 1;- M% x# ^9 u9 }2 S" Q2 [
                                        volatile uint16_t SRAMEN : 1;
; X0 J9 ?# Y( s: ?                                        volatile uint16_t RESERVED1 : 1;
% }3 ]0 e4 F2 C1 `6 C3 H2 U                                        volatile uint16_t FLITFEN : 1;8 ^0 X$ A' u; h2 }# a5 P( Q
                                        volatile uint16_t RESERVED2 : 1;
  F/ ^' q: L/ T$ w$ |                                        volatile uint16_t CRCEN : 1;: h4 f+ r+ j3 c2 a0 I- h
                                        volatile uint16_t RESERVED3 : 1;
( ~# M3 R$ L2 k6 ?& V8 v                                        volatile uint16_t FSMCEN : 1;$ T" m* }0 n& f9 _" ~/ r, A
                                        volatile uint16_t RESERVED4 : 1;
' z) o2 Y! @! Q$ q1 I                                        volatile uint16_t SDIOEN : 1;
9 R7 q9 c" [2 e5 _! f# ]                                        volatile uint16_t RESERVED5 : 5;
! r( P* M5 J* U) L! C! B8 L                                        volatile uint16_t RESERVED6 : 16;
( [0 [( X& E5 M                                }Bit;
: h/ h$ \" n8 _) U                        }AHBENR;9 D5 T5 a' Y5 v  }0 J% i& B! H6 r* F7 i
                # h! a9 p* K0 i8 j0 V
                        volatile union
; V9 v! x) }: v  \: I7 F7 B                        {
  Z7 Y% n/ }) t3 x2 D                                volatile uint32_t Value;$ P0 B0 f- j, B3 m% V$ h4 H
                        
% \" j) s- i9 X# P- J  m1 R9 d                                volatile struct: m; Y  |! g3 o
                                {
" A3 \) d8 r) _/ P6 |                                        volatile uint16_t AFIOEN : 1;
& d, S9 @' w/ f                                        volatile uint16_t RESERVED1 : 1;3 e+ p" G  e( K
                                        volatile uint16_t IOPAEN : 1;: K% L" G6 n5 x: a
                                        volatile uint16_t IOPBEN : 1;' I5 P7 r2 m+ J
                                        volatile uint16_t IOPCEN : 1;: c. D: d& q7 U
                                        volatile uint16_t IOPDEN : 1;
. |% f% f$ y* j                                        volatile uint16_t IOPEEN : 1;
. |8 A# V5 X- S5 C9 {4 \                                        volatile uint16_t IOPFEN : 1;
5 B3 y4 P! v, s9 f3 G, Q( p& G                                        volatile uint16_t IOPGEN : 1;0 a& E  y8 d0 J& S0 w/ y- Q" }
                                        volatile uint16_t ADC1EN : 1;6 V  A7 d7 |1 A. \
                                        volatile uint16_t ADC2EN : 1;) s8 i/ {0 R1 ^2 |  n/ o$ ?) p
                                        volatile uint16_t TIM1EN : 1;
8 F, H8 m, T1 o. N$ _0 o+ L                                        volatile uint16_t SPI1EN : 1;$ P- ~; ?" Y9 @( h
                                        volatile uint16_t TIM8EN : 1;7 T2 ~3 N) `+ z. q) `- o
                                        volatile uint16_t USART1EN : 1;
# G5 ]( g0 V$ e/ _3 k                                        volatile uint16_t ADC3EN : 1;
. R$ d+ J2 x, l; v% k  k. I                                        volatile uint16_t RESERVED2 : 16;1 V- z' y. h" ?% ^  U6 k4 ?0 z! ]3 m
                                }Bit;
  X* U1 C4 E( F3 h                        }APB2ENR;
  V% b% J- ?, Q2 c! e" H+ d               
( M6 h, V  W3 V& O: [                        volatile union, p' d' q: |6 M% n8 [( X& F; D
                        {
3 t1 e3 L/ [4 J; y5 F5 |                                volatile uint32_t Value;: k* V( ~0 P4 s+ U4 p$ D: ?
                        $ r# g% y9 h9 S/ U; ~/ N: P
                                volatile struct8 U0 G7 [  F! f) E" U6 D3 a$ O
                                {$ h* p& U( U6 T# S5 b4 c
                                        volatile uint32_t TIM2EN : 1;
& A% v! U& S0 c% P+ E! E                                        volatile uint32_t TIM3EN : 1;: \- z/ t7 k2 ~: k
                                        volatile uint32_t TIM4EN : 1;
) x+ @8 A. I0 L2 q" K% D  l                                        volatile uint32_t TIM5EN : 1;% V1 w8 D0 i+ ]8 K& z& P
                                        volatile uint32_t TIM6EN : 1;
+ z0 l+ u; Z: O9 m1 p) j+ g1 P1 ?                                        volatile uint32_t TIM7EN : 1;# Q% c# H+ _' l, O% M, b; Z, v, }/ c. S
                                        volatile uint32_t RESERVED1 : 2;
5 K$ x; p; ?0 z0 ^: U                                        volatile uint32_t RESERVED2 : 3;
  g9 d1 N3 Y$ i8 B                                        volatile uint32_t WWDGEN : 1;
2 ~  K, N& c, }+ ^                                        volatile uint32_t RESERVED3 : 2;
: e# L# `. E# }' K5 u! r1 z+ n. ?' c                                        volatile uint32_t SPI2EN : 1;' Q! v# {% `9 Y
                                        volatile uint32_t SPI3EN : 1;" l3 ?" Z0 X8 c
                                        volatile uint32_t RESERVED4 : 1;' m! O; `1 e8 Z" }. t1 {6 A9 O; \
                                        volatile uint32_t USART2EN : 1;: H0 Z, J  e1 L; P5 a: {
                                        volatile uint32_t USART3EN : 1;4 {+ {' W0 Z3 z  t2 |
                                        volatile uint32_t USART4EN : 1;
) h, T0 L& K# f, T4 z+ n2 Z9 g                                        volatile uint32_t USART5EN : 1;
/ d) _" Q! i) @: H( ^                                        volatile uint32_t I2C1EN : 1;
  R: `) c9 E; x- w                                        volatile uint32_t I2C2EN : 1;
4 I0 C' Z; v, Q1 S                                        volatile uint32_t USBEN : 1;
5 a0 W& x; T7 v3 p& I  L                                        volatile uint32_t RESERVED5 : 1;' b1 ~( W0 [" M( ^( C
                                        volatile uint32_t CANEN : 1;
6 E$ x1 ?6 J6 [* }$ v# W5 ?  b/ N1 E5 e                                        volatile uint32_t RESERVED6 : 1;2 A5 F( r: }/ Y8 w' I( i' Y
                                        volatile uint32_t BKPEN : 1;
+ G& a% c9 h4 ?: x: J; W" e                                        volatile uint32_t PWREN : 1;( D9 y8 `- j, A) M! D, Q9 v/ c
                                        volatile uint32_t DACEN : 1;
9 D# r  N0 t. @6 o                                        volatile uint32_t RESERVED7 : 2;
$ j" B3 [' k: `: p; r/ w7 d                                }Bit;& s+ `" z; ]: O) I: e0 W, e
                        }APB1ENR;3 f# v% |3 N8 D6 \( m* d5 ]9 N
                $ h8 A2 p8 R( K7 b9 p6 u+ U! J
                        volatile union5 ?" u" m( r0 P3 n5 p; B& ]6 O1 h
                        {+ W# p) o+ W  Q
                                volatile uint32_t Value;
8 j" r2 J% S; b$ H                        ) m0 N; p9 h& q+ k- Q
                                volatile struct
, h3 D* s/ g" l* w4 ?                                {& ]4 V8 O  h5 X1 ]- R# q: `1 d" {6 A
                                        volatile uint32_t LSEON : 1;
, y: M& b* i, T; m' }; n9 G                                        volatile const uint32_t LSERDY : 1;
0 w# ?. P, N7 ^! Q                                        volatile uint32_t LSEBYP : 1;) n3 W9 ~, c  P7 i3 D
                                        volatile uint32_t RESERVED1 : 5;
1 g$ D8 R( S( p4 Y0 o                                        volatile uint32_t RTCSEL : 2;4 p3 J/ b4 g: M6 e
                                        volatile uint32_t RESERVED2 : 5;
9 d, g. L7 `, q                                        volatile uint32_t RTCEN : 1;! B, p) u% y& B. H4 p" m2 {, Q
                                        volatile uint32_t BDRST : 1;* {% N4 p2 `% t. e; l4 p
                                        volatile uint32_t RESERVED3 : 7;
1 @- ~) t" g, ]; V, S4 I                                        volatile uint32_t RESERVED4 : 8;
9 O. p( X: i. ~                                }Bit;
+ b) A( ~# K$ R8 _4 d2 U" `                        }BDCR;2 \0 m  z1 n& k# }0 G- O9 ~
               
! u5 k2 b' m! O( e2 j. `/ I                        volatile union 0 B" c! L: n0 v" w! {
                        {( ?' ~  E5 d) S: N
                                volatile uint32_t Value;2 y) _5 b( _6 B( C) O( W
                        / ^  n5 q; h3 {4 S& k. N, ?8 ?
                                volatile struct) h" K2 s+ h2 F  M
                                {: e1 T( p& e8 X2 |0 R
                                        volatile uint32_t LSION : 1;" G+ [% J+ G5 R  L& F% n5 R! x
                                        volatile const uint32_t LSIRDY : 1;% f' O0 ~' [! \1 u6 J
                                        volatile uint32_t RESERVED1 : 6;
. v+ ?8 a( H1 b$ N                                        volatile uint32_t RESERVED2 : 8;
! ^& p2 I: a2 c0 C+ G                                        volatile uint32_t RESERVED3 : 8;
% v2 j  x- {$ O7 j  N7 w3 w+ S: a                                        volatile uint32_t RMVF : 1;) s1 D) f* [0 q+ I7 m
                                        volatile uint32_t RESERVED4 : 1;* ^6 F! {7 P; @5 G( y
                                        volatile uint32_t PINRSTF : 1;' n; q+ `+ m3 M1 z
                                        volatile uint32_t PORRSTF : 1;
  `7 y# c2 \3 Z                                        volatile uint32_t SFTRSTF : 1;- M- R: ^& u! ?5 x7 ^) e
                                        volatile uint32_t IWDGRSTF : 1;0 [% C, H5 w9 z- x' P/ g
                                        volatile uint32_t WWDGRSTF : 1;
, `. |3 B6 o. i3 o8 W/ A& ~                                        volatile uint32_t LPWRRSTF : 1;2 U1 {/ P1 c- Z: e8 g7 |
                                }Bit;
2 g; L- p$ i, b3 C  t- X                        }CSR;
' T4 t+ L# ^9 W( \                };* w* x2 n/ x- }( D$ U- r0 S
        ; l) Q- k2 f! N$ i2 Y
                enum RCC_PLL_MUL  f3 \: Y3 Q% K! b
                {: y$ H+ w& |$ W, j  L
                        RCC_PLL_MUL2  = 0b0000,  R- W- T7 @0 X8 J! m3 Z! \( T$ J
                        RCC_PLL_MUL3  = 0b0001,
8 j+ q' r& W0 b6 z                        RCC_PLL_MUL4  = 0b0010,
4 r0 _+ [. B+ u3 v% ~                        RCC_PLL_MUL5  = 0b0011,6 O& N5 Z1 C) `8 t4 ~  F6 {' J
                        RCC_PLL_MUL6  = 0b0100,
+ i5 y* Y* U* f. E! E                        RCC_PLL_MUL7  = 0b0101,7 f. B$ H. j1 J& W
                        RCC_PLL_MUL8  = 0b0110,
# T: u$ v& K( }) h1 V$ h- A                        RCC_PLL_MUL9  = 0b0111,; b( p3 p/ u7 C6 e+ _& b+ n* ?) ~
                        RCC_PLL_MUL10 = 0b1000,! x3 O! _  E  O6 U7 d2 p7 ?
                        RCC_PLL_MUL11 = 0b1001,
# h8 g" f, z3 E9 o                        RCC_PLL_MUL12 = 0b1010,
% e9 }4 u+ I- q" d                        RCC_PLL_MUL13 = 0b1011,
- T) ?- Z7 L7 |                        RCC_PLL_MUL14 = 0b1100,
9 E7 U9 b- H+ U                        RCC_PLL_MUL15 = 0b1101,/ m2 `+ ]- x6 H+ ^
                        RCC_PLL_MUL16 = 0b1110,
" W( R/ R, x! {* n8 }) ]                };/ b# Q3 B" `# l% _* K+ s5 i
               
' A. q# g/ x% L0 J+ r5 r( [                enum RCC_PLL_XTPRE
5 y* Z7 D9 C* ~$ V5 |                {, Z1 }) @) v% n/ n8 F  {
                        RCC_PLL_XTPRE_DIV1 = 0b0,9 U0 G$ v, H# L
                        RCC_PLL_XTPRE_DIV2 = 0b1,
- {- G3 J0 k; K5 Q                };6 L# [) @% m9 `  w/ i5 k/ f
                8 D  g$ @# p9 x) h( F* |
                enum RCC_PLL_SRC
5 n, n* g8 x& @4 Y8 ^                {, Y9 r5 y* z. u) ?
                        RCC_PLL_SRC_HSI_DIV2 = 0b0,
$ [, g  H- V" P                        RCC_PLL_SRC_HSE      = 0b1,
$ ~2 K. }  h; t  d                };
7 X3 e* l! R+ ?0 D& ^" A( l                7 ^6 B$ P2 a9 [2 c& C
                enum RCC_HPRE& V, `7 p4 [: {
                {$ p3 `/ N5 R" n/ {$ n
                        RCC_HPRE_DIV1   = 0b0000,$ ~2 A1 X6 p; r; a  H1 J. _0 T+ g
                        RCC_HPRE_DIV2   = 0b1000,* ^1 b6 H% Y% H4 s$ s6 Z
                        RCC_HPRE_DIV4   = 0b1001,9 W0 M6 n' k1 P% P, a% ~
                        RCC_HPRE_DIV8   = 0b1010,
; v& x! o  ?/ c1 f6 p: N" u; F                        RCC_HPRE_DIV16  = 0b1011,/ n5 o* e; o' J) n3 D; i% v) v
                        RCC_HPRE_DIV64  = 0b1100,
1 u2 M7 E) t/ y% u' ^3 a# Q% w                        RCC_HPRE_DIV128 = 0b1101,
( ?# v9 j( p* m- U* n6 a  X9 g                        RCC_HPRE_DIV256 = 0b1110,# b( q* e( H) ~( u4 x  [7 N+ x
                        RCC_HPRE_DIV512 = 0b1111,( S! i) x4 r- m9 t2 r
                };
$ s9 L8 ]4 J) M8 d6 H: @               
8 L7 V; e# P2 k9 n" @* {; u6 n                enum RCC_PPRE) ^9 w9 Z, y7 e/ I6 _: H/ f
                {6 t8 `* \9 |! i
                        RCC_PPRE_DIV1  = 0b000,0 W( J. O5 [( Z9 f: R
                        RCC_PPRE_DIV2  = 0b100,) X* {9 e* q9 [9 |+ N
                        RCC_PPRE_DIV4  = 0b101,0 {5 u" L) Y5 m+ o# d$ D! v
                        RCC_PPRE_DIV8  = 0b110,% f0 r, c9 e' B  b. I
                        RCC_PPRE_DIV16 = 0b111,6 ?2 M" u4 E) ]4 U8 R
                };& \) M7 ?2 H# }, y% ~5 E1 D3 ]
                ) M4 k/ z# h  o: ]6 _
                enum RCC_SW
% [0 W# {0 `  E5 \                {
  J4 {. h0 \! p  W- V- g8 M                        RCC_SW_HSI = 0b00,2 S" Y/ `! d4 U4 L3 u" O) ^
                        RCC_SW_HSE = 0b01,
; I4 q0 w, K' g( E+ {                        RCC_SW_PLL = 0b10,
+ ~4 k. y2 w1 o                };
& v6 S# b3 r% x! T1 G' M               
/ p) j! Q2 V5 n7 ]                class CRCC
  K1 {( i3 M% f9 U% d                {
4 N6 W. A4 O! o1 A, T2 F                public:/ S& o' O7 X+ A
                        //保存外部晶体频率 在EnableHSE方法中初始化 用于计算系统频率
( o1 m! N1 z# J                        static uint32_t HSE;
3 e8 N3 N0 I' V7 T                        
" R+ S5 Y- W; h! W& @9 P                        volatile struct RegisterRCC *pRegister = (volatile struct RegisterRCC *)(RCC_BASE);$ Q( k9 v% m- O% Z# A( O, g
                        1 H  ]8 B$ a' t; V
                        //开启外部高速时钟并等待时钟就绪,如果时钟不能就绪则一直等待& ^! |0 u( J$ w/ ]
                        //HSE:晶体频率 单位:Hz5 \. U; ?* S+ r/ D& |" e  n4 z
                        void EnableHSE(uint32_t HSE)& p, w5 }- y7 h/ f
                        {+ v" Y; |8 Y. r8 s1 \0 l
                                CRCC::HSE = HSE;
7 ?9 e' u7 P) O/ }! a1 i! H                                
6 i5 P, [; j' W                                this->pRegister->CR.Bit.HSEON = 1;
  H# _+ |& p3 ^  }. H                                while(!this->pRegister->CR.Bit.HSERDY);
/ [; O& D# Y/ E+ a                        }8 n4 H) E) e# w0 R! k. @
                        # F& X) u4 |3 f3 F
                        //设置PLL参数,必须在PLL关闭的状态下
; {" t! w' ?2 G, W- [; g1 `9 `                        void SetPLL(RCC_PLL_MUL MUL, RCC_PLL_XTPRE XTPRE, RCC_PLL_SRC SRC)& n" P# o0 X: G6 `) v5 b5 h
                        {
) s, A$ K. Y; O, R. l4 Z                                this->pRegister->CFGR.Bit.PLLMUL = MUL;
6 z; N5 Y% a) o: M                                this->pRegister->CFGR.Bit.PLLXTPRE = XTPRE;
% \2 o8 V% f2 D9 j                                this->pRegister->CFGR.Bit.PLLSRC = SRC;; X3 `1 E8 Z- W) q0 r" @
                        }
) `) m; X4 n# v6 Q5 N8 c( W& Y                        $ o2 |8 e& Y) C( b/ f' S, E
                        //开启PLL时钟并等待时钟就绪,如果时钟不能就绪则一直等待  L) o' h6 u; N% Y- q
                        void EnablePLL(void)
, V) P5 E5 v' d# D# I- O# @                        {' q1 i: r4 ?- X: a( \( V' j# N3 o
                                this->pRegister->CR.Bit.PLLON = 1;
8 ^& k1 t# j7 A/ r' ?                                while(!this->pRegister->CR.Bit.PLLRDY);& d8 M, w9 [* |, r$ \
                        }
5 f& a( c; j) [& \5 B                        ; s! M* \3 H! f0 }0 @
                        //切换系统时钟源并等待切换就绪,如果切换不能就绪则一直等待; O% q# c# p% y
                        void SetSysClkSource(RCC_SW SW)* Z: Z, \) X. K
                        {
6 h- M  `  X" a% T# ~0 e/ S                                this->pRegister->CFGR.Bit.SW = SW;
5 k$ K- l9 ]6 F& H' C! k                                while(this->pRegister->CFGR.Bit.SWS != SW);
: t5 o# i+ K; w* T+ \1 F+ N                        }- b7 h4 G- n4 X! v8 ]7 A
                        
; S, [7 _+ S& S5 s1 b/ U5 I                        //获取系统时钟频率 单位:Hz$ C4 Q$ `% D& k( C; n4 e
                        uint32_t GetSYSCLK(void)
4 e8 K8 r, B: X; L+ i# h  F/ c                        {
4 c2 A+ A" E: C$ O1 B( d9 g                                if(this->pRegister->CFGR.Bit.SWS == RCC_SW_HSI)
9 x& v  l5 \: T- k: b                                {
3 J1 {' W- m8 i1 U" M5 [                                        //系统时钟为HSI
% D7 W! E9 W+ g5 Y, n2 d                                        return 8000000;
7 o! T5 |  j# u7 }7 N& C; X, i! ^                                }3 f0 ~2 V; S) {* q; {$ k
                                else if(this->pRegister->CFGR.Bit.SWS == RCC_SW_HSE)
6 C# H. y" W! G* u                                {$ G/ h, S6 O. l3 }2 f
                                        //系统时钟为HSE
: }7 J9 [4 H3 U' D                                        return CRCC::HSE;
$ Y. v2 k5 L! N  D& C: x0 |; l                                }
  z+ M7 x: u" j& p                                else if(this->pRegister->CFGR.Bit.SWS == RCC_SW_PLL). x7 c7 _' ^" Z2 g4 t
                                {
! V8 n# |8 l1 M* D: {$ n                                        //系统时钟为PLL/ t8 }; x5 \% G3 X* V; X
                                        uint32_t SRC, XTPRE, MUL;* U7 Z* B* o! p( a! v3 L: i
                                        + P4 e& k0 K) {9 o
                                        if(this->pRegister->CFGR.Bit.PLLSRC == RCC_PLL_SRC_HSI_DIV2)
4 t0 Z/ f8 ?  f3 w                                        {
( T7 X" V7 @, W0 ~; \                                                //PPL输入时钟源为HSI/2
$ }) |+ ~5 @3 z5 ~0 U                                                SRC = 8000000;! \2 m* F1 U7 K2 [, j; f+ J
                                                XTPRE = 2;  _6 o0 g. O% w3 d1 ]* z
                                        }" L7 P9 |. Q' x" M, y3 f4 o* s: J
                                        else- l# K7 E1 W6 Y, j4 k
                                        {
) e: h" U0 ?% ~; I                                                //PLL输入时钟源为HSE! ^0 q7 J. B: r" b; u* Z) x( Z
                                                SRC = CRCC::HSE;
* D! H1 c/ W5 T, g                                                . E- W; A4 D1 b& E7 }: g+ A1 u
                                                if(this->pRegister->CFGR.Bit.PLLXTPRE == RCC_PLL_XTPRE_DIV1)
( _( F8 \( O1 a: D' @% {4 ]5 @# t                                                {
( f& |- ~3 s8 B2 g6 w, M                                                        //PLL输入时钟源为HSE/2, D( V& D8 g& J; F, y1 Z+ j9 D( i
                                                        XTPRE = 1;
4 x3 k: Z) H  {                                                }
6 p7 i, L$ }2 W7 W8 g1 G2 i                                                else
0 y# I) Y; C( `0 P; i9 N                                                {
  S+ H  Z& g( y8 j* k                                                        //PLL输入时钟源为HSE/2" [( m, B& t+ U/ G7 x6 d0 s
                                                        XTPRE = 2;, B) L, K' P, M) N" a( U) u, j
                                                }/ A. J; n% |9 {+ y
                                        }* S* W+ d4 R5 U+ P5 i
                                       
' r+ t# G/ o1 @                                        switch((uint32_t)this->pRegister->CFGR.Bit.PLLMUL)
1 D% ]# I( R2 Y8 U! e; t2 [                                        {9 k! P7 @' e$ `# G0 T5 O  w% k
                                                case RCC_PLL_MUL2: MUL = 2; break;
6 d) ?8 M0 r2 G( J6 L1 H                                                case RCC_PLL_MUL3: MUL = 3; break;+ S# @6 x  R( b5 S2 r) g3 u
                                                case RCC_PLL_MUL4: MUL = 4; break;
  x7 `2 F) f9 A6 I2 r                                                case RCC_PLL_MUL5: MUL = 5; break;
. W" }' N9 s- B1 E* _# m                                                case RCC_PLL_MUL6: MUL = 6; break;% H8 S* q/ t- r  _1 k6 z0 U8 r
                                                case RCC_PLL_MUL7: MUL = 7; break;
" B4 P4 p8 h6 w* k3 O" N# C' l                                                case RCC_PLL_MUL8: MUL = 8; break;
4 ~5 M/ t0 ~5 S7 t* ^2 e                                                case RCC_PLL_MUL9: MUL = 9; break;
. m9 e) x$ M1 P4 o4 Z* ^                                                case RCC_PLL_MUL10: MUL = 10; break;4 [0 _3 N! O! N2 \
                                                case RCC_PLL_MUL11: MUL = 11; break;, R& f" h5 G& t) @2 V7 x1 {4 w
                                                case RCC_PLL_MUL12: MUL = 12; break;1 D: m4 q* j& _. s
                                                case RCC_PLL_MUL13: MUL = 13; break;
6 I; t% |. q# p& G                                                case RCC_PLL_MUL14: MUL = 14; break;
) w) D: s6 ]) z) f9 `0 n( t$ m                                                case RCC_PLL_MUL15: MUL = 15; break;) [5 D5 I2 o/ J0 c) r  I
                                                case RCC_PLL_MUL16: MUL = 16; break;. v5 C2 a( z  |- g1 d7 b
                                                default: MUL = 16; break;
; A0 \' z* U" K' a9 n1 ~1 [                                        }0 J" y) I  b' \& U8 \) d
                                       
" O$ U8 i& z+ f! J                                        return SRC / XTPRE * MUL;
: D. z) }$ B  b# O1 E: |                                }2 s5 k' f* F0 A9 {
                                else2 W# M/ l9 S. d1 \, A
                                        return 8000000;
9 O9 A! o8 u; W& L                        }
. i. s- x- L  L. Q                        
6 l8 y$ M" d4 \                        //获取AHB总线频率 单位:Hz
1 t, }  y# ]$ g: E# w- g8 a                        uint32_t GetHCLK(void)
' F( v: [% g; X" v. Z" X9 B% x                        {
+ F# y9 u; b- {: ^                                uint32_t Prescaler;
9 F" o* m: R& K8 w- o  f                                
0 \* R( `# e$ Q8 `                                switch((uint32_t)this->pRegister->CFGR.Bit.HPRE)
7 s' V# o% N0 Q& ~; R( L                                {4 r! ?6 t6 W" \! T2 r
                                        case RCC_HPRE_DIV1: Prescaler = 1; break;! s( C* `. \2 ]" i$ H) [5 i
                                        case RCC_HPRE_DIV2: Prescaler = 2; break;
* Q+ V8 @; u; p0 ^3 [/ x3 q                                        case RCC_HPRE_DIV4: Prescaler = 4; break;( R* {& {0 U6 `% }
                                        case RCC_HPRE_DIV8: Prescaler = 8; break;
$ u' l) O) S! A                                        case RCC_HPRE_DIV16: Prescaler = 16; break;/ j) R) F/ s% F' n- H
                                        case RCC_HPRE_DIV64: Prescaler = 64; break;; [/ Q  W/ J* B2 K
                                        case RCC_HPRE_DIV128: Prescaler = 128; break;
' J7 n+ a& R4 G                                        case RCC_HPRE_DIV256: Prescaler = 256; break;
8 A4 Y2 }  m6 O& H- I                                        case RCC_HPRE_DIV512: Prescaler = 512; break;
! U& v2 \' d" X+ v                                        default: Prescaler = 1; break;% t, y; q+ W9 b) b% d7 h1 g+ N5 S
                                }9 }3 z3 n- Y' D
                                7 u, y' o$ Q* x% }5 S6 |' Q
                                return this->GetSYSCLK() / Prescaler;5 x$ k; S- T" Z. {
                        }. f" f4 M( k" K0 ?2 V" \& p
                        * u9 p, o' U* Y; ?+ b
                        //获取APB1总线频率 单位:Hz
. W0 n6 E, t& e1 z3 B" t) n( {                        uint32_t GetPCLK1(void)
. ]7 Q' x, H& W' J                        {
$ X1 [! P- q) y. K9 G  }                                uint32_t Prescaler;3 O2 d" r( F: V
                                * h! h$ |5 F6 |: m3 |- \
                                switch((uint32_t)this->pRegister->CFGR.Bit.PPRE1)7 q) V) t; d- W1 b0 r, Z
                                {% `: M9 M& p' [0 G$ `, `7 x8 @1 }: _
                                        case RCC_PPRE_DIV1:        Prescaler = 1; break;! N. z- `! h% \# |( C3 l; R5 C1 a
                                        case RCC_PPRE_DIV2:        Prescaler = 2; break;" W* P( ^" u  }
                                        case RCC_PPRE_DIV4: Prescaler = 4; break;
" F3 J5 b1 \. `' D  O- {0 @                                        case RCC_PPRE_DIV8: Prescaler = 8; break;$ v: ]0 j& i9 J* e& D% t
                                        case RCC_PPRE_DIV16: Prescaler = 16; break;5 {7 |0 ?- e) P9 j" [
                                        default: Prescaler = 1; break;
, p3 N# r/ P' J) o8 C9 h9 d                                }
- c; X8 v: P9 }( l- C( O) H3 l. |- U                                
0 F) d6 g. p5 {, z" r" Q                                return this->GetHCLK() / Prescaler;) x4 A0 D" g8 }. U- V) k1 T2 @4 G
                        }" e7 S/ M4 j, }+ R
                        
9 L$ Y5 ?) W# R. P$ L! v: M; i                        //获取APB2总线频率 单位:Hz
5 o! ]7 j0 k8 a                        uint32_t GetPCLK2(void)" g* u7 N) d9 p) ^" x! y* }
                        {# X* I/ \$ B: S
                                uint32_t Prescaler;
6 J' V) W1 u6 n% E                                
+ }+ ~; S  h) R. C                                switch((uint32_t)this->pRegister->CFGR.Bit.PPRE2)& U9 P) \9 G  H- c5 f
                                {" S# Q( L, |( O; m# }  t
                                        case RCC_PPRE_DIV1: Prescaler = 1; break;
7 m: A7 L2 o7 m* h* p                                        case RCC_PPRE_DIV2: Prescaler = 2; break;
  I6 o3 L. D1 O# F1 {8 l; x                                        case RCC_PPRE_DIV4: Prescaler = 4; break;
3 b! f1 n4 e. I" M, d* x" i                                        case RCC_PPRE_DIV8: Prescaler = 8; break;
- ~# Q* l1 R9 F; M0 L* m                                        case RCC_PPRE_DIV16: Prescaler = 16; break;
3 k0 ?7 T6 Y% c& z1 H                                        default: Prescaler = 1; break;
, f& U* X' ]" C9 x# ^6 s' Y                                }
! k. c. I8 E# w8 S, j                                
4 ^. u" Y( ?+ P9 x# ~' ]* C                                return this->GetHCLK() / Prescaler;3 ?9 n6 x% G  ]$ |/ o9 X* X2 y5 ?
                        }9 d9 y0 U3 v- P/ r: D8 Y  A
                };. o  z! r" A3 ?+ r" t  K$ n
                  ~0 `$ j* s1 ^  Q! A
                uint32_t CRCC::HSE = 0;
% i# ?3 Z& `' N  w1 }( Q        }+ E" H+ G; }9 R" T' k  E
}" N* F, h2 U$ u& g! F1 v7 w

( o; V' W* q6 l$ \2 J8 S2 V5 d#endif // !RCC_HPP_
  ^3 B# |7 b, ^1 d8 y' e
7 g3 g8 E2 {# r7 R+ N; J* O% r这是对RCC的封装,其实对寄存器的封装只是C++写单片机的小问题.还有几个问题要解决.. p7 P2 G" }1 |  t
第一:如何把中断连接到任何对象的方法,这个问题本质就是如何利用指针调用对象方法,实现后可以更好的发挥面向对象的多态思路,实现一些高灵活度的编程.我用模板类实现了一个类似C#中的委托对象,然后利用这个对象还可以实现类似C#中的事件,完成消息的多播.当然这是需要付出代价的,这个模板类要用到虚函数表,经过实测这个消耗是可以接受的,多1us左右吧.这个模板类的实现具体可以用Bing国际版搜索FastDelegate.9 F. s5 }2 Q# f- h' q
第二:如何new和delete,这个必须通过OS实现.我使用FreeRTOS,然后全局重载new和delete运算符到pvPortMalloc和pvPortFree.不过能定义声明的对象尽量定义声明,不要频繁new和delete因为FreeRTOS的内存管理还是很弱鸡的.实现的目的只是为了提高程序的灵活度.让一些代码可以更快地适配一些硬件.我通常都是只new不delete
2 ]. P3 ^& @& {5 g5 k* t' S9 @& g8 l2 P- F0 g0 D1 k
为了更好更快地更换MCU,应该定义一个HAL层,里面全是虚基类,抽象类似但又不同的硬件.然后顶层基于HAL开发,底层继承HAL的虚基类并做具体实现.不过虚基类又牵涉虚函数表,会有性能损失.在对性能要求高的地方还是针对不同的硬件进行直接控制.
8 F. T8 V1 [9 H) u/ @' h, `) H% {8 A9 i. F( W
为了更好的进行C++编程,我用gcc编译器.使用这个编译器时一定要注意,编译优化可能导致运行结果不正确,我通常是用O2或Os,一些特殊的函数还需要标记为O0.开发环境是Visual Studio 2019(个人版 免费) + VisualGDB(我买了正版).VisualGDB V5.5R2这个版本真是超级好用,自动完成,代码着色,代码格式化都是杠杠的.这个环境中在线仿真是ST-Link 2 + OpenOCD,可以设置端点,可以实时读取寄存器值,等等.
% I& f1 ^' {: W9 K9 Z3 c2 [2 l- e& F3 J2 e: @
总之,C++配上这个开发环境生产力大大提高,代码的可复用性也大大提高.另外,我的项目已经投产了.
1 l5 Q+ s" B; I. `) @
# o. _& ?7 v6 u1 ]6 M9 j- _9 ~3 y% o6 L$ s8 l
! y3 X' a. X6 r4 g
奔跑的蜗牛321 回答时间:2021-5-18 16:55:06
freemancn 发表于 2020-11-19 21:43( W% d6 i+ B9 s& c
分享一个
8 ^( O2 f5 I0 s8 l# w( [
1 y9 @& l7 a/ z3 E( X' U  L0 R. U#ifndef RCC_HPP_

2 x; M/ ]1 h1 \' S3 I. T还更新吗,能出一期环境搭建的教程吗,配一个Demo工程7 K# ]& X' b/ k1 p9 n
123

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版