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

STM32F4 C++ 封装库 之 GPIO

[复制链接]
XinLiYF 发布时间:2018-4-1 14:47
本帖最后由 XinLiYF 于 2018-4-4 20:23 编辑   g3 \* F) w( E1 M4 o

7 p4 @# }. r. i! c( i& @
STM32F4 C++ 封装库 之 GPIO
( ]  o! `3 V, z/ F3 C" {

* M* o) J$ [7 M: p6 U       一直有一个想法就是用 C++ 去做 STM32 的开发,但是很少有这方面的资料。经过一段时间的思考,决定在官方的 ll 库的基础上做一层 C++ 的简单封装。因为官方的库基本实现了全系列的 MCU 都是相同的 API 接口,所以 C++ 封装后的库也有很好的移植性。原理性的东西就不讲理了,直接上代码。5 S- Q2 x. c& }# M! L

* {2 G  @( f6 S, ?: W. N" q* kstm32f4xx_xgpio.h 文件  H; }6 |  \& O
  1. /**8 R' ~6 Q4 `/ K- c
  2.   ******************************************************************************* W, G- }. U& |5 P2 Q1 y
  3.   * \file    stm32f4xx_xgpio.h" H% h/ a/ M$ K0 z' c& M& h
  4.   * \author  XinLi
    : I+ F8 M% w2 ?  \
  5.   * \version v1.0' U9 E5 f% u# u7 R, c
  6.   * \date    20-March-20184 [5 m9 B& O: ]8 R$ Z1 M- I/ @  k
  7.   * \brief   Header file for general purpose I/O module.* n/ q, ?# P, t% O
  8.   ******************************************************************************3 ^" _2 @' |1 P# [
  9.   * \attention
    ( k5 P) }2 B; O# N
  10.   *5 _& a" l; d' |$ x4 f
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>
    6 a5 ]# M) c4 G
  12.   *5 ~3 ~. t8 ^+ f9 n: t( Y. `
  13.   * This program is free software: you can redistribute it and/or modify
    0 C& H% I" ~: w& `  ?4 U7 X" l
  14.   * it under the terms of the GNU General Public License as published by
    & R. c# W( Q. `: Y$ T
  15.   * the Free Software Foundation, either version 3 of the License, or$ k0 d1 x0 ~* s  q, L5 r
  16.   * (at your option) any later version.
    2 h7 b7 Z8 J' Y- C- J
  17.   *
    + B1 s+ ]( f. U  [' w' S
  18.   * This program is distributed in the hope that it will be useful,
    3 f6 o* u/ _+ G
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    . }% P2 M6 i8 q4 {
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the, |" p! }' `  z3 p
  21.   * GNU General Public License for more details.
    / _* s' K6 R* n  J: E3 L
  22.   *
      `4 c/ ~6 w: L% }/ F
  23.   * You should have received a copy of the GNU General Public License
    4 y2 ]4 _/ l5 v
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.1 V' Q6 w: S& B
  25.   *
    & C( j2 v. u& K
  26.   ******************************************************************************
    ' R4 K( J/ w3 P% S
  27.   */3 z% }$ @& z" y& z

  28. 0 y' q& d2 H5 y* V) A0 r$ V
  29. #ifndef STM32F4XX_XGPIO_H5 [, q4 G2 D7 a: L! l+ T' d, \/ U
  30. #define STM32F4XX_XGPIO_H
    . B/ A( R  y7 Y( @
  31. % v& J* }- X* p, J
  32. #include <stdint.h>! ]# H, a, B0 V, R& n! D4 b
  33. #include "stm32f4xx_ll_gpio.h"6 d6 x1 s4 @( k  p- O0 y. Z
  34. ( d! a' O2 A* b
  35. /*! General purpose I/O module. */3 f! S3 R% c7 P7 L
  36. class XGpio7 w0 s8 m8 ?2 g) r' k1 [, f  m
  37. {* h* }5 j- N* ~3 Z
  38. public:
    7 g5 E& j8 o- e, m9 g" r
  39.   /*! Enumerate GPIO ports. */
    % O5 v" ?% ]1 ^$ m7 V: l7 F( G" H
  40.   enum GpioPort, `' D5 ^% j8 n7 P$ H
  41.   {% k4 y0 m: x3 x1 L) \3 L7 {
  42.     PortA = (uint32_t)GPIOA, /*!< GPIO port A. */- N3 T, i$ V% M# A( n* m
  43.     PortB = (uint32_t)GPIOB, /*!< GPIO port B. */
    # Q8 H9 E, `) H
  44.     PortC = (uint32_t)GPIOC, /*!< GPIO port C. */0 _' s: K4 ]. ]9 B: b1 X4 E  C
  45.   #ifdef GPIOD( `5 Y; h6 B" R# t
  46.     PortD = (uint32_t)GPIOD, /*!< GPIO port D. */0 Y( N# D' t- `
  47.   #endif // GPIOD& [4 H- u& Z: Y6 ~
  48.   #ifdef GPIOE
    5 r: e. p8 x1 }6 M
  49.     PortE = (uint32_t)GPIOE, /*!< GPIO port E. */
    " x: r, j+ W) {6 X8 `: f
  50.   #endif // GPIOE8 ]. b" N4 {! l( Q' T% ]7 ?4 ]8 f
  51.   #ifdef GPIOF
    8 s  K& e6 Z, Z0 [* D: X
  52.     PortF = (uint32_t)GPIOF, /*!< GPIO port F. */* |& B! P  ?; E9 G* a- w+ \
  53.   #endif // GPIOF
    * K, l, U8 x6 E$ P
  54.   #ifdef GPIOG: @- ?7 z4 B. r& x3 N0 x
  55.     PortG = (uint32_t)GPIOG, /*!< GPIO port G. */+ k2 c' W5 M/ J6 m) b$ s3 y
  56.   #endif // GPIOG  a' e: B. \1 i; X
  57.   #ifdef GPIOH
    ( ~! a# w/ {, {  [- O. A
  58.     PortH = (uint32_t)GPIOH, /*!< GPIO port H. */. i! O& U( W# ]& J) `
  59.   #endif // GPIOH. L6 @; {, T3 ]5 L
  60.   #ifdef GPIOI5 g: J+ A7 b, q3 w, g
  61.     PortI = (uint32_t)GPIOI, /*!< GPIO port I. *// W% O" X) T( H, R) s8 O5 A: V9 x' ^
  62.   #endif // GPIOI' T" N# _$ I8 W6 K9 f
  63.   #ifdef GPIOJ
    8 `$ M' S; S. A$ P) P0 H4 ]
  64.     PortJ = (uint32_t)GPIOJ, /*!< GPIO port J. */
    8 K* {+ Z# C* g4 _! @
  65.   #endif // GPIOJ
    1 f8 c# r- ]- r5 I' x1 J
  66.   #ifdef GPIOK* w$ m% E! \; Y! D, F# F
  67.     PortK = (uint32_t)GPIOK, /*!< GPIO port K. */( }/ M  Z3 u4 }0 X1 v, V
  68.   #endif // GPIOK/ R1 D  W/ ^  n( M. E" `' d6 e
  69.   };+ y: g6 D/ u# W2 O" E7 Q0 L
  70.   
    # M) F0 t2 ^& i# s# h
  71.   /*! Enumeration of GPIO pins. */
    % G5 F, @8 w' w9 ~
  72.   enum GpioPin% x+ j3 }4 E; ^* j7 e
  73.   {
    1 n. e& [: _3 y: M  G
  74.     Pin0  = LL_GPIO_PIN_0,  /*!< GPIO pin 0. */
    4 G( a& `& {4 a- g- ?0 D! Q
  75.     Pin1  = LL_GPIO_PIN_1,  /*!< GPIO pin 1. */
    ) h  n' I2 i" v  N
  76.     Pin2  = LL_GPIO_PIN_2,  /*!< GPIO pin 2. */
    9 A' o5 @0 w0 {) h# K8 [- z2 Q
  77.     Pin3  = LL_GPIO_PIN_3,  /*!< GPIO pin 3. */
    7 c) R- }% I3 e' F' e
  78.     Pin4  = LL_GPIO_PIN_4,  /*!< GPIO pin 4. */. r; p) s" E# u1 U
  79.     Pin5  = LL_GPIO_PIN_5,  /*!< GPIO pin 5. */
    4 a2 K! F6 O" A  M& U$ L$ h* q. V
  80.     Pin6  = LL_GPIO_PIN_6,  /*!< GPIO pin 6. */! i/ j! [3 D9 b9 q( A$ |: `5 s+ J$ i
  81.     Pin7  = LL_GPIO_PIN_7,  /*!< GPIO pin 7. */
    % B1 P) J# @+ \8 |4 D3 l5 v
  82.     Pin8  = LL_GPIO_PIN_8,  /*!< GPIO pin 8. */
      c9 c8 @2 U8 n
  83.     Pin9  = LL_GPIO_PIN_9,  /*!< GPIO pin 9. */
    # z6 i& |7 k, k! N, r
  84.     Pin10 = LL_GPIO_PIN_10, /*!< GPIO pin 10. */5 T+ S& g+ ]/ C# a/ ^
  85.     Pin11 = LL_GPIO_PIN_11, /*!< GPIO pin 11. */
    9 H0 b% k( f$ w* P* z2 V4 p2 c
  86.     Pin12 = LL_GPIO_PIN_12, /*!< GPIO pin 12. */1 l, }; n: r6 D$ i2 Y0 j
  87.     Pin13 = LL_GPIO_PIN_13, /*!< GPIO pin 13. */
    3 h* F' x' Z8 O9 {! Y9 ]
  88.     Pin14 = LL_GPIO_PIN_14, /*!< GPIO pin 14. */1 L' t9 U5 e7 b0 e) O* `
  89.     Pin15 = LL_GPIO_PIN_15, /*!< GPIO pin 15. *// t+ F# f) {1 s" h5 Z9 ?
  90.   };
    ' M# ]3 t8 `, \* J" q4 N
  91.   
    % ?: a3 y  q6 W( w( Z3 y- T
  92.   /*! Enumeration of GPIO modes. */
    1 U8 z8 D; Y. W' w8 s) ]1 `
  93.   enum GpioMode5 S7 }1 I5 m; \. ?. }) f' O
  94.   {
    # j5 i4 L' {. Q3 s8 d/ Z
  95.     ModeInput     = LL_GPIO_MODE_INPUT,     /*!< GPIO input mode. */
    6 O& G5 V% k* r3 G
  96.     ModeOutput    = LL_GPIO_MODE_OUTPUT,    /*!< GPIO output mode. */
    * q) s0 _6 y, _' v6 H  o3 B
  97.     ModeAlternate = LL_GPIO_MODE_ALTERNATE, /*!< GPIO alternate function mode. */: i5 }' P9 |# H
  98.     ModeAnalog    = LL_GPIO_MODE_ANALOG,    /*!< GPIO analog mode. */
    % |" l; R1 ~. B9 V( ^, _
  99.   };# P0 k4 ?$ d0 K2 ^- r
  100.   . B! D% n# v' F& f& L
  101.   /*! Enumeration of GPIO output types. */
    4 h! m$ }2 t, V! p% x1 ?2 I+ a* @
  102.   enum GpioOutput; E5 a$ q% ^( [( R/ k- x' N
  103.   {9 u4 P7 D4 `' t, e( \
  104.     OutputPushPull  = LL_GPIO_OUTPUT_PUSHPULL,  /*!< GPIO push-pull output. */
    , l; ~5 @- @: N5 d$ |$ |! i! q
  105.     OutputOpenDrain = LL_GPIO_OUTPUT_OPENDRAIN, /*!< GPIO open-drain output. */- t+ l# K; F+ |+ h
  106.   };
    7 g4 v) @' S) o8 b, o" x
  107.   
    & a8 X" |' i& \) |; a8 p
  108.   /*! Enumeration of GPIO output speeds. */" M. i$ l0 x, L
  109.   enum GpioSpeed6 E( ~& e7 |  o6 L2 j6 e/ y8 C4 n
  110.   {4 e7 ^, i- B: w$ R3 Z
  111.     SpeedLow      = LL_GPIO_SPEED_FREQ_LOW,       /*!< GPIO low output speed. */
    * x& z" `4 e9 K7 _3 U& c
  112.     SpeedMedium   = LL_GPIO_SPEED_FREQ_MEDIUM,    /*!< GPIO medium output speed. */
    % t- X3 w( n1 k1 }. f6 q& i
  113.     SpeedHigh     = LL_GPIO_SPEED_FREQ_HIGH,      /*!< GPIO high output speed. */$ b. W0 X& r1 E1 ]4 v8 F$ u  H
  114.     SpeedVeryHigh = LL_GPIO_SPEED_FREQ_VERY_HIGH, /*!< GPIO very high output speed. */! t9 F' \! i" P$ \7 g  t
  115.   };
    . j5 q1 W  O8 M- r
  116.   ( T# q+ W- l# H# ?7 _
  117.   /*! Enumeration of GPIO pull-up/pull-down. */
    0 Q3 t  N( f! r# ]& e
  118.   enum GpioPull( r1 {; X; }! m3 r- _
  119.   {" S! f" F0 k7 z/ v! B; e# g
  120.     PullNo   = LL_GPIO_PULL_NO,   /*!< GPIO no pull. */
    - _- t8 C* k1 ^6 U# Z' G( A
  121.     PullUp   = LL_GPIO_PULL_UP,   /*!< GPIO pull-up. */
    + G% n8 P2 m8 N! Y$ _. T% m
  122.     PullDown = LL_GPIO_PULL_DOWN, /*!< GPIO pull-down. */
    - ?2 c" Q4 o  b! b3 t+ {0 V! Z9 u; H
  123.   };
      b) i. v! O# T- x6 {+ z
  124.   
    : ~5 c, n6 _8 w( }) r: Y
  125.   /*! Enumeration of GPIO alternate functions. */& r5 p& J, I1 i( H
  126.   enum GpioAlternate
    + \: h  P* p- q1 C$ X5 M  |, y
  127.   {% t- T0 x( J8 x# Y8 X
  128.     Alternate0  = LL_GPIO_AF_0,  /*!< GPIO alternate function 0. */
    3 H$ v9 Z. ~& j
  129.     Alternate1  = LL_GPIO_AF_1,  /*!< GPIO alternate function 1. */
    ) l+ R6 G9 [, `
  130.     Alternate2  = LL_GPIO_AF_2,  /*!< GPIO alternate function 2. */. u5 ?' y& M2 r3 Q5 m
  131.     Alternate3  = LL_GPIO_AF_3,  /*!< GPIO alternate function 3. */
    8 {" k; c5 v( I: r6 r. b( X
  132.     Alternate4  = LL_GPIO_AF_4,  /*!< GPIO alternate function 4. */
    & S: |9 o: `  i  L. _( B: q
  133.     Alternate5  = LL_GPIO_AF_5,  /*!< GPIO alternate function 5. */: q2 N6 M% a! n/ h. Z: r
  134.     Alternate6  = LL_GPIO_AF_6,  /*!< GPIO alternate function 6. */
    1 k' U- g6 n" O" t
  135.     Alternate7  = LL_GPIO_AF_7,  /*!< GPIO alternate function 7. */$ r7 I* }, Q4 c& {* {7 N4 m3 D
  136.     Alternate8  = LL_GPIO_AF_8,  /*!< GPIO alternate function 8. */9 W( u8 r  ^* m+ n1 ~2 U' |
  137.     Alternate9  = LL_GPIO_AF_9,  /*!< GPIO alternate function 9. */
    1 h1 e+ p" C( R' o  @5 Q3 M
  138.     Alternate10 = LL_GPIO_AF_10, /*!< GPIO alternate function 10. */* f# P. q6 I, z2 k; W5 {& n1 d
  139.     Alternate11 = LL_GPIO_AF_11, /*!< GPIO alternate function 11. */4 h8 E" _8 ~& I1 E8 J
  140.     Alternate12 = LL_GPIO_AF_12, /*!< GPIO alternate function 12. */1 d* J, h! Z7 w' B. ]" |1 i) \
  141.     Alternate13 = LL_GPIO_AF_13, /*!< GPIO alternate function 13. */
    3 E% A8 `* R7 Z) ]% ~
  142.     Alternate14 = LL_GPIO_AF_14, /*!< GPIO alternate function 14. */% T2 e8 r. x; ~5 j3 u' o6 \1 P
  143.     Alternate15 = LL_GPIO_AF_15, /*!< GPIO alternate function 15. */1 f1 P; T& V' E2 G
  144.   };
    8 `* t1 ~* a1 ]9 |2 o. _3 a. V% i
  145.   , P! ]5 C4 D( d) U
  146.   /*! Enumeration of GPIO levels. */- X/ j% x1 T4 m7 ^. L0 {/ b& ]& N
  147.   enum GpioLevel$ D4 N0 e0 Z. s/ b. V5 y
  148.   {
    6 r3 H1 h/ f% {) L* p: I( N. L
  149.     LevelLow  = 0, /*!< GPIO low level. */
    3 {" n# o- C) P7 j. k& l
  150.     LevelHigh = 1, /*!< GPIO high level. */
    / ?4 K$ T9 a: k6 H: O9 @
  151.   };
    6 I, y5 Q4 V8 [6 H2 L  \4 n0 W
  152.   4 A2 L5 R+ S  e( s: `
  153.   XGpio(GpioPort port, GpioPin pin, GpioMode mode = ModeInput);
    0 X$ H: ~' K' e8 T4 D* G
  154.   virtual ~XGpio();
    % C. |, j6 M7 g* E3 K. ?
  155.   + @: F$ h0 K3 k- C
  156.   void setPort(GpioPort port);
    * M6 e! K6 F1 i9 \& K
  157.   GpioPort getPort() const;5 u' _8 I8 l: p2 S. a5 }
  158.   
    % X, }4 s" t9 j, p
  159.   void setPin(GpioPin pin);
    " i" W6 C# q3 X- c. L/ }7 K
  160.   GpioPin getPin() const;6 V0 U: I" {+ j/ s# M
  161.   
      g0 L+ _; N3 F: k3 @* I2 G
  162.   void setMode(GpioMode mode);" M; Q% z, d9 H4 ~  i
  163.   GpioMode getMode() const;4 _$ F9 k8 C: }% T% s0 ]
  164.   6 |! S: T! N7 f% ~1 h
  165.   void setOutput(GpioOutput output);  u6 t  G' x) ]6 P' ~; a
  166.   GpioOutput getOutput() const;1 I$ J( i* r/ x8 w* u& Y. Z& B
  167.   + j7 U, j3 ?, ]  r: g( L3 j; Y4 A' N
  168.   void setSpeed(GpioSpeed speed);
    . K6 `, m" ~: b% o! O
  169.   GpioSpeed getSpeed() const;) G( O8 K3 m" K+ L5 c
  170.   
    0 _0 F/ M  G6 {& \: V
  171.   void setPull(GpioPull pull);4 `5 ^) J+ D" G- K
  172.   GpioPull getPull() const;
    1 \. M% [- u9 n6 c8 S# b
  173.     X# e' M: h* J9 k/ M
  174.   void setAlternate(GpioAlternate alternate);
    3 U, N5 @3 Z9 d. t
  175.   GpioAlternate getAlternate() const;3 ?7 ^, w! H  [7 c7 P. b
  176.   6 H# ]1 A5 e7 s
  177.   void setLevel(GpioLevel level);; j- E6 `0 k: g4 N8 j& x/ q5 Y
  178.   GpioLevel getLevel();
    5 a1 h  D9 _( R0 E
  179.   % V4 A0 c9 R2 |+ l
  180.   void toggle();) T$ S0 p+ s# q8 r% I7 d/ m
  181.   / X0 t, t1 x: G
  182.   bool open();
    9 [0 i3 c! r  k* c
  183.   void close();# e+ ?4 n4 K: N+ i5 Y1 y; f) Q
  184.   ! _0 {( Q  a& y8 N7 Z7 X
  185.   bool isOpen() const;
    7 v5 T# u2 \9 X; p
  186.   
    $ b% I" G, }2 P/ S1 e/ G
  187. private:: E3 X0 B& o' O+ ?! f
  188.   GpioPort      port;
    5 i$ x1 Z. x( l) X/ |  k
  189.   GpioPin       pin;" C$ {( L1 ~/ \  V
  190.   GpioMode      mode;
    3 ?; B; U& q/ {; k
  191.   GpioOutput    output;
    1 l2 H; `: `4 @* \( W& O9 M, `
  192.   GpioSpeed     speed;
    $ V! c! E# }$ Y( d( J  T
  193.   GpioPull      pull;, \* Y: d( S- H4 l
  194.   GpioAlternate alternate;
    / {9 k7 {! k0 L0 ]7 V* C  n% ~0 c
  195.   GpioLevel     level;
    $ _' ]' M" |8 P, G- o. F5 v
  196.   bool          openFlag;  c  n# t: m4 I" B" F# S
  197.   $ _) |4 R, Z* ^0 t# L1 y9 _* L, N7 s
  198.   XGpio(const XGpio &) = delete;! P8 T5 l8 s& z7 z2 A3 {* ~7 W
  199.   XGpio & operator = (const XGpio &) = delete;
    & Q" s" A0 C, m9 P5 C
  200. };
    5 U! G+ S; I9 I

  201. 7 c" N2 {& r+ f$ ?' N
  202. #endif // STM32F4XX_XGPIO_H3 Y3 Q7 P8 `4 r9 V2 l4 l
复制代码
0 G) S5 V/ A3 T
stm32f4xx_xgpio.cpp 文件
" N! ^1 s2 g. K1 f
  1. /**
    : N$ ?% C* m% F( a6 A
  2.   ******************************************************************************
    5 y6 A2 u2 G" N& i! q
  3.   * \file    stm32f4xx_xgpio.cpp
    6 u) W; a- M/ v, O3 I# }, R9 g
  4.   * \author  XinLi
    # [4 o4 N6 @1 C1 d
  5.   * \version v1.0. D, P$ m  ~. x/ c
  6.   * \date    20-March-2018
    + }) A# F* p; N* s, a( w
  7.   * \brief   General purpose I/O module driver.
    3 `/ j. }8 u! T5 {, `, C$ @5 U
  8.   ******************************************************************************  V  l1 r: {; H8 q: |
  9.   * \attention
    3 ^+ x3 N8 n( d8 u/ h
  10.   *; S* ~. m3 U+ Q
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>7 z4 b- s' T# h
  12.   *
    - V, _3 p2 Y/ z0 S/ Z
  13.   * This program is free software: you can redistribute it and/or modify: O/ r' I$ }' \3 q
  14.   * it under the terms of the GNU General Public License as published by
    % n, A. |9 a; w" W! C7 t
  15.   * the Free Software Foundation, either version 3 of the License, or! @% D5 M% [) }1 Y/ O' b# {' E
  16.   * (at your option) any later version.) [" ~7 ~3 S3 B; X4 |
  17.   *
    , X$ a, r. {- |" u  h
  18.   * This program is distributed in the hope that it will be useful,
    2 J, V# t; c3 X% u" A3 u! W
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of' \0 I- s2 Y1 D
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the% ]' N. w. K2 X
  21.   * GNU General Public License for more details.
    4 ^! [4 ~% }. r) D% p2 ?& k
  22.   *
      x7 S! q2 [4 @3 N) a, p
  23.   * You should have received a copy of the GNU General Public License
    ; N4 a. @, {! L$ M: c
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.* o, f/ C1 H/ G# a9 d' V
  25.   *$ `1 v: t* z/ _6 O+ C& Q* Q
  26.   ******************************************************************************. a$ \) I* x0 s+ U
  27.   *// i9 {0 Z3 j& j2 q- i& U+ U$ A0 A6 }* q
  28. % }$ P7 ]" p7 u: D
  29. #include "stm32f4xx_xgpio.h"* U% S( Z- G- I5 }: c
  30. #include "stm32f4xx_ll_bus.h"+ H6 B& f1 p) p

  31. , O; g/ A: ]) W/ n
  32. static __IO uint16_t openFlagPortA = 0;
    ' R7 Y- |. ]% a- \* ~* z7 t; h4 z% G
  33. static __IO uint16_t openFlagPortB = 0;9 F: z4 y, c3 Z' N1 C0 b
  34. static __IO uint16_t openFlagPortC = 0;
    $ s& `8 C' J# T0 }/ u2 ?$ @& T( o6 T( B
  35. #ifdef GPIOD
    3 g* x& j) w" G& T
  36. static __IO uint16_t openFlagPortD = 0;8 w( F9 J- W# c: c1 s8 V4 h
  37. #endif // GPIOD
    * P: o" ~9 M& t9 [2 u2 G
  38. #ifdef GPIOE
    . o1 T1 `4 N" M8 ?4 Q3 j2 I
  39. static __IO uint16_t openFlagPortE = 0;
    $ j8 B; }2 p+ P0 t' ?
  40. #endif // GPIOE: k5 ]0 J1 B  @# D, u& S
  41. #ifdef GPIOF
    / o( x( |' ?8 H9 F6 }3 Q& i: S6 Q
  42. static __IO uint16_t openFlagPortF = 0;2 G. l; B8 k6 Z
  43. #endif // GPIOF1 j  f# s" p/ j! ~3 F5 k6 T
  44. #ifdef GPIOG+ U, |1 b! }. `- W2 p. e
  45. static __IO uint16_t openFlagPortG = 0;
    ! n( z7 P( k, p
  46. #endif // GPIOG, x2 z& u# z* I* f
  47. #ifdef GPIOH2 E  _7 f- W8 ^4 v/ z
  48. static __IO uint16_t openFlagPortH = 0;6 n: h" V) r& @( {; V( @" d
  49. #endif // GPIOH
    : G& s4 S  I3 e6 v1 ^$ K
  50. #ifdef GPIOI
    % K* J' C' f) b. d/ W
  51. static __IO uint16_t openFlagPortI = 0;4 E) R( k4 [6 E+ ~
  52. #endif // GPIOI7 ~& [, w- Z; a( r9 e
  53. #ifdef GPIOJ
    0 o1 a. u8 z$ Q& i8 Z
  54. static __IO uint16_t openFlagPortJ = 0;" E" o( Z# Q( f: s. v
  55. #endif // GPIOJ
    8 E  {& |* H. P& C8 ^1 p) N6 P  c, J3 \
  56. #ifdef GPIOK; o3 ?$ ^4 Z! z7 \. \
  57. static __IO uint16_t openFlagPortK = 0;
    + s' m2 w5 O. S0 X, {6 }1 z' b
  58. #endif // GPIOK$ `4 V1 C) z, k" |' B* S

  59. + ~* k6 r  g9 S2 ?/ S
  60. /*!
    1 [7 \+ t; h  @9 O1 K
  61.    \brief Open the general purpose I/O clock.' Q6 v( c8 B" u% z" U$ e
  62.    \param port: GPIO port.
    5 T8 N! N# k4 t0 J* r
  63. */
    ; m3 p( w8 w' p: y6 ]
  64. static void OpenGpioClock(XGpio::GpioPort port)
    2 q) t, N- ]  C
  65. {! ^5 X6 r# M. a8 h. q
  66.   if(port == XGpio::PortA)
    " E8 ]7 h% N. a% l+ W
  67.   {  Y0 k4 t; q3 J3 N! N2 ]
  68.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
    & B$ m. m$ a, f- |* O' V: g
  69.   }+ U; Y% L: f( A& n4 S" X1 q
  70.   else if(port == XGpio::PortB)( C9 q! z& {0 L" v5 R* P
  71.   {. M# ^) t1 w9 E) Z& `
  72.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);: v/ |3 r8 ]$ p. O0 z
  73.   }
    1 H7 t" O/ h' h7 y' F
  74.   else if(port == XGpio::PortC)
    " |, @7 |% }& Y
  75.   {
    9 v& m9 U1 d) g4 r4 g; I
  76.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
    * o# I: ^. B/ o6 |
  77.   }4 K" m1 d+ H, `- S# d
  78. #ifdef GPIOD
    $ k/ E. b! O. k7 f. w0 f
  79.   else if(port == XGpio::PortD)  n- T, n- e' D$ G: d
  80.   {# L9 `! U- ~; q  c3 e9 C
  81.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOD);$ o! ~; j7 ]6 \% u' ^- t+ F
  82.   }
    7 x* R$ S: r5 {: l% g4 n
  83. #endif // GPIOD* [8 N8 v8 h6 ]5 `( ?1 x
  84. #ifdef GPIOE5 l5 X# }5 i( ~5 U! ~& a- F
  85.   else if(port == XGpio::PortE)! m, j0 D% K7 Q+ G8 W; H1 O* A0 _
  86.   {  K* I7 w2 i, r, x! W7 H* {2 Q, G- D
  87.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOE);' o" ]* F& I1 s8 m* G
  88.   }
      ?. ]; s9 s1 H( k( @2 s" v) L5 m
  89. #endif // GPIOE
    ' f0 h2 P3 ~$ z( @- B1 y6 ?. e. K; c
  90. #ifdef GPIOF# b- Y' D0 g. G7 _5 e/ @8 B
  91.   else if(port == XGpio::PortF)
    - l5 B: x1 S6 S5 ~! t- D5 U- O" C
  92.   {
    7 Z4 a$ K2 z- i, C; L2 W
  93.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOF);3 I/ b6 {# K. L; D2 g0 T
  94.   }6 ^3 Q* a- m4 ^, d+ f# e) i2 X
  95. #endif // GPIOF: J* D. }9 O' n. G. o% \
  96. #ifdef GPIOG
    : m/ J' d# ~7 m/ X- ^. P+ F- W9 ^
  97.   else if(port == XGpio::PortG)! b' F; Z1 \$ U3 ~0 F2 d# K6 P
  98.   {
    9 A* G7 t, x- f/ v& Q9 F
  99.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOG);
    + s  f" e* _' G1 H" D
  100.   }# ]$ ^( M7 q& `, y$ E! M  I( w
  101. #endif // GPIOG
    % K$ c  \5 _% p
  102. #ifdef GPIOH
    + x0 p- |% r* c4 s/ H
  103.   else if(port == XGpio::PortH)
    5 K  h& b  T) H3 }1 o& l  g0 P
  104.   {
      T" v) ~0 _2 s7 g8 ?
  105.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOH);6 ~6 Y  _* ?3 H2 P
  106.   }  [+ J% P2 h5 w4 O6 y4 y
  107. #endif // GPIOH; ^6 v+ I# Z9 Y) X
  108. #ifdef GPIOI3 x) [, d( X5 w" q& j0 b" {' X( m
  109.   else if(port == XGpio::PortI)
    ( `5 o  O7 ?! n0 c9 o
  110.   {
    . N5 W% M4 g- r. j# o
  111.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOI);( T) B6 [3 `/ P
  112.   }; E+ o. g, q# e2 Z2 f
  113. #endif // GPIOI1 z! i* ]& k' F$ W* T8 A! a7 x
  114. #ifdef GPIOJ, A4 D" v8 U  e0 }/ ~* G6 W( a
  115.   else if(port == XGpio::PortJ)9 p: z: `+ L. E! V
  116.   {
    5 O' V' c9 I/ G' F
  117.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOJ);- y; H/ Z, G* M2 w4 V0 H
  118.   }
    % ~0 N. j$ B8 g
  119. #endif // GPIOJ$ l7 N  C$ h3 Z
  120. #ifdef GPIOK
      u' t: i: a$ b
  121.   else if(port == XGpio::PortK)
    ! Y; z  W. A2 o6 N  b4 O' T5 |
  122.   {+ l, s5 |) N0 @" ^
  123.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOK);
      V. g, r+ f- H! O* ?4 q) N1 L! Y; o& [
  124.   }) P. M; e0 e  `; M
  125. #endif // GPIOK; J/ L: e, e0 @( Q5 J+ S2 f' K7 A
  126. }
    0 ^2 O  l: v2 @, s* w3 W3 ~5 d

  127. # m! J5 W6 B( A
  128. /*!
    / z+ |- @0 l* J( P
  129.    \brief Close the general purpose I/O clock.
    % L( {8 Q/ P: G* u
  130.    \param port: GPIO port.5 w1 S# ~+ M% K% T6 I. J
  131. */, j# t: W+ H% E' {) F& V" m. F
  132. static void CloseGpioClock(XGpio::GpioPort port)
    0 l% w8 [5 Q& Y" H
  133. {
    1 Y8 L6 e' M+ h/ n9 E
  134.   if(port == XGpio::PortA)3 T# x4 ?' o0 \* F7 q) w5 y( B
  135.   {
    4 P8 i. T4 u/ D; Y
  136.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
    1 T# X( ]$ z" q- u
  137.   }# `: Z+ V& B- Q/ Z5 ]8 a. {
  138.   else if(port == XGpio::PortB)
    . R( s( e2 M! K  Y$ h; V- ?8 W
  139.   {
    0 s. r8 M3 [  c* R3 w2 x+ T2 Q
  140.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
    . k& P; y. A- z# Z1 G8 i
  141.   }4 l' M  z# \% D) V/ S
  142.   else if(port == XGpio::PortC)
    0 m- q8 j2 E9 D) K
  143.   {8 H, X# S- s/ J' p
  144.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOC);  D+ }% L# f3 n% F) k2 {$ \; @) ^. [3 h
  145.   }  |5 ]9 s5 H& |$ E& Z( X
  146. #ifdef GPIOD
    8 c2 i- ?/ j8 k+ v2 O
  147.   else if(port == XGpio::PortD)
    & _# h8 j3 Q1 K! G  O
  148.   {
    ) p( L" w% j% e8 m7 E' e
  149.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOD);% w* X" y  S8 I  T, A
  150.   }
    0 }+ k3 F" U% o
  151. #endif // GPIOD  n' g; K4 l) A3 Z
  152. #ifdef GPIOE% K* b& x! t1 R
  153.   else if(port == XGpio::PortE)9 }9 F) \3 g2 H* p
  154.   {( V2 N: w" K$ Y, f
  155.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOE);
    - Y: J# Y" J/ U) f. q3 d, h
  156.   }
    7 c. Q3 Y. r  n* i! _, ]) z
  157. #endif // GPIOE
    ( w+ f7 v/ ]8 Q+ i
  158. #ifdef GPIOF& w9 {7 y5 J2 o% B
  159.   else if(port == XGpio::PortF)
    * R: Y3 E7 c4 X9 |! `# A; ~
  160.   {6 a  C% d2 m% H: r- N: Z, D) l  ]
  161.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOF);
    9 D0 C' t% o% \9 N! j1 u  G# H
  162.   }; b0 _9 }7 e" O
  163. #endif // GPIOF
    0 e$ z( h. [  B0 B$ I4 H
  164. #ifdef GPIOG
    % o- o$ K8 f7 n$ ^; v
  165.   else if(port == XGpio::PortG)3 M5 P- N6 N& G; }. v. _+ I
  166.   {" y2 d$ C# Z" P* ]" U
  167.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOG);. ]5 \1 S& }) b  S, c
  168.   }) \  {" H3 Q% C( ]: ]
  169. #endif // GPIOG
    - @; Y" p' I* [0 a) p
  170. #ifdef GPIOH
    ' h1 n, Y& I3 V) c9 M6 c
  171.   else if(port == XGpio::PortH): h# V0 w# S7 g0 V
  172.   {" f- E/ w" b& _& ^
  173.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOH);4 j. Z9 o/ V% r3 m' H2 q; ~
  174.   }
    , b" F8 D* l& J* T: Q2 b: q
  175. #endif // GPIOH/ A6 k8 g9 |4 m/ Q  H0 {% M
  176. #ifdef GPIOI9 x, ~' \8 O- j4 A+ w0 a) q* M
  177.   else if(port == XGpio::PortI)8 Y) D" n2 A6 f; q1 M& d4 ~, W* k
  178.   {  \* N' }8 {5 k. J
  179.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOI);
    1 R% {3 d) I. P
  180.   }: Z' h: `" P% G% V& ?
  181. #endif // GPIOI9 B$ r; T0 I$ M6 Q4 C; `% W$ n5 x& ]
  182. #ifdef GPIOJ
    * F; u1 N* i/ M$ _5 e
  183.   else if(port == XGpio::PortJ)
    . O5 S, L& p9 a: w
  184.   {
    9 Q$ q. T3 v4 V( k/ s7 J
  185.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOJ);& Y6 F8 `! D/ }. }( D* F* S
  186.   }& Z" Z+ `, X+ w9 g
  187. #endif // GPIOJ& w1 w, a, ^- R- N/ d4 l2 E# f
  188. #ifdef GPIOK; F! C+ l# ]6 M; `
  189.   else if(port == XGpio::PortK)
    3 m' n: B) T; W' C8 S  c6 \; A
  190.   {) z; o: C1 F3 k+ U2 Z! m& J
  191.     LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOK);. u% s* p! D. H- u. N
  192.   }& H  h8 D( A4 {9 J6 g5 i
  193. #endif // GPIOK
    ! A0 J  j; n7 L2 y
  194. }' j) c+ E/ {1 l2 V3 j/ E9 e5 {1 W/ D$ N
  195. - c+ ?- y, e$ M( I# G
  196. /*!, ~1 P/ m9 u" u! e
  197.    \brief Set the general purpose I/O pin flag.* Y  U- F$ L  V7 ~* g3 w" V# a
  198.    \param port: GPIO port.
    3 O2 ~+ \; K3 M$ j4 M& I+ v# T5 |  y
  199.    \param pin:  GPIO pin.  q: ]& ?2 r- }7 ^5 {! y' z
  200. */" Y. q9 p' I" p$ u0 B$ ~, P5 I
  201. static void SetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
    1 ]- H1 {  n' [7 v8 E/ t
  202. {
    ( Q  `9 H' N; `; q! D8 u$ d8 o
  203.   if(port == XGpio::PortA)8 V2 ]; Z6 ~; ]% [7 u( ~& s8 \) i* I
  204.   {
    / r# q+ {% h% k: {
  205.     openFlagPortA |= pin;0 H+ G5 S1 {. U( ?5 H6 @- w8 ?
  206.   }
    0 F5 h8 m/ s: W
  207.   else if(port == XGpio::PortB): `* ~6 }# _& j' y% K& F7 l
  208.   {8 K: y0 r" X' p7 t. q5 L3 T
  209.     openFlagPortB |= pin;% q! d7 W, i1 n5 W7 E7 r
  210.   }9 E: ^! K! `; X& k. U7 G8 w) t
  211.   else if(port == XGpio::PortC)3 i- A7 d& P: @3 }* e" A
  212.   {' W. I5 U/ G7 u9 o- i  ^7 S- M
  213.     openFlagPortC |= pin;: A& G& V' n/ b4 _# k7 n
  214.   }+ h: g1 Z7 I. M6 U4 J
  215. #ifdef GPIOD
    0 H# x4 `3 [) {
  216.   else if(port == XGpio::PortD)
    % {" ^) R% h" y
  217.   {) X6 o6 F0 G# Z( E9 {* Q
  218.     openFlagPortD |= pin;
    1 p% ]/ v2 k& ~6 N  G1 Z* \/ V4 M
  219.   }
    " C% C. N) W6 ~% h* V7 f# p" M
  220. #endif // GPIOD
    + L6 X3 K) w- L8 L2 x
  221. #ifdef GPIOE
    ! i( \/ ~2 V7 {( a6 v" G
  222.   else if(port == XGpio::PortE)
    5 q: g% N- H8 t$ k
  223.   {
    - h  ]& U& f3 d  c; i1 P% G
  224.     openFlagPortE |= pin;3 U2 k1 T; N& {) h
  225.   }
    " E5 V6 N, c. u2 N: ?5 l$ @0 p
  226. #endif // GPIOE0 j9 v. A2 `. Q$ C
  227. #ifdef GPIOF
    . N2 ^* t3 D: ~- U
  228.   else if(port == XGpio::PortF)
    , J1 T) c8 ?" \# _* y- B& d% _
  229.   {: d0 [& r; z$ K9 J/ f' q3 y
  230.     openFlagPortF |= pin;$ S: s: K3 ^8 G+ T) S
  231.   }  E2 [7 u7 K7 C9 q/ I$ y1 c
  232. #endif // GPIOF6 T/ c& o7 B9 K+ J& [
  233. #ifdef GPIOG
    7 }, a1 d3 N* l! ^- @4 w
  234.   else if(port == XGpio::PortG)
    . m  c: v. U) h' _1 N3 J5 G
  235.   {
      b  T' b3 r0 C
  236.     openFlagPortG |= pin;
    , q/ x+ a* B. F7 i& B, W3 F. u
  237.   }, A$ R- i: o8 ]
  238. #endif // GPIOG
    4 }% {, H: i: n  J3 @' P( U
  239. #ifdef GPIOH; ?+ M0 _$ Z1 Z* N5 q) u1 o1 \% I6 L
  240.   else if(port == XGpio::PortH)& w9 N& w: M/ ?2 f2 ^$ v
  241.   {
    7 a" H/ y6 K7 H* Y) y" p
  242.     openFlagPortH |= pin;
      d/ C* j& l0 }5 ], a* Y$ W. P6 ]
  243.   }2 p" `, E9 S9 ^1 q  P
  244. #endif // GPIOH
    8 Z! H) d% T' b$ z8 \8 \' K& Z
  245. #ifdef GPIOI9 ^" K2 R* z1 }: w* K
  246.   else if(port == XGpio::PortI)
    4 k1 a# F( K$ k9 n4 j" C$ a1 l
  247.   {6 s& |( p1 _' V" V9 E6 o9 Q
  248.     openFlagPortI |= pin;- ]/ V- S# K! x+ Y* R
  249.   }
    9 ^& {& N" B* b
  250. #endif // GPIOI
    ' m! Y' D! I- o. A  T1 T1 ]
  251. #ifdef GPIOJ
    - ^+ O3 `9 y0 _/ T- T
  252.   else if(port == XGpio::PortJ)
    & j  |0 B' H; m0 F1 n
  253.   {" c: D  p7 Z2 F1 v7 c7 Y1 E. e
  254.     openFlagPortJ |= pin;; A* m9 ]5 {" f( l! s
  255.   }
    / C" x' D$ z$ p3 a" R
  256. #endif // GPIOJ" X6 G0 z  c, i0 N
  257. #ifdef GPIOK7 E- @6 s. f4 `: F
  258.   else if(port == XGpio::PortK)
    8 u6 K- S+ G  y
  259.   {
    / n# ?3 g) S2 e7 B3 \# ]+ A
  260.     openFlagPortK |= pin;
    3 Y0 s. H5 Y% {" t
  261.   }- S; L6 n* U0 j4 ~" d0 c
  262. #endif // GPIOK
    6 z' g0 H" K& I7 A2 y2 Q
  263. }
    + q" U/ B/ w+ d& k5 J3 I
  264. ) q8 z+ |! j2 n9 _: J) }
  265. /*!
    5 A" q6 I/ B* b% D( z
  266.    \brief Reset the general purpose I/O pin flag.
    ! p; t7 Y& ~$ i
  267.    \param port: GPIO port.
    " K) v8 Q$ K% x& E3 s3 Z: r
  268.    \param pin:  GPIO pin.; _# b% g5 e) y, c; M
  269. */
    6 {$ ^6 k6 ?+ x7 G  L9 ]
  270. static void ResetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
    4 }- V7 ~3 I" |# T; R
  271. {1 r. P* z$ W8 u: T, w
  272.   if(port == XGpio::PortA)
    . G  Z1 F7 X( Z3 @/ z
  273.   {
    $ F. |1 X; f, m% U
  274.     openFlagPortA &= ~pin;$ o1 X, E, V% {+ o% z9 d# K
  275.   }
    " S. y% P0 P2 E& j4 z! B' O- }
  276.   else if(port == XGpio::PortB)! S# q, q4 R2 n
  277.   {& ?. R" m* j& p! G7 ?3 ^. b. {
  278.     openFlagPortB &= ~pin;9 v6 k0 d# V# h' X( s* `( T; }
  279.   }' o; G( H" |9 I7 j
  280.   else if(port == XGpio::PortC): t: F0 h+ ]& f% e2 T
  281.   {
    & W% C2 B8 y# F. \  n
  282.     openFlagPortC &= ~pin;$ w2 b9 V( k8 O2 Y
  283.   }
    , z/ E* ?; c+ k% i: U" W/ }
  284. #ifdef GPIOD
    + j) \  _5 p) S4 V9 f
  285.   else if(port == XGpio::PortD)! p8 W2 p' x: T7 Z. U
  286.   {
    6 m5 @  p- L6 B& i5 d
  287.     openFlagPortD &= ~pin;- m$ o9 O# H1 s# B& S# h9 E# H
  288.   }7 X" A3 n3 z4 f% m2 x) h2 S- K
  289. #endif // GPIOD
    2 d* P- c, B& q( e+ x- v' }
  290. #ifdef GPIOE2 v  Y5 U1 p$ w# w! M' k
  291.   else if(port == XGpio::PortE)
    8 O: v& w/ G1 N
  292.   {* _- e. q$ ^! G4 {6 B1 L" C8 n( G+ k$ v
  293.     openFlagPortE &= ~pin;. G5 L7 V7 z8 |( T
  294.   }* e3 o9 ^1 _+ \# i; \
  295. #endif // GPIOE
    ' v- k7 V8 _& p8 l* @7 y# @9 t8 j
  296. #ifdef GPIOF
    $ R. J2 J" U$ R+ L: \2 w, D
  297.   else if(port == XGpio::PortF)
    & D7 }9 O3 M; P' Y5 \2 @
  298.   {, Q( F4 G$ B! w
  299.     openFlagPortF &= ~pin;7 C3 b3 [2 ?9 i1 h$ V# f
  300.   }3 Y$ `( c) S8 E' D9 W
  301. #endif // GPIOF! A) d2 @* @2 o: x- N- _
  302. #ifdef GPIOG/ [: }+ x  g5 |1 R8 [/ y: A
  303.   else if(port == XGpio::PortG)! f  j. h& H9 Y) e8 q  U$ M7 U
  304.   {3 e$ a, V5 y0 S" m. x
  305.     openFlagPortG &= ~pin;
    - f+ d1 B& t8 S% |
  306.   }
    $ Y1 m: I- z3 M8 W6 w1 X! M
  307. #endif // GPIOG
    ! _4 D+ }& w+ _' u+ v  H) W
  308. #ifdef GPIOH) E  k7 O0 T+ k
  309.   else if(port == XGpio::PortH)
    & O% a; C" g% R4 Z" g# t, q
  310.   {1 L$ [$ x1 C2 I# _( M3 s
  311.     openFlagPortH &= ~pin;
    7 z* c( j1 G+ ]4 A* u" b
  312.   }4 _2 h5 K2 u5 s
  313. #endif // GPIOH
    0 T8 C- l' q; r+ z0 z: h
  314. #ifdef GPIOI7 k1 O9 A: o/ K  _! ?* [
  315.   else if(port == XGpio::PortI)
    " C, p) g4 S; u5 K- a% E( ^
  316.   {1 V  m9 o# b4 b; h1 c6 G% D
  317.     openFlagPortI &= ~pin;& D# Q0 Y$ d. I- |
  318.   }0 N; W# n' x6 H
  319. #endif // GPIOI) K8 c0 ]+ _. ~) |2 x/ `; m  C
  320. #ifdef GPIOJ) N% B. N6 ]  O. x% S
  321.   else if(port == XGpio::PortJ)% c; M$ L, s! c9 K& v- B+ A
  322.   {
    % U, o7 w7 b1 J9 D5 J
  323.     openFlagPortJ &= ~pin;- W5 K  e# d) v( r
  324.   }: m* |: U1 U! E0 V) b7 {
  325. #endif // GPIOJ2 O4 D- [/ l7 p% I( S0 G
  326. #ifdef GPIOK2 n) S; D* |9 b6 R: e# g3 c4 Q  v
  327.   else if(port == XGpio::PortK)
    1 O' b7 S0 F0 n9 O. E: ~
  328.   {9 j( ?; A, f4 L
  329.     openFlagPortK &= ~pin;
    ( b' ]6 G# Q( a; |) v% b2 [9 D
  330.   }
    * l, n0 R9 k/ q1 q8 K
  331. #endif // GPIOK
    9 \& H) {0 J$ ~- C/ m
  332. }
    ) B. i! r% M  j( H4 w/ d
  333. , N5 N2 T: h. f. q: ^3 R
  334. /*!8 Q2 ~% E$ r+ ^/ Z; {
  335.    \brief  Is a general purpose I/O pin flag set?
    2 e+ N( P7 Y, f+ A4 h; |1 D( G
  336.    \param  port:  GPIO port.. J6 c* e+ b# {6 b$ g5 v
  337.    \param  pin:   GPIO pin.
    , D- |' R, O1 T; O( ?9 L, o
  338.    \retval true:  General purpose I/O pin flag are set.) \) m9 W3 w6 ^
  339.    \retval false: General purpose I/O pin flag is not set.
    " j/ |# ~9 w  H4 r0 x7 w) x$ L
  340. */$ V  _& B- C, o, S6 Z# q6 \0 S' j
  341. static bool IsSetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)* [  Y8 a: y( L: M
  342. {# ~. n7 U4 ^4 ]( o
  343.   if(port == XGpio::PortA)
    & W# G  `" l. q& m7 |: {
  344.   {
    ) [% `) f8 c: m' Z1 _
  345.     return ((openFlagPortA & pin) == pin);$ _1 D, C5 v  i/ }1 c" i7 z  k
  346.   }% g; @; s+ n/ r2 i+ N" j
  347.   else if(port == XGpio::PortB)( C! [$ D# e( \3 T/ B1 p. L
  348.   {
    $ E3 O5 f" p4 b$ [% E) _7 Y
  349.     return ((openFlagPortB & pin) == pin);
    , G. h/ |, H2 P! y* U
  350.   }) J2 b1 k- o# a8 K$ G
  351.   else if(port == XGpio::PortC)
    - H: m7 Y0 L5 K5 f9 v
  352.   {
    $ K! g( C& z( p0 m0 `% ^
  353.     return ((openFlagPortC & pin) == pin);
    5 N. |, y$ e, ~8 G
  354.   }! I* T6 `0 M$ G% i  e
  355. #ifdef GPIOD( D8 h" Q( X6 V. b* G0 i
  356.   else if(port == XGpio::PortD)
    & w! w  F# m! L3 z5 f. `0 r
  357.   {
    8 c* d( F# G: f3 x) {1 s' \
  358.     return ((openFlagPortD & pin) == pin);
    ( E3 V' \  B2 R: l
  359.   }: \$ t$ R! j) o' V: M; ^! ?9 z
  360. #endif // GPIOD* F4 Y1 c' D% ?+ C2 g
  361. #ifdef GPIOE
    & X# r  L0 D) P3 R
  362.   else if(port == XGpio::PortE)7 w- ~; F8 o1 g; T3 s
  363.   {
    : i3 o9 [& ^" h) f1 s+ ?, s
  364.     return ((openFlagPortE & pin) == pin);
      s$ H/ U' h& v2 u4 ~# b' ?; c
  365.   }0 b( t6 P! }' Z
  366. #endif // GPIOE% x1 C( g7 S! ?5 I# V
  367. #ifdef GPIOF! o& t, S! ]1 m5 W( F
  368.   else if(port == XGpio::PortF)
    5 m/ k1 o* h, C, I* B6 s
  369.   {/ w- X3 U8 S6 `0 x9 p9 e5 E# B
  370.     return ((openFlagPortF & pin) == pin);
    6 r/ u2 S: U' n9 M* ?$ G
  371.   }
    & B1 G7 u! Y8 G7 T: W) m8 l
  372. #endif // GPIOF
    ( }; D3 b( B: N' [4 ?
  373. #ifdef GPIOG  p  C! f+ n+ H6 B- m# U
  374.   else if(port == XGpio::PortG)9 D3 y5 ]* z3 m$ X# e5 W" u% L7 x
  375.   {
    1 G6 s9 I7 d" F; D; _
  376.     return ((openFlagPortG & pin) == pin);
    0 K+ R- S6 B9 b( W* G
  377.   }! Q- w5 Y/ c5 g' d& }
  378. #endif // GPIOG
    4 ?7 Q# l$ S1 b6 l) p: p& o
  379. #ifdef GPIOH
    3 g5 G( Q5 o5 j- `0 e8 d8 F$ g+ y# X
  380.   else if(port == XGpio::PortH)* P. Z6 S! O& x0 U# p0 ^
  381.   {. m6 H/ }9 r9 `' }% f3 M" b# s, M
  382.     return ((openFlagPortH & pin) == pin);
    3 b& `. g4 N  s: ^
  383.   }+ W5 F- P* R# b6 i( k1 l+ H. m
  384. #endif // GPIOH
    + d* I$ D2 U5 E. G  l) r" C
  385. #ifdef GPIOI
    ) P% g5 j3 p$ H8 C$ W# b
  386.   else if(port == XGpio::PortI)
    : K! n# z$ f; `/ I5 ~. s  M
  387.   {
    4 n: a4 z, o) x1 f5 l* I9 b/ H
  388.     return ((openFlagPortI & pin) == pin);
    $ l, J6 D2 p, h' Q1 e" P
  389.   }
    , k, X8 s  Z7 M9 e  k; W5 Y: J8 B
  390. #endif // GPIOI5 |- J8 A& i; C# }" [6 \
  391. #ifdef GPIOJ2 P4 Q2 b& Z6 y2 E
  392.   else if(port == XGpio::PortJ)
    - v$ z8 w+ a: |% a7 B) ?% w5 B
  393.   {
    , ~3 Y) y  V* g- K- t' l
  394.     return ((openFlagPortJ & pin) == pin);, U1 J0 ~; h: ?! K$ c4 @
  395.   }( A  I$ }8 r9 \0 T
  396. #endif // GPIOJ
    # Z2 w' u! d( f/ m; z
  397. #ifdef GPIOK
    6 T" v2 w. x% f  O
  398.   else if(port == XGpio::PortK)
    - z( v* P; W7 m6 F8 P( }- s
  399.   {
    ' w1 F% M. n, w
  400.     return ((openFlagPortK & pin) == pin);  v! Q/ Y. G- I) ?) ]4 W
  401.   }4 a4 b6 P% i% k# v% C
  402. #endif // GPIOK
    0 u( ]; w% g' Q& e7 z
  403.   else
    4 l' [+ M% }5 L9 n. V
  404.   {
      |: z' ?! G  M( J
  405.     return true;+ d" ^& o( g0 B
  406.   }  u* U% g0 W- s2 e# P4 i) i% g
  407. }
    ) J  i% ^4 Y! R5 ?
  408. # U7 ^9 B' L. q+ f5 e( ?, O
  409. /*!+ r7 y2 e0 q: }1 l" }( K6 e3 I2 c
  410.    \brief  Is there a general purpose I/O pin set flag?
    1 H& q7 h% ]" y+ _
  411.    \param  port:  GPIO port.
    " s. |1 R7 L2 S: p$ e, ^
  412.    \retval true:  There is a general purpose I/O pin set flag.
    1 e; j' v1 F# x/ U0 k3 n1 U
  413.    \retval false: There is no general purpose I/O pin set flag.
    ! [# t; b' t- J0 ?
  414. */' l7 ]) i# U6 L* p' a( M
  415. static bool IsHaveSetGpioPinFlag(XGpio::GpioPort port)
    ' R9 b: {5 y7 b+ P
  416. {
    9 X& c2 e8 u5 o/ c$ B2 ?
  417.   if(port == XGpio::PortA)
    / {  N( ~# s' z' z4 Q
  418.   {
    " H- M- z  G2 D: u0 Z
  419.     return (openFlagPortA != 0);/ i+ p$ r3 Y+ @6 T# u* u
  420.   }
    - f( G) Q3 R, B4 o: l- F
  421.   else if(port == XGpio::PortB), u6 ^* p7 l0 S! T
  422.   {. a. |0 _5 G! [0 a
  423.     return (openFlagPortB != 0);
    ( ~$ ?8 S- S/ |5 B$ x% u: V' u$ t
  424.   }+ L/ U# U0 @. m" u' b  E
  425.   else if(port == XGpio::PortC)6 e! C$ t: s7 {2 T  a( \  v
  426.   {; W  D$ @1 Q* m3 T2 ?
  427.     return (openFlagPortC != 0);) h6 f2 `% u2 j2 ?( ]
  428.   }
    5 F. T5 s/ u( J( r0 E9 d1 [
  429. #ifdef GPIOD! K8 i7 f6 H: M6 S
  430.   else if(port == XGpio::PortD)
    * F3 r( ~4 f8 n# l& f
  431.   {
    $ ]: v5 k8 `" Z( i! u/ C! D8 {; `
  432.     return (openFlagPortD != 0);  T& G1 d+ l* K; @: S1 q8 s
  433.   }
    7 v  v/ s' Z  `7 L1 c' x# e) U2 A& B. C' F
  434. #endif // GPIOD
    ) i4 `  J% B4 J: o2 l2 y/ W
  435. #ifdef GPIOE: a) e: p& a  H/ [
  436.   else if(port == XGpio::PortE)3 c/ I9 ?5 V' J# s- ~
  437.   {9 g0 {' {- Z7 V' V8 A
  438.     return (openFlagPortE != 0);
    2 p& r7 A  ^# ^9 Z; Z
  439.   }
    # `2 L" m6 Y8 \/ D1 o
  440. #endif // GPIOE9 Y; p4 ^) U1 T
  441. #ifdef GPIOF% U" I, p# P& `; I. e0 @% V+ Q
  442.   else if(port == XGpio::PortF): O5 n: y; X8 K3 U, j
  443.   {+ Y$ g7 a+ d* {2 A4 `: _8 p
  444.     return (openFlagPortF != 0);0 h& [/ ?! @# u5 ^
  445.   }3 @- a$ i" R& Y9 J. |
  446. #endif // GPIOF0 i8 ~2 m; h3 v$ z, P0 A4 U
  447. #ifdef GPIOG
    9 f: t3 Q; k* l0 l
  448.   else if(port == XGpio::PortG)$ A+ X' }% w7 i5 N$ V( |, n1 i/ X
  449.   {
      V1 P# V' q0 [3 W# }
  450.     return (openFlagPortG != 0);" a6 g1 H9 Q  Y, g
  451.   }2 p# z* |( l+ s7 _5 y8 A8 e: W
  452. #endif // GPIOG
    8 P& |/ ?" h3 K2 i% p! S  @
  453. #ifdef GPIOH- f& D! J( F- J
  454.   else if(port == XGpio::PortH)1 ~+ U9 t' K8 Y2 k7 R
  455.   {
    9 o+ a' d: J" E: q, Y$ x
  456.     return (openFlagPortH != 0);
    ) l# B6 a; N9 W2 j! n
  457.   }
    , z6 |$ k4 [4 l. h1 K
  458. #endif // GPIOH
    ! v) ^- l( _, F8 j. ]4 ]
  459. #ifdef GPIOI
    + \* @4 L' W1 V+ ]: w  N/ [
  460.   else if(port == XGpio::PortI)
    3 G: W- w0 R+ J
  461.   {# o, _2 T4 [( w2 A# e
  462.     return (openFlagPortI != 0);
    3 t3 p9 l3 ?9 V! n5 w
  463.   }
    / l; o' d" G1 a7 J6 }
  464. #endif // GPIOI
    ; m4 N+ j" ^  {1 o3 t7 F
  465. #ifdef GPIOJ! p- X- R1 c: G; g( u+ n4 Q9 F, x
  466.   else if(port == XGpio::PortJ)% }# x: e. R( X# o, N- ^
  467.   {
    : R  e. G# b, n, h* y( d
  468.     return (openFlagPortJ != 0);4 `/ w( M3 n6 ^' d+ M
  469.   }
    + m" F5 m5 q% x6 {' |
  470. #endif // GPIOJ6 X2 I2 I) L& G' g4 k
  471. #ifdef GPIOK
    8 l3 f" @7 B, ]: ?' }7 @  I2 e
  472.   else if(port == XGpio::PortK)
    : C# o+ x- S, Z( j4 P; ^. Z
  473.   {
    . o( v  o6 `3 \
  474.     return (openFlagPortK != 0);3 U, e9 a* Y5 j; A& X# M0 Y# H. I
  475.   }9 i+ H8 n* C2 E
  476. #endif // GPIOK( S3 c- Z, S' P( z) m
  477.   else. E% \% R6 y0 x2 L/ W( C* Z2 c
  478.   {. q1 [  V6 n1 `
  479.     return true;
    7 U" y$ z! @3 I* {  c$ H0 f1 z' ]
  480.   }
    % z( m0 N" E/ B$ N2 R
  481. }' L* z1 r& X: R) e
  482. , P/ }/ e) t) ~6 j' P/ D
  483. /*!
    $ b5 p  c$ `' B0 f: W" s+ |
  484.    \brief General purpose I/O module constructor.$ b- J" d/ y. ~- q! e! ~
  485.    \param port: GPIO port.0 X% [$ N: ~1 `5 F. V2 Z4 a
  486.    \param pin:  GPIO pin.
    % Q' B9 l5 Q3 j- `
  487.    \param mode: GPIO mode.+ R5 c0 |) I# D* l# _7 a
  488. */
    5 y% H- [8 U' S" f4 I0 L' c1 f
  489. XGpio::XGpio(GpioPort port, GpioPin pin, GpioMode mode)
    2 e+ `8 ?. u/ T& Q. R! e* u
  490. {
    ; s8 k6 k% ]! o5 I5 h$ W* ^- u
  491.   this->port      = port;
    $ h* V. T+ e" n, c+ ]  T
  492.   this->pin       = pin;
    # l( o3 D, V6 B: {  e" [
  493.   this->mode      = mode;4 ?+ x, }! v* P1 y9 K! J- ^. i
  494.   this->output    = OutputPushPull;6 q' v: @; T' D2 @; l
  495.   this->speed     = SpeedLow;3 U5 S4 u. T$ V
  496.   this->pull      = PullNo;% Z( p* x( E6 c+ C* q
  497.   this->alternate = Alternate0;$ ]; f( k7 @" L6 e# j- @2 m3 D9 \* R+ x
  498.   this->level     = LevelLow;
    , i2 ^" x& \% Y* L9 l5 z% x/ j" \
  499.   this->openFlag  = false;
    7 y9 c. Z1 F  Q$ @& D" {7 G
  500. }# @. r0 m" b# x7 ?8 b. [
  501. . n! w% ]7 w: T! U. k# L
  502. /*!7 F4 o/ B1 i0 u5 e4 U5 S9 c6 q
  503.    \brief   General purpose I / O module destructor.
    4 u3 w  v7 C! n
  504.    \details Restore generic I/O to its default state(input mode, push-pull output,/ `% Q- P) C' V, O
  505.             low output speed, no pull, alternate function 0, low level).7 j' V2 Y( g/ \- u0 N* l4 y
  506. */: E0 l/ O, T& H' y" r. \
  507. XGpio::~XGpio()
    2 U$ V: U( v% {) B
  508. {
    & ~6 s3 m7 Q7 O/ C9 r
  509.   close();$ |4 t8 s: @  ~4 e! L3 x
  510. }' s- l$ i% x! L* d% T/ \

  511. " ]1 G+ [4 V- ]' k3 J  S
  512. /*!; j% |4 }' m* q, ]: U6 l
  513.    \brief Set general purpose I/O port.
    / h2 P$ J8 V$ T8 _
  514.    \param port: GPIO port.- h$ [0 f, x% u
  515. */# G. z' C5 H3 u8 R5 a
  516. void XGpio::setPort(GpioPort port)
    ( A1 B( m& e( O+ C
  517. {
    * M  r; q, s: }8 n* ]
  518.   if(openFlag != true)  q- \7 r& e. U  R
  519.   {
    ! `- {4 L; O8 F& T% T# p3 c# O
  520.     this->port = port;0 A0 C/ [  m9 i2 X
  521.   }
    5 w' [. W9 i" _
  522. }
    ) u4 [" d5 k7 J0 G
  523. / A3 h- p* g/ T9 k9 q1 d" N
  524. /*!; k; s1 D1 e# c" V5 D2 k4 W
  525.    \brief  Get general purpose I/O port.- i3 b8 \+ a( s4 m. J- l$ j
  526.    \return GPIO port., ^3 a3 E3 E, O' H" z; h4 ~
  527. */
    # ^) {1 Y' T- r8 A
  528. XGpio::GpioPort XGpio::getPort() const* w$ h3 U8 R4 D! a3 r
  529. {$ K( ^6 d5 ~2 l  |' f
  530.   return port;  x+ c2 _( `  y' U3 ?$ j# D5 A5 }
  531. }
    5 z3 m  F8 A4 s6 j

  532. ( X  R2 Y; I- ^. p# H6 X
  533. /*!
    + w$ a& f3 e1 Z  S$ X" j3 R4 O
  534.    \brief Set general purpose I/O pin.
    4 z# U0 T5 i8 R. D$ _; G
  535.    \param pin: GPIO pin.
    ) Q- U- n. D9 o; a
  536. */) r8 t8 e# X, d; D# k3 Y+ W7 X, j
  537. void XGpio::setPin(GpioPin pin); l( K, l5 X1 l$ ]  g+ f2 e: G
  538. {7 w: Z: N* k; Y
  539.   if(openFlag != true)
    0 K2 o% f# y  T" c
  540.   {
      W- X2 c5 m4 n6 b0 p7 W( s
  541.     this->pin = pin;
    # m% g2 v) x6 L3 d! w4 D! A
  542.   }
    3 G$ x6 v& s' p7 i
  543. }
    6 V% I% j: \8 [" w

  544. + k) @  K1 t% T
  545. /*!
    " r. `: O; Q) a, r$ U; m) o2 x
  546.    \brief  Get general purpose I/O pin.1 P( M  f+ k- P- J+ [% C, `$ y
  547.    \return GPIO pin., h% m1 N! y9 K: c- B1 S
  548. */
    - e1 A( Z; ^# {. g. W% o
  549. XGpio::GpioPin XGpio::getPin() const; c* ~5 J7 h. Y! J+ B( \
  550. {- F2 Z7 `% F, q" Q- ]9 i
  551.   return pin;
    3 a. Y+ U2 G9 [  k6 [3 C: ?
  552. }
    6 X! E, U9 {0 w% d! l% V; [9 Z
  553. " Q) \4 v" W0 ~$ p: ]' Y
  554. /*!
    ; p$ s' z0 z& P% m) T, c7 }
  555.    \brief Set general purpose I/O mode." Y1 ~2 I9 R& U- q
  556.    \param mode: GPIO mode.3 u7 _7 c5 V; O0 z7 S
  557. */+ `- k* u1 |# P1 ?; }
  558. void XGpio::setMode(GpioMode mode)
    3 }, B. Q. n3 Y" S
  559. {8 d0 J( S$ {, L' {7 m: Y
  560.   this->mode = mode;9 Y; B4 ~8 H, n, P( a  s4 t
  561.   
    9 u0 f( B7 t" `3 w  Z' I
  562.   if(openFlag == true)% z) a$ E- p. o' W
  563.   {
    1 t9 A" K: b6 S4 N
  564.     LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, mode);
    9 g% P4 E( D) c9 c7 W/ G
  565.   }
    7 n9 @, R# k2 U% s: Y; s: f& [
  566. }+ v! \0 x1 _6 p, C& W" t
  567. / z- U' `/ L5 U
  568. /*!' N# h6 o% d; X* `/ w
  569.    \brief  Get general purpose I/O mode.6 j' t$ ?& w6 A- C
  570.    \return GPIO mode.5 p* @" i& m9 [) t1 M  W1 @
  571. */. {) R- I6 u' C! T
  572. XGpio::GpioMode XGpio::getMode() const- n5 E/ G4 y# `
  573. {5 Z5 a0 E! `5 O5 @
  574.   return mode;4 i) v  j, D- |. J% R" u/ d9 k9 `3 u
  575. }# d( @5 g! A" ~8 e. h( U

  576. + ]( f  W  E8 O. \; l
  577. /*!% a. g6 {' Y( R6 ]+ H$ F$ v
  578.    \brief Set general purpose I/O output type.0 G. l% n; s8 I4 w, F2 J) ^
  579.    \param output: GPIO output type.
    " N" [/ K, e5 }/ P0 Z
  580. */
    . Y" @& Z* e8 ]) [5 l& h. j5 P; X
  581. void XGpio::setOutput(GpioOutput output)" _) o9 n7 `9 l6 ~* ]  u, E
  582. {) s4 R+ N7 ]" y4 C5 `* O
  583.   this->output = output;& N7 p# b# r5 `) \6 _
  584.   
    0 \. }* P% Y$ Q  u  f
  585.   if(openFlag == true)2 {0 \0 b2 \) Y7 M$ j2 Y
  586.   {
    8 W# T3 T; ]- w8 Q
  587.     LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, output);
      s- H4 |. A. M& A( |7 c
  588.   }- d' @6 G/ [# ^+ \
  589. }/ U6 R& R, M% }/ e$ E0 }
  590.   W5 n/ _- ]) j0 P% V
  591. /*!
    " n8 i  j4 f5 i* h) \9 Y* n
  592.    \brief  Get general purpose I/O output type.
    4 x( Z( y6 N$ l; g# h1 [
  593.    \return GPIO output type.
    ' ?3 T+ f0 @8 A, Q/ J: C( T
  594. */
    ) D# A8 D' R6 V, i5 ?* ~
  595. XGpio::GpioOutput XGpio::getOutput() const
    1 ~% \: i. n$ S. B% ]
  596. {
    ; t4 L- S3 Y3 M( v
  597.   return output;( d; Q; _+ `2 v1 j% v
  598. }% y! W1 a( S* [! i
  599. + {* R% o3 J+ U5 V/ B) u1 H
  600. /*!
    7 q7 }. U. u1 s, o9 X  ^$ A
  601.    \brief Set general purpose I/O output speed.* m% I  F, }  T* {7 F2 F. L4 N
  602.    \param speed: GPIO output speed.8 d+ D( A6 d* i  H1 v7 f* W1 i
  603. */
    2 }3 Z. O( E9 d$ ?' @& [
  604. void XGpio::setSpeed(GpioSpeed speed)
    0 Q' C8 e" O! g! y- E- `& B
  605. {0 u! S" w# `' s
  606.   this->speed = speed;% b3 Z0 D' q! F9 _
  607.   
    0 w4 ?7 `8 V8 ?7 h
  608.   if(openFlag == true)
    % K' ]0 J0 m$ E' E( U
  609.   {
    ) }0 b3 C0 v+ s$ ^8 n
  610.     LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, speed);
    9 ~9 |2 d( ]* c* o, p
  611.   }1 b' y: b: a" g  }! K
  612. }
    5 ?) o& B! O1 j9 T% _* z
  613. * U/ I( `0 R5 v3 w  F6 ^( M
  614. /*!0 b0 W; ?$ q) Z) b0 Y
  615.    \brief  Get general purpose I/O output speed.
    , B9 S& p# N) j3 {' c9 S% W0 o
  616.    \return GPIO output speed.% E5 x5 ]+ L' ^  a
  617. */2 f! {# d. h- c! w  L- r! s. O
  618. XGpio::GpioSpeed XGpio::getSpeed() const
    2 r1 w; L! n8 k7 ], X7 X3 z
  619. {3 o+ e. T/ g- s3 u5 y0 J
  620.   return speed;
    4 ]* w5 C; J1 S
  621. }
    : [0 \" F3 h9 r
  622. ) {0 g( v! N( p% t0 O! V( v
  623. /*!
    / r. Y* k9 _, ?8 p
  624.    \brief Set general purpose I/O pull-up/pull-down.
    * ?9 G, w; [; _! }( Z# Z9 O' L4 u
  625.    \param pull: GPIO pull-up/pull-down.
    5 p, K; s. G7 k
  626. */  A& p- T' y; _* T, M: \
  627. void XGpio::setPull(GpioPull pull)
    . N; b3 `) f0 ?0 O1 |9 {! G/ Q, I7 {8 i1 S: r
  628. {
    # a8 [& S" r0 n% b; t, S/ @8 C( n
  629.   this->pull = pull;* E  ]8 e1 x' e( p2 \  g
  630.   ! \/ g' J4 e% G/ \: V- q7 d
  631.   if(openFlag == true)( h+ f, `( A" M2 L- \
  632.   {7 o# [+ K: C5 C7 c7 C
  633.     LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, pull);
    , d7 Y: x7 l0 g3 Z
  634.   }# q) _2 D' K. B. J2 S
  635. }
    ; k* e, h. J* Q( _% a" H& s, |& F
  636. 8 L: h6 q8 ~' o* x: M
  637. /*!, I! ~8 I3 _5 N" Q. v: _
  638.    \brief  Get general purpose I/O pull-up/pull-down.
    , [4 q" _# I4 ?/ O* o
  639.    \return GPIO pull-up/pull-down.; m5 ~( i  `, g! U
  640. */
    $ A3 Q6 ^- t( H
  641. XGpio::GpioPull XGpio::getPull() const, r( B& j- N8 W
  642. {. y: w6 t$ L3 z' G* w
  643.   return pull;/ u+ Z1 ~4 _1 a! F
  644. }
    - \( I, N: C; g# @7 e4 e% K4 _% K1 B

  645. ' h* V9 `. E- X1 B! k
  646. /*!
    . q* I- w1 S' ^! o* o
  647.    \brief Set general purpose I/O alternate function.) ?: m% o. W$ U% W
  648.    \param alternate: GPIO alternate function.
    4 D, Y( \* x+ D' r
  649. */4 r  v7 M7 x9 ]) A' |  ~) z
  650. void XGpio::setAlternate(GpioAlternate alternate)* e+ f9 D3 @# w7 Q
  651. {
    9 J* k1 I2 w& T' x. s- Q
  652.   this->alternate = alternate;" K) U: f2 I% m- p: P* T& v( {
  653.   ) |2 O% w( r7 ?; _5 I+ N( Y
  654.   if(openFlag == true), }9 X5 _# W' q# [* B
  655.   {( M' Q  }  ?8 p; e: x
  656.     if(pin < Pin8)/ ~  z6 i' a9 w& m% O" t
  657.     {
    ! S* k6 P- V7 E( Y, A
  658.       LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, alternate);
    9 I+ }# W- i2 E$ W+ ~: B& P
  659.     }( \& ~" {; S! e' ^# ~
  660.     else' L4 Q% |: D+ Z7 r
  661.     {
    ! \) S) ^. a8 s( x. ^
  662.       LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, alternate);" f# P# R' v) K  C0 R+ s
  663.     }0 a5 U% Y- r) |9 C) r: J5 U4 ^9 z
  664.   }
    1 V9 ^& V+ C5 m+ J! B1 V7 K
  665. }6 I+ g: h. b" N) s" O
  666. # Y& K' T7 x9 b5 e. ]7 U2 A$ {* ~$ R
  667. /*!  c8 H6 M6 t' a% g7 O
  668.    \brief  Get general purpose I/O alternate function.
    0 |/ q7 J/ d8 m  x
  669.    \return GPIO alternate function.0 t4 {  r- @/ _
  670. */6 B  x5 E4 R0 X8 i9 u
  671. XGpio::GpioAlternate XGpio::getAlternate() const) |% e2 R0 }8 h8 w" E
  672. {0 F7 Y! ?: b' g) }0 h
  673.   return alternate;
    ) l% n! D" Q: H0 g8 h, t
  674. }8 B: J, I8 S3 y$ l! {; L- o
  675. # y- F! O  r# e7 O0 [
  676. /*!
    2 K( z1 B" k0 j$ ]! w# _
  677.    \brief Set general purpose I/O level status.
    * P9 R# D) z% R" p
  678.    \param level: GPIO level status.( L9 B# L) _+ e
  679. */
    ; t6 e  ~2 k0 j  v/ `1 z7 n
  680. void XGpio::setLevel(GpioLevel level)6 q8 J5 f" o4 |0 Q/ @* h5 l! a
  681. {
    ; O. a  C. {: ~4 q( B! b' Y3 ?$ f
  682.   this->level = level;; T. F' D/ H. H" q6 i3 B
  683.   
    9 z7 A9 [8 u$ H2 L7 {
  684.   if(openFlag == true)" ~& F  \- T$ k- u% Y
  685.   {# X$ H, o5 Z- g. f1 }2 G8 B
  686.     if(level != LevelLow). y3 f, L7 @+ \+ h, N9 [
  687.     {
    6 Y, s9 s1 u7 Y' X6 w" G5 Z% L
  688.       LL_GPIO_SetOutputPin((GPIO_TypeDef *)port, pin);
    " d. ~# A9 q5 w4 y  g- e
  689.     }& [3 R) a- C9 @, r
  690.     else& K4 I- Z) k( c* y( y5 N$ O" ~
  691.     {
    * `5 n) t/ s! ^# w2 x- |
  692.       LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);+ l5 M$ x1 P* d3 m8 b- S8 E
  693.     }( G" |; V" i, q' O
  694.   }
    ( e- [5 Z; [- x* T3 W* M
  695. }
    % U9 u3 g3 p3 F+ n. [

  696. 5 v# H4 U# E% D. r
  697. /*!  O  A: Y" c9 ?2 n# D$ A
  698.    \brief  Get general purpose I/O level status.
    $ R" ^( g, P3 r9 K: z
  699.    \return GPIO level status.
      L) J5 p3 I, I: ]' L2 O' k/ E
  700. */; _7 ?. n% B, L
  701. XGpio::GpioLevel XGpio::getLevel()
    ) T- Z2 P8 B& t, L
  702. {) L1 U4 D: ^. q5 \1 ^
  703.   if(openFlag == true)  L* R9 v3 W, ?/ z5 X! h! m! s7 Z
  704.   {
    " O- h& @. q, X$ M3 X
  705.     level = (GpioLevel)LL_GPIO_IsInputPinSet((GPIO_TypeDef *)port, pin);9 ?4 V6 k. j) y$ W3 i5 ?, e2 ~
  706.   }, z: {6 @3 |/ I5 Z  Y4 P- f
  707.   , l  o/ `% c" S& h4 B0 N5 ]9 A
  708.   return level;
    + Q6 r# p, I- P# w1 l# }
  709. }: e* B, |2 ?; m$ D: {- n+ A7 z5 C, K
  710. ! ^; L! ]0 p9 G0 M8 A
  711. /*!
    7 {7 l4 s$ ]7 i% v' _# g) {0 w  ?
  712.    \brief Toggle general purpose I/O level status.* b8 `( g4 n) ?- ?2 U. l
  713. */
    ) G2 @3 k, e! u8 g% Q
  714. void XGpio::toggle()0 I/ u0 q" K; M2 _5 |% L* O) T+ Y3 z
  715. {# y  s3 q4 o7 l2 b3 N
  716.   level = level != LevelLow ? LevelLow : LevelHigh;1 p& v- {/ ~/ ]7 ^  t% r0 N6 l
  717.   
    ; c" D& o' x5 j) T6 g
  718.   if(openFlag == true)& j5 ]5 [: H, d  T4 r
  719.   {
    7 E6 k& \) R  _; V. K( a- c
  720.     LL_GPIO_TogglePin((GPIO_TypeDef *)port, pin);; ^  b. p& n3 {" u& D+ T
  721.   }# y$ y6 `. c: u, j  r; k& Q. [8 }2 H
  722. }- G: O; E/ s2 D! V& e

  723. 0 ~' ~- G8 ^3 ]& J" ?- ^
  724. /*!5 j8 d  g. ]0 r
  725.    \brief Open general purpose I/O pin.2 W/ R# A7 ]  A
  726. */
    7 p" [. D0 t8 r. C0 A# H
  727. bool XGpio::open()
      [9 J3 b/ k/ \+ A% X. C
  728. {9 k8 n* Y* e* `. x" B5 W+ O0 K8 D& r
  729.   if(IsSetGpioPinFlag(port, pin) != true)6 N3 a6 A, [6 _& x5 s: o
  730.   {! ]% x" q% ?3 j" e
  731.     if(IsHaveSetGpioPinFlag(port) != true)
    ' k% {( Y$ d2 G3 M
  732.     {
    . v" T/ _$ V" T
  733.       OpenGpioClock(port);
    2 T, K9 q6 W) A9 [5 B/ T
  734.     }* I5 A3 r/ r9 m. u
  735.     4 G$ t/ r; N9 Y& n9 k8 _
  736.     SetGpioPinFlag(port, pin);8 r0 \0 |. v! v# X
  737.     % L! P3 {6 y/ B6 v
  738.     LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, mode);
    % X2 t5 E0 G. u( J! k- l* }! G, j$ L
  739.     LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, output);
    $ F. ^; S, @% O+ a: p( ^" z: {6 R
  740.     LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, speed);0 N, h$ h" Y4 @$ f
  741.     LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, pull);, t4 L% P& I2 S
  742.    
    * D" e$ E# h9 P
  743.     if(pin < Pin8)
    : K$ \+ w) c( v4 U" n2 x1 h0 L. M
  744.     {* G3 s1 L  ~1 Q4 b" J! ?1 e) s) [: T
  745.       LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, alternate);
    - b7 z8 n; M- W' K( d
  746.     }) K1 y/ f; a, q; A
  747.     else  v) h4 f+ Q! S1 u3 H
  748.     {
    ! \  d/ [2 c9 O; W
  749.       LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, alternate);
    3 X' e; D: ~0 t
  750.     }3 H: h, j8 U* X7 e2 ^% ~" H
  751.    
    ' j7 b6 N4 V: N5 E6 K
  752.     if(level != LevelLow)
    * K6 u% q1 T+ }. S, t- i  D8 ]
  753.     {
    ' Q) v; J8 c4 X, Z) j) O
  754.       LL_GPIO_SetOutputPin((GPIO_TypeDef *)port, pin);) L! D, J; z  n" H+ U* l
  755.     }2 b7 q0 ^* l7 ^  ~! D
  756.     else2 J% Q6 U' z  q' l' x
  757.     {% b8 g0 u2 U% R9 {8 g
  758.       LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);( @& P8 {9 W4 [7 k# M
  759.     }6 W& ]) O" ?! n
  760.    
    * x5 H% }  c( H( [$ n! C5 v+ z7 W& [
  761.     openFlag = true;! \* f. }. N1 K- Z9 o0 s7 F
  762.     5 S. s4 T% }4 s5 H* }9 ~7 G
  763.     return true;  m) U) X' p: k: c1 ~+ ]" Q
  764.   }% n7 m, ?: N9 `! f* l2 Q
  765.   else; H+ s* o7 ]! d- U/ V
  766.   {
    1 [3 u' W) k3 t4 G. k9 U9 D
  767.     return false;
    2 s- x  e& ]$ d: {/ j
  768.   }
    , t( I3 z5 q4 s, ~6 z. J# F4 o# n
  769. }
    0 ?+ b( `% ]4 s4 c$ P& _

  770. & p* `! |6 o  J4 l
  771. /*!
    - _, G: F$ ~6 d% H
  772.    \brief   Close general purpose I/O pin.; k* c7 G& l8 ^6 w
  773.    \details Restore generic I/O to its default state(input mode, push-pull output,  V: e5 d+ g7 Q$ E  [
  774.             low output speed, no pull, alternate function 0, low level).% a, g# D; w' w* m- v5 v8 c
  775. */
    3 S1 U. w% r+ ~4 n& p" p6 @
  776. void XGpio::close()
    ; _1 O0 V8 W+ O" \: U1 V% S) ~
  777. {) y) [" e) Q& g1 Y! J' |
  778.   if(openFlag == true)
    , p* b+ @, B! m8 }" f7 ?# H
  779.   {& }7 e" A4 P+ Z6 q: g$ G5 ]2 v
  780.     LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, ModeInput);
    # W; J2 t8 ~& X# M9 J
  781.     LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, OutputPushPull);
    " m7 V0 C. r- D- V9 G4 C7 s+ c
  782.     LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, SpeedLow);. U  n# n# ]8 [: F. N6 Z' b* O8 l$ U! ~
  783.     LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, PullNo);9 p! Q. n- ~0 C+ w. L! [
  784.    
    1 x" n- \- V( g. Q8 C7 y
  785.     if(pin < Pin8)
    9 h: R* V9 r4 n# P& i# x: Q' }
  786.     {
    6 j& g  J! l" W
  787.       LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, Alternate0);
    3 y' ~9 d+ p6 K( ?7 u
  788.     }
    4 A& ]. u/ k: a5 q! Y% z1 n. k: Q+ o
  789.     else4 g# V* `: \/ f/ B* j& H
  790.     {
    $ q# j4 r' L' ~1 l. y& p- p. h
  791.       LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, Alternate0);8 U; F3 ?5 s9 w6 y. B
  792.     }
      m0 r1 b0 |3 C. t; r/ F
  793.    
    1 L& V5 z% F) z. t, R
  794.     LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);
    3 x2 _6 q& p3 ~4 \! o
  795.     + z4 \* d4 |% s/ P4 y1 d
  796.     ResetGpioPinFlag(port, pin);  k% f, q+ q4 \# K
  797.       t% _- v; R5 [7 X# v! g, f$ n
  798.     if(IsHaveSetGpioPinFlag(port) != true)$ x0 }& l5 U& k1 a' m
  799.     {& X9 b1 w+ I: m
  800.       CloseGpioClock(port);
    7 y8 T' Z6 M# \  Y1 E
  801.     }
    ! E7 C  ?5 j/ }+ ~9 ^4 U
  802.     ) M# _/ [. y. r5 x6 r, h
  803.     openFlag = false;7 _, ^2 A$ g1 R- A; H
  804.   }
    ; I* n! z' ^' h4 \! v
  805. }
    ' q* K3 m3 G' V  W" l4 j
  806. : O; z0 D* |9 ]9 o
  807. /*!/ y3 z: s% w+ J2 I" i" ?
  808.    \brief  Is the general purpose I/O pin open?
    ; Y" M. t, w3 j2 u* u
  809.    \retval true:  General purpose I/O pin open.& D$ |& W8 g% c+ L; R
  810.    \retval false: General purpose I/O pin not open.
    5 r4 R$ _7 g2 u6 }# a( V
  811. */9 j: J; _% k) N/ B* [5 J; _
  812. bool XGpio::isOpen() const4 I7 m4 {4 v. ]1 i  ~  R
  813. {
    * ?+ y4 j% [9 B: R1 f2 A% p
  814.   return openFlag;3 T/ d. U, S1 A6 D% O% N
  815. }/ x3 B; E8 G9 y! e" x1 y4 j1 N( e
复制代码

, N1 L% }- M% t# W8 w+ N# q例程- E8 i6 K1 b$ S; K2 r0 M2 o8 c
  1. /**
    $ [' M8 X6 U+ ~5 F' k% L. C7 p
  2.   ******************************************************************************9 Z2 @+ R/ C4 N9 y: Q
  3.   * @file    main.cpp, k. s6 N9 t* V0 E) S' C
  4.   * @author  XinLi
    + V# m; d; I6 v( B
  5.   * @version v1.0, N4 a9 j3 u$ w6 s
  6.   * @date    20-March-2018
    4 ]* U; T/ U* N( i
  7.   * @brief   Main program body.* Y) p8 U% x, W; B. i
  8.   ******************************************************************************
    $ [% i* y- o* }. z, F) k9 c9 ?
  9.   * @attention
    7 ~& {4 {& ?5 x% ]0 J1 J* T
  10.   *
    0 f& D. C' }* {; ^2 A- V4 T# M
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>
      n9 s9 j( F+ _, a) `. L
  12.   *- @' r0 x7 m" `9 G+ l
  13.   * This program is free software: you can redistribute it and/or modify
    ) \* i$ o8 q1 F. d$ z- X0 z) n: c
  14.   * it under the terms of the GNU General Public License as published by
    4 Y2 h* m3 X' z6 Y# q
  15.   * the Free Software Foundation, either version 3 of the License, or
    ; P* S5 c3 R  h6 G2 ^
  16.   * (at your option) any later version.5 d+ @1 K7 R# ~. _
  17.   *0 A" N: k; i/ P; |! }
  18.   * This program is distributed in the hope that it will be useful,
    : a2 O8 g2 U; x3 b
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    0 {: a/ b% k9 O; `! k4 a# w
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the$ k2 h9 J: S6 B; T% u' w
  21.   * GNU General Public License for more details.
    - H5 l, k& n* }/ T" D! E( _
  22.   *' o5 s+ F  x# f- p; A( y& g0 }
  23.   * You should have received a copy of the GNU General Public License6 Y3 T: D- j! \6 T# }% {
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    + {4 G; a0 B7 Y4 B0 \
  25.   *
    + _9 d' U$ R3 F3 S! e5 t# o0 }
  26.   ******************************************************************************$ ]8 o% o: Y% u. K
  27.   */% n, q# l$ V# C5 X, n) e$ J3 s
  28. " m9 \+ U" u: S
  29. /* Header includes -----------------------------------------------------------*/
    - c; E4 P/ u! E( `, V5 j+ K
  30. #include "main.h"* w* ?7 U9 c# P$ z; ?! @5 o, k
  31. #include "stm32f4xx_xgpio.h"
    + b6 u; U2 |/ {$ h8 y8 C

  32. 9 P+ d; E, z1 G
  33. /* Macro definitions ---------------------------------------------------------*/
    ( v% Z+ T8 W2 M; Y) H1 S
  34. /* Type definitions ----------------------------------------------------------*/' P: v2 n3 Z% Y
  35. /* Variable declarations -----------------------------------------------------*/$ i1 R: l/ A  O* T3 a+ z3 Q( [
  36. /* Variable definitions ------------------------------------------------------*/
    9 M; m$ a( e8 T1 D# R  ^" z
  37. /* Function declarations -----------------------------------------------------*/
    / G$ X+ N  `" l) E
  38. static void SystemClock_Config(void);
    / J  U5 v0 c  U6 T1 W% v  @
  39. . a* ]7 ^9 p& X% H
  40. /* Function definitions ------------------------------------------------------*/
    / K/ e/ U- B$ ]0 W/ i

  41. 2 R0 N7 \& b6 T
  42. /**" i4 t/ d3 T+ |7 _
  43.   * @brief  Main program." [0 D  O) x3 L0 k+ m
  44.   * @param  None.8 P5 \% l5 {& F1 `- U8 ]$ O" A
  45.   * @return None.
    ! V/ e! W, C/ P/ |+ C2 R
  46.   */8 e) g9 J% r% q
  47. int main(void), }* D1 y: `4 l# n9 [; E
  48. {
    3 C( q( d% p' f2 N0 D  O
  49.   /* STM32F4xx HAL library initialization:
    / t1 P) t' c! i: W$ u: Q4 \
  50.        - Configure the Flash prefetch, instruction and Data caches! N- r; h" G9 N0 y8 b* S/ T
  51.        - Configure the Systick to generate an interrupt each 1 msec
    5 J% F5 z( F5 S0 `
  52.        - Set NVIC Group Priority to 4
    . s/ W8 k0 M5 ^/ ]: ?% h; r
  53.        - Global MSP (MCU Support Package) initialization
    ! V/ F# H: x# {
  54.      */" c. D! h5 p4 ~9 ~% l6 m
  55.   HAL_Init();
    6 [& T5 }' h" E  W( k  }
  56.   6 F9 v/ _* @- ?2 J$ W9 d
  57.   /* Configure the system clock to 168 MHz */
    1 k- k+ t6 n) q
  58.   SystemClock_Config();. e7 L; R% m2 B
  59.   
    ' W# G# I2 ]# X) L+ \* Z
  60.   XGpio led0(XGpio::PortF, XGpio::Pin9,  XGpio::ModeOutput);
    0 }9 J. x; ?. A" j
  61.   XGpio led1(XGpio::PortF, XGpio::Pin10, XGpio::ModeOutput);5 X! i+ w# X! |# m: A  q+ W5 t
  62.   * X* @( w3 L: f" u, ?4 a
  63.   led0.open();
    ) r; U0 N2 K, B$ j# o! I
  64.   led1.open();% a7 q6 X6 \5 Z
  65.   
    7 w8 k" v4 d! d. U
  66.   for(;;)# f3 o8 L. Q. u
  67.   {
    : Z) h5 q# n* e% f: G6 T
  68.     HAL_Delay(250);
    - ^5 v8 a' q+ {9 }3 m  \, t7 A' W& Q
  69.     led0.toggle();
    " j9 ]" F7 G; ~/ Z. U* x: u
  70.     HAL_Delay(250);. h% u% H$ z8 U5 V. Z! L: G
  71.     led1.toggle();! v7 D2 R' ~, Q: p
  72.   }
      F3 G5 m, H* d# T
  73. }/ r0 X( c2 y; f  i; J4 ]
  74. 5 v8 a+ J' Y# y3 F( \
  75. /**
    % f- J0 X' e/ ^1 [& c; k
  76.   * @brief  System Clock Configuration* r* |& `( H! d7 D4 b
  77.   *         The system Clock is configured as follow :
    6 _+ i  V2 v2 N
  78.   *            System Clock source            = PLL (HSE)
    ) Y6 P# U7 M3 d4 s  U" l
  79.   *            SYSCLK(Hz)                     = 168000000
    8 ]7 T2 v; G3 J) `  [: k
  80.   *            HCLK(Hz)                       = 1680000008 C  y% Q+ y1 ]" {& N+ q& r
  81.   *            AHB Prescaler                  = 1
    / }' F9 u, D- j# M1 d
  82.   *            APB1 Prescaler                 = 42 i! Y; B  P/ t) @
  83.   *            APB2 Prescaler                 = 2
    3 j* e5 z. N$ B; A- u
  84.   *            HSE Frequency(Hz)              = 8000000
    " Z1 \: x0 O$ S
  85.   *            PLL_M                          = 8
    + O3 Z  p8 o, E
  86.   *            PLL_N                          = 3362 s  J( x7 F' r2 }) k9 v1 J4 @5 x. a
  87.   *            PLL_P                          = 2
    1 c% G3 A- i% F5 c+ A5 V, x, ?# H
  88.   *            PLL_Q                          = 7
    5 U: G, J" ~4 U+ B
  89.   *            VDD(V)                         = 3.3
    + [  [9 M$ s/ ?: U  N6 V: E+ O
  90.   *            Main regulator output voltage  = Scale1 mode
    - a8 I! v& u- R
  91.   *            Flash Latency(WS)              = 5
    + x, w& i9 I3 Y- l  p) K; w0 s
  92.   * @param  None! I5 a: P: j0 V  V2 |( k
  93.   * @retval None
    2 x* ~' G# T/ B8 h
  94.   */
    . z8 @, G" C  M5 g* i2 E3 Y; ]
  95. static void SystemClock_Config(void)% K3 }" v: z+ O2 C/ V
  96. {7 I. M3 x$ \+ C2 G+ v- Y# W* Z
  97.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    0 O! L8 Y9 }# Z
  98.   RCC_OscInitTypeDef RCC_OscInitStruct;( X2 l$ Z- A5 I- G# k) b* a
  99. 2 X' L3 V7 L0 c) S. N5 |: A. e
  100.   /* Enable Power Control clock */  d9 E; V4 _& ?0 J" f+ W
  101.   __HAL_RCC_PWR_CLK_ENABLE();
    & L) Q, f3 }9 P) A9 {$ u
  102.   c5 `# @+ }1 R) d' G
  103.   /* The voltage scaling allows optimizing the power consumption when the device is % G2 ~5 L1 m2 l( h/ N: ]  h
  104.      clocked below the maximum system frequency, to update the voltage scaling value ' ^# i" D) V' O( k# l$ }
  105.      regarding system frequency refer to product datasheet.  */! \2 L7 M/ @! h; p! J! c  d
  106.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    : X+ I; p2 m# l" ~* p6 G
  107. / G* e) J+ E7 z6 B2 p/ j% V
  108.   /* Enable HSE Oscillator and activate PLL with HSE as source */2 |. J+ X* A2 ~; E6 c% N* X
  109.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;8 k" L1 {- `7 e" Q8 h9 @" v- ^
  110.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;7 j9 X. @* K% e1 I* e$ R
  111.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;: Y6 I0 @* x# c& _3 P6 d1 V
  112.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    ! u2 o0 \" o6 H8 R& N9 B5 [. d
  113.   RCC_OscInitStruct.PLL.PLLM = 8;
    7 Z% U6 K8 a5 p3 X/ _/ M
  114.   RCC_OscInitStruct.PLL.PLLN = 336;
    3 a' t1 ]6 ]4 b5 `
  115.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    8 p4 s8 k. l0 ]- V, K
  116.   RCC_OscInitStruct.PLL.PLLQ = 7;
    . o. `2 D2 p' M
  117.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
    ( y8 j6 W# O0 `4 ~0 i
  118.   
    ! l2 G. \- m( ~, h- ]  y
  119.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 * ]6 [' O. `) N9 M* V4 ?' v/ k
  120.      clocks dividers */
    ( ?3 \& f$ J% K% y8 o
  121.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    . y1 X% j# [( Q  j6 S" B) |% w  Y
  122.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    % H! f: r5 O& F1 F: [
  123.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      C9 s: P6 e, B# L" H2 T
  124.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  # l; J! ^% V' k( C/ J; B9 Z
  125.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  ; K% ~' d( X5 U7 I7 m% z1 E
  126.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
    0 Y/ z7 j: w; B4 S7 O

  127. " ~# h5 t9 f0 Y4 ]
  128.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */9 u# T+ f# N9 U
  129.   if (HAL_GetREVID() == 0x1001)& `# G' `8 `: |9 L
  130.   {
    / R6 i4 f" K, f. I2 s# X
  131.     /* Enable the Flash prefetch */" d; U2 ]4 _+ C0 ], Y
  132.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
    ; ~9 J+ f: i  E/ q  W! T& A$ u
  133.   }2 u7 \2 W+ \# \, d. e" H6 L- T* l
  134. }
    / }5 B+ x+ d) x) W( d, G; ?. u
复制代码

1 i% M; |, a- \7 q9 T4 D5 A( Y归档链接" m  v, h' h! v& I
' g6 P) r4 N% u  o5 a, u/ x
STM32F4 C++ 封装库 之 EXTI

评分

参与人数 1 ST金币 +6 收起 理由
MrJiu + 6 很给力!

查看全部评分

赞 收藏 评论12 发布时间:2018-4-1 14:47

举报

12个回答
MrJiu 回答时间:2018-4-2 09:50:42
有点意思。。。局部封装挺不错的。。。
butterflyspring 回答时间:2018-4-2 10:10:06
技术角度上,非常认可,赞...产品角度上,何苦呢?
andey 回答时间:2018-4-2 12:55:57
提示: 作者被禁止或删除 内容自动屏蔽
hawk123345 回答时间:2018-4-2 13:56:36
mbed 做了这些工作
XinLiYF 回答时间:2018-4-2 19:15:54
butterflyspring 发表于 2018-4-2 10:10# v, z) k) |  h8 R. H3 Y8 l
技术角度上,非常认可,赞...产品角度上,何苦呢?

0 t; s# K! W% N5 w! u% e0 |用 C 语言想要写出容易维护的程序,远远没有 C++ 语言实现的要简单,更何况刚入行没有多久的新人去开发那,C++ 语言只要稍微学习一下类和虚函数,用到开发中还是比较容易的,然后后续的程序维护也简单了些。
XinLiYF 回答时间:2018-4-2 20:17:53
hawk123345 发表于 2018-4-2 13:56% r1 @$ h" I% }
mbed 做了这些工作

0 y) {1 x) ^( D/ a( c# |; o% \  I5 R是这样的,但是 mbed 的程序,当应用层的对象销毁时,底层的硬件,并没有跟着去恢复上电的初始状态,驱动部分并没有用 C++ 去实现,只是封装了 C++ 接口。不过 mbed 经过这么多年的发展已经到了 v5.8 生态系统也比较完善,也有一定的生产力了,看来是时候把它用在工作当中了
a110-130038 回答时间:2018-4-4 14:59:22
" p" T/ L0 h; T) j  Y6 e4 Y1 _! p
赞一个
zero99 回答时间:2018-4-17 14:47:02
感谢分享,请汇总到4月技术原创
# v+ {/ o2 J4 a7 t0 a- G) h$ rhttps://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
gh.huang 回答时间:2018-4-23 13:50:49
感谢分享,大赞。
wecreate 回答时间:2019-8-16 15:29:13
我一直是用c++开发的
! j" l& U1 l, z3 W% K这是我的类
, P4 O/ L9 n4 D  |# H+ S% {PORT:ORT(){};
( a( N' t& Z; [; D7 p8 vPORT:ORT(GPIO_TypeDef* gpio,u8 pin,GPIOMode_TypeDef mode,GPIOOType_TypeDef type,GPIOPuPd_TypeDef pupd,GPIOSpeed_TypeDef speed){7 V3 ^: l$ m- z1 g' Z6 C
if (gpio==GPIOA) PortNo=0;) H( s0 g5 }8 {
if (gpio==GPIOB) PortNo=1;1 T; y& z5 c) c2 H4 q2 Y8 _5 W6 x
if (gpio==GPIOC) PortNo=2;
) ^+ e- P: W5 c& I if (gpio==GPIOD) PortNo=3;
& a+ w$ j, x* d( N2 `; B, G if (gpio==GPIOE) PortNo=4;6 Q) u! V* h4 F. X: j$ s' O
if (gpio==GPIOF) PortNo=5;  o0 Z4 @9 |, a2 f) I6 n
5 E! L  g6 V; p3 @. J
GPIO=gpio;3 V" i/ F5 e  L3 p. d( `: ^6 ^
Pin=1<<pin;7 @+ G2 \7 D( T4 _' x" z
PinNo=pin*2;
% A7 i6 |+ ^; ^3 F  
0 f5 g/ V/ Z; Q/ _3 I" ?6 a! ]  RCC->AHB1ENR |= 1<<ortNo;: }  X$ _% B' z2 {
  ! {. Q6 A5 @/ Z
  setType(type);
4 z% V. m( E( c0 a3 B  setMode(mode);  G% ~, P+ m; Z0 V. b0 G! G8 w
  setPUPD(pupd);
( P) a! {6 G/ G9 o; Y& R$ r  setSpeed(speed);! `' `6 n; t* }& A( X6 s4 O8 M

4 ^  ?; c. K3 z  t}' L$ E- A8 W. `) [

5 a6 T7 h- b. K: A. N2 s; u' nvoid PORT:ow() {5 N3 B! u1 s) w2 c
  ///GPIO->BSRRH =Pin;6 V6 E  \$ x4 ?
  GPIO->ODR &=~(1<<(PinNo/2));% A4 p: X) _: \
}
1 k7 q* _0 z# Z0 i& ~void PORT::High() {! Z2 Z+ r  A  {( {; D
  //GPIO->BSRRL =Pin;9 l/ V% R% E* P# n6 h- [( @
  GPIO->ODR |=1<<(PinNo/2);6 p. o% a* p4 m
}' ?0 Z: d9 {0 ^, R8 @5 r4 s" r  x
void PORT::setType(GPIOOType_TypeDef type) {
& m! K1 T2 A  N  [$ q    //GPIO->OTYPER  &= ~(GPIO_OTYPER_OT_0 << (uint16_t)(PinNo/2)) ;
3 n+ n9 i" i8 l    //GPIO->OTYPER |= (uint16_t)(type<< (uint16_t)(PinNo/2));
9 N: }- X2 @. W" J3 N
+ m# O8 A6 x& P5 G8 t2 p  GPIO->OTYPER &=~(1<<(PinNo/2));
" E7 [: O, E' V, s& W& v8 C4 H  GPIO->OTYPER |=type<<(PinNo/2);
: J; z# @9 J6 ]) ]$ L6 f4 _5 }4 z}
) x3 [) q' f6 p0 L' }2 _1 A( {void PORT::setSpeed(GPIOSpeed_TypeDef speed) {
( F+ M, g: z% b! P5 e2 b4 L    //GPIO->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << PinNo);
  j5 _* V3 Z! S: v  p  GPIO->OSPEEDR &=~(3<<inNo);& F0 o* J+ B% m' _2 ^/ J7 C
    GPIO->OSPEEDR |= (speed << PinNo);
- n1 q) E7 t  W$ k}
% l! f3 u, Q9 T, D& F# @& Svoid PORT::setPUPD(GPIOPuPd_TypeDef pupd) {
! D" _8 ^  r! W: o7 x  //GPIO->UPDR &= ~(GPIO_PUPDR_PUPDR0 << PinNo);" R0 B5 t, p+ X+ \5 v
  GPIO->UPDR &=~(3<<inNo);
! g" ?1 x- Q; ^) s) p5 R    GPIO->UPDR |= (pupd << PinNo);8 ~7 ]& ?! @- t
}
1 b  [4 F; V, G: r6 C, Wvoid PORT::setMode(GPIOMode_TypeDef mode) {: h7 c* C) Y5 S# M& d9 n
  //GPIO->MODER  &= ~(GPIO_MODER_MODER0 << PinNo);6 `  W  l5 ?6 Y3 N5 s
  GPIO->MODER &= ~(3<<inNo);
0 N5 X# e- t! M$ H" e3 c8 \    GPIO->MODER |= (mode << PinNo);; m& C/ H% m+ s6 T- ?; O0 w7 @$ W
}
) E) K, @) T0 k! ~( E2 y8 |u8 PORT::Read() {' v2 E$ v: Q' Q
  return GPIO_ReadInputDataBit(GPIO,Pin);5 [' ]4 `+ m: l$ v: l
  //return (GPIO->IDR & Pin);; O6 `" G: L  |
}
1 r3 {7 t6 J" w/ g9 c
wecreate 回答时间:2019-8-16 15:55:20
还封装了 LED灯、LED单采、LED全彩、ILI9341,SSD1315,LD3320,SD卡 开关、串口、IIC、SPI、DTU、WIFI、外部flash,内部flash,LAN(w5500)和一部分传感器(温湿,pm25,负氧离子,SO2.....)1 i8 e" L. m( o6 [, K  q
支持 f103c8t6和f407vet6。
# O; C7 S. J9 s% S% F5 _0 q, Busart,iic,spi 实现软硬2种方式。
9 v" W- G% u$ U2 y
. b! I; E" M+ ?& S  Z$ H3 BLED LED_Running(GPIOD,10);+ U: v2 q0 H! N/ n2 }, X7 h, o
1 w& V2 n6 s0 v0 A6 U* H
使用 :LED_Running.Turn(true);点亮, LED_Running.Turn(false);点黑
1 I. n# }. p1 x( A7 e7 j; y) }, y, o9 u$ |
SWITCH wifiSwitch(GPIOE,9);$ Y; A1 u+ F, V) h; J# z5 [

8 i- J0 B& y+ {0 ]; T4 I使用:if (wifiSwitch.isOn) 是否开,if (wifiSwitch.isOff) 是否关,类里已经处理重复触发。
2 V0 n/ B, {) o* |9 U8 O' X) q6 e8 f7 D" Q5 e6 s
USART usart_wifi(USART1,new PORT(GPIOA,9),new PORT(GPIOA,10),0,115200);
2 A0 ?" u8 B2 ]/ v# N* c
9 P0 s# B: e: n6 s使用:usart_wifi.sendData(buf,8);
4 ?0 T3 m! i( H  S3 O# {9 n" X) O4 G, X9 m0 k' Z- m& h
SPI spi_flash(SPI1);或者SPI spi_sort(new PORT(GPIOA,9,....)软件模拟spi
4 a3 F( @; m! [3 D使用: spi_flash.sendData(buf,8);$ s9 b# o: g( x" S( i
1 `5 Q$ D/ r' q
IIC iic_Pm25(new PORT(GPIOC,9),new PORT(GPIOA,8));
# v3 k- i0 q  M' @! O0 YWIFI wifi(&usart_wifi);
1 y9 o/ q: Y& q; c( P' p0 ?% yDTU dtu(&usart_dtu);
* q% {7 d4 L3 p; R- I+ u- r% d2 SLAN lan(&spi_lan,new PORT(GPIOE,0),new PORT(GPIOB,8),new PORT(GPIOB,9),&LED_Lan);
. U$ Z6 b  @9 r7 J# b+ N' y5 v+ U- r. p# E) p; w5 V
使用 SOCKET tcp=lan.InitTCP();sock.connect();# e- c! z: p( J6 B  b; K
SOCKET udp=lan.InitUDP();sock.bind();7 J$ J2 m5 y0 `5 `/ X. u0 z
udp.sendData(buf,len);
  C9 L' i9 B  ~8 [5 s3 Z0 z内部自增加socket,2 y8 a, r( K( ?& V9 d8 j9 R  x

# h" H+ |- B! _6 ~) WEFLASH eflash(&spi_flash,new PORT(GPIOA,4));
$ j6 F* K" O) K8 {VAR var(&eflash); 变量管理,如果用内部存储,就定义个 MEMORY flash(&spi....)然后 VAR var(&flash)
. ]: p, s. q% P% z5 A* u4 w使用 var.setInt(key,value) var.getInt(key)
# G  V+ S; m' d2 I0 E5 S
/ m" e& w) z  J9 `# ]9 C& P* l# pTEMPHUMI TempHumi(&usart5);
5 F& U/ N# `- |ION Ion(&usart5); 温湿度和负氧离子,使用的是同一个485的 usart5口
* s: T9 a7 f& |+ @7 c! `2 DPM25 Pm25(&iic_Pm25); pm25用的iic的,如果是串口的,就用 PM25 Pm25(&usart5);2 h0 E# o+ @0 I$ }, D

6 ^' s& [1 U# a使用 Pm25.setType(厂家设备型号), 里面会处理,发送什么数据,接收应该检测什么数据。
. q/ i, M% |; ]
generalcircuits 回答时间:2019-8-17 09:55:22
感谢分享

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版