本帖最后由 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
- /**8 R' ~6 Q4 `/ K- c
- ******************************************************************************* W, G- }. U& |5 P2 Q1 y
- * \file stm32f4xx_xgpio.h" H% h/ a/ M$ K0 z' c& M& h
- * \author XinLi
: I+ F8 M% w2 ? \ - * \version v1.0' U9 E5 f% u# u7 R, c
- * \date 20-March-20184 [5 m9 B& O: ]8 R$ Z1 M- I/ @ k
- * \brief Header file for general purpose I/O module.* n/ q, ?# P, t% O
- ******************************************************************************3 ^" _2 @' |1 P# [
- * \attention
( k5 P) }2 B; O# N - *5 _& a" l; d' |$ x4 f
- * <h2><center>Copyright © 2018 XinLi</center></h2>
6 a5 ]# M) c4 G - *5 ~3 ~. t8 ^+ f9 n: t( Y. `
- * This program is free software: you can redistribute it and/or modify
0 C& H% I" ~: w& ` ?4 U7 X" l - * it under the terms of the GNU General Public License as published by
& R. c# W( Q. `: Y$ T - * the Free Software Foundation, either version 3 of the License, or$ k0 d1 x0 ~* s q, L5 r
- * (at your option) any later version.
2 h7 b7 Z8 J' Y- C- J - *
+ B1 s+ ]( f. U [' w' S - * This program is distributed in the hope that it will be useful,
3 f6 o* u/ _+ G - * but WITHOUT ANY WARRANTY; without even the implied warranty of
. }% P2 M6 i8 q4 { - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, |" p! }' ` z3 p
- * GNU General Public License for more details.
/ _* s' K6 R* n J: E3 L - *
`4 c/ ~6 w: L% }/ F - * You should have received a copy of the GNU General Public License
4 y2 ]4 _/ l5 v - * along with this program. If not, see <http://www.gnu.org/licenses/>.1 V' Q6 w: S& B
- *
& C( j2 v. u& K - ******************************************************************************
' R4 K( J/ w3 P% S - */3 z% }$ @& z" y& z
0 y' q& d2 H5 y* V) A0 r$ V- #ifndef STM32F4XX_XGPIO_H5 [, q4 G2 D7 a: L! l+ T' d, \/ U
- #define STM32F4XX_XGPIO_H
. B/ A( R y7 Y( @ - % v& J* }- X* p, J
- #include <stdint.h>! ]# H, a, B0 V, R& n! D4 b
- #include "stm32f4xx_ll_gpio.h"6 d6 x1 s4 @( k p- O0 y. Z
- ( d! a' O2 A* b
- /*! General purpose I/O module. */3 f! S3 R% c7 P7 L
- class XGpio7 w0 s8 m8 ?2 g) r' k1 [, f m
- {* h* }5 j- N* ~3 Z
- public:
7 g5 E& j8 o- e, m9 g" r - /*! Enumerate GPIO ports. */
% O5 v" ?% ]1 ^$ m7 V: l7 F( G" H - enum GpioPort, `' D5 ^% j8 n7 P$ H
- {% k4 y0 m: x3 x1 L) \3 L7 {
- PortA = (uint32_t)GPIOA, /*!< GPIO port A. */- N3 T, i$ V% M# A( n* m
- PortB = (uint32_t)GPIOB, /*!< GPIO port B. */
# Q8 H9 E, `) H - PortC = (uint32_t)GPIOC, /*!< GPIO port C. */0 _' s: K4 ]. ]9 B: b1 X4 E C
- #ifdef GPIOD( `5 Y; h6 B" R# t
- PortD = (uint32_t)GPIOD, /*!< GPIO port D. */0 Y( N# D' t- `
- #endif // GPIOD& [4 H- u& Z: Y6 ~
- #ifdef GPIOE
5 r: e. p8 x1 }6 M - PortE = (uint32_t)GPIOE, /*!< GPIO port E. */
" x: r, j+ W) {6 X8 `: f - #endif // GPIOE8 ]. b" N4 {! l( Q' T% ]7 ?4 ]8 f
- #ifdef GPIOF
8 s K& e6 Z, Z0 [* D: X - PortF = (uint32_t)GPIOF, /*!< GPIO port F. */* |& B! P ?; E9 G* a- w+ \
- #endif // GPIOF
* K, l, U8 x6 E$ P - #ifdef GPIOG: @- ?7 z4 B. r& x3 N0 x
- PortG = (uint32_t)GPIOG, /*!< GPIO port G. */+ k2 c' W5 M/ J6 m) b$ s3 y
- #endif // GPIOG a' e: B. \1 i; X
- #ifdef GPIOH
( ~! a# w/ {, { [- O. A - PortH = (uint32_t)GPIOH, /*!< GPIO port H. */. i! O& U( W# ]& J) `
- #endif // GPIOH. L6 @; {, T3 ]5 L
- #ifdef GPIOI5 g: J+ A7 b, q3 w, g
- PortI = (uint32_t)GPIOI, /*!< GPIO port I. *// W% O" X) T( H, R) s8 O5 A: V9 x' ^
- #endif // GPIOI' T" N# _$ I8 W6 K9 f
- #ifdef GPIOJ
8 `$ M' S; S. A$ P) P0 H4 ] - PortJ = (uint32_t)GPIOJ, /*!< GPIO port J. */
8 K* {+ Z# C* g4 _! @ - #endif // GPIOJ
1 f8 c# r- ]- r5 I' x1 J - #ifdef GPIOK* w$ m% E! \; Y! D, F# F
- PortK = (uint32_t)GPIOK, /*!< GPIO port K. */( }/ M Z3 u4 }0 X1 v, V
- #endif // GPIOK/ R1 D W/ ^ n( M. E" `' d6 e
- };+ y: g6 D/ u# W2 O" E7 Q0 L
-
# M) F0 t2 ^& i# s# h - /*! Enumeration of GPIO pins. */
% G5 F, @8 w' w9 ~ - enum GpioPin% x+ j3 }4 E; ^* j7 e
- {
1 n. e& [: _3 y: M G - Pin0 = LL_GPIO_PIN_0, /*!< GPIO pin 0. */
4 G( a& `& {4 a- g- ?0 D! Q - Pin1 = LL_GPIO_PIN_1, /*!< GPIO pin 1. */
) h n' I2 i" v N - Pin2 = LL_GPIO_PIN_2, /*!< GPIO pin 2. */
9 A' o5 @0 w0 {) h# K8 [- z2 Q - Pin3 = LL_GPIO_PIN_3, /*!< GPIO pin 3. */
7 c) R- }% I3 e' F' e - Pin4 = LL_GPIO_PIN_4, /*!< GPIO pin 4. */. r; p) s" E# u1 U
- Pin5 = LL_GPIO_PIN_5, /*!< GPIO pin 5. */
4 a2 K! F6 O" A M& U$ L$ h* q. V - Pin6 = LL_GPIO_PIN_6, /*!< GPIO pin 6. */! i/ j! [3 D9 b9 q( A$ |: `5 s+ J$ i
- Pin7 = LL_GPIO_PIN_7, /*!< GPIO pin 7. */
% B1 P) J# @+ \8 |4 D3 l5 v - Pin8 = LL_GPIO_PIN_8, /*!< GPIO pin 8. */
c9 c8 @2 U8 n - Pin9 = LL_GPIO_PIN_9, /*!< GPIO pin 9. */
# z6 i& |7 k, k! N, r - Pin10 = LL_GPIO_PIN_10, /*!< GPIO pin 10. */5 T+ S& g+ ]/ C# a/ ^
- Pin11 = LL_GPIO_PIN_11, /*!< GPIO pin 11. */
9 H0 b% k( f$ w* P* z2 V4 p2 c - Pin12 = LL_GPIO_PIN_12, /*!< GPIO pin 12. */1 l, }; n: r6 D$ i2 Y0 j
- Pin13 = LL_GPIO_PIN_13, /*!< GPIO pin 13. */
3 h* F' x' Z8 O9 {! Y9 ] - Pin14 = LL_GPIO_PIN_14, /*!< GPIO pin 14. */1 L' t9 U5 e7 b0 e) O* `
- Pin15 = LL_GPIO_PIN_15, /*!< GPIO pin 15. *// t+ F# f) {1 s" h5 Z9 ?
- };
' M# ]3 t8 `, \* J" q4 N -
% ?: a3 y q6 W( w( Z3 y- T - /*! Enumeration of GPIO modes. */
1 U8 z8 D; Y. W' w8 s) ]1 ` - enum GpioMode5 S7 }1 I5 m; \. ?. }) f' O
- {
# j5 i4 L' {. Q3 s8 d/ Z - ModeInput = LL_GPIO_MODE_INPUT, /*!< GPIO input mode. */
6 O& G5 V% k* r3 G - ModeOutput = LL_GPIO_MODE_OUTPUT, /*!< GPIO output mode. */
* q) s0 _6 y, _' v6 H o3 B - ModeAlternate = LL_GPIO_MODE_ALTERNATE, /*!< GPIO alternate function mode. */: i5 }' P9 |# H
- ModeAnalog = LL_GPIO_MODE_ANALOG, /*!< GPIO analog mode. */
% |" l; R1 ~. B9 V( ^, _ - };# P0 k4 ?$ d0 K2 ^- r
- . B! D% n# v' F& f& L
- /*! Enumeration of GPIO output types. */
4 h! m$ }2 t, V! p% x1 ?2 I+ a* @ - enum GpioOutput; E5 a$ q% ^( [( R/ k- x' N
- {9 u4 P7 D4 `' t, e( \
- OutputPushPull = LL_GPIO_OUTPUT_PUSHPULL, /*!< GPIO push-pull output. */
, l; ~5 @- @: N5 d$ |$ |! i! q - OutputOpenDrain = LL_GPIO_OUTPUT_OPENDRAIN, /*!< GPIO open-drain output. */- t+ l# K; F+ |+ h
- };
7 g4 v) @' S) o8 b, o" x -
& a8 X" |' i& \) |; a8 p - /*! Enumeration of GPIO output speeds. */" M. i$ l0 x, L
- enum GpioSpeed6 E( ~& e7 | o6 L2 j6 e/ y8 C4 n
- {4 e7 ^, i- B: w$ R3 Z
- SpeedLow = LL_GPIO_SPEED_FREQ_LOW, /*!< GPIO low output speed. */
* x& z" `4 e9 K7 _3 U& c - SpeedMedium = LL_GPIO_SPEED_FREQ_MEDIUM, /*!< GPIO medium output speed. */
% t- X3 w( n1 k1 }. f6 q& i - SpeedHigh = LL_GPIO_SPEED_FREQ_HIGH, /*!< GPIO high output speed. */$ b. W0 X& r1 E1 ]4 v8 F$ u H
- SpeedVeryHigh = LL_GPIO_SPEED_FREQ_VERY_HIGH, /*!< GPIO very high output speed. */! t9 F' \! i" P$ \7 g t
- };
. j5 q1 W O8 M- r - ( T# q+ W- l# H# ?7 _
- /*! Enumeration of GPIO pull-up/pull-down. */
0 Q3 t N( f! r# ]& e - enum GpioPull( r1 {; X; }! m3 r- _
- {" S! f" F0 k7 z/ v! B; e# g
- PullNo = LL_GPIO_PULL_NO, /*!< GPIO no pull. */
- _- t8 C* k1 ^6 U# Z' G( A - PullUp = LL_GPIO_PULL_UP, /*!< GPIO pull-up. */
+ G% n8 P2 m8 N! Y$ _. T% m - PullDown = LL_GPIO_PULL_DOWN, /*!< GPIO pull-down. */
- ?2 c" Q4 o b! b3 t+ {0 V! Z9 u; H - };
b) i. v! O# T- x6 {+ z -
: ~5 c, n6 _8 w( }) r: Y - /*! Enumeration of GPIO alternate functions. */& r5 p& J, I1 i( H
- enum GpioAlternate
+ \: h P* p- q1 C$ X5 M |, y - {% t- T0 x( J8 x# Y8 X
- Alternate0 = LL_GPIO_AF_0, /*!< GPIO alternate function 0. */
3 H$ v9 Z. ~& j - Alternate1 = LL_GPIO_AF_1, /*!< GPIO alternate function 1. */
) l+ R6 G9 [, ` - Alternate2 = LL_GPIO_AF_2, /*!< GPIO alternate function 2. */. u5 ?' y& M2 r3 Q5 m
- Alternate3 = LL_GPIO_AF_3, /*!< GPIO alternate function 3. */
8 {" k; c5 v( I: r6 r. b( X - Alternate4 = LL_GPIO_AF_4, /*!< GPIO alternate function 4. */
& S: |9 o: ` i L. _( B: q - Alternate5 = LL_GPIO_AF_5, /*!< GPIO alternate function 5. */: q2 N6 M% a! n/ h. Z: r
- Alternate6 = LL_GPIO_AF_6, /*!< GPIO alternate function 6. */
1 k' U- g6 n" O" t - Alternate7 = LL_GPIO_AF_7, /*!< GPIO alternate function 7. */$ r7 I* }, Q4 c& {* {7 N4 m3 D
- Alternate8 = LL_GPIO_AF_8, /*!< GPIO alternate function 8. */9 W( u8 r ^* m+ n1 ~2 U' |
- Alternate9 = LL_GPIO_AF_9, /*!< GPIO alternate function 9. */
1 h1 e+ p" C( R' o @5 Q3 M - Alternate10 = LL_GPIO_AF_10, /*!< GPIO alternate function 10. */* f# P. q6 I, z2 k; W5 {& n1 d
- Alternate11 = LL_GPIO_AF_11, /*!< GPIO alternate function 11. */4 h8 E" _8 ~& I1 E8 J
- Alternate12 = LL_GPIO_AF_12, /*!< GPIO alternate function 12. */1 d* J, h! Z7 w' B. ]" |1 i) \
- Alternate13 = LL_GPIO_AF_13, /*!< GPIO alternate function 13. */
3 E% A8 `* R7 Z) ]% ~ - Alternate14 = LL_GPIO_AF_14, /*!< GPIO alternate function 14. */% T2 e8 r. x; ~5 j3 u' o6 \1 P
- Alternate15 = LL_GPIO_AF_15, /*!< GPIO alternate function 15. */1 f1 P; T& V' E2 G
- };
8 `* t1 ~* a1 ]9 |2 o. _3 a. V% i - , P! ]5 C4 D( d) U
- /*! Enumeration of GPIO levels. */- X/ j% x1 T4 m7 ^. L0 {/ b& ]& N
- enum GpioLevel$ D4 N0 e0 Z. s/ b. V5 y
- {
6 r3 H1 h/ f% {) L* p: I( N. L - LevelLow = 0, /*!< GPIO low level. */
3 {" n# o- C) P7 j. k& l - LevelHigh = 1, /*!< GPIO high level. */
/ ?4 K$ T9 a: k6 H: O9 @ - };
6 I, y5 Q4 V8 [6 H2 L \4 n0 W - 4 A2 L5 R+ S e( s: `
- XGpio(GpioPort port, GpioPin pin, GpioMode mode = ModeInput);
0 X$ H: ~' K' e8 T4 D* G - virtual ~XGpio();
% C. |, j6 M7 g* E3 K. ? - + @: F$ h0 K3 k- C
- void setPort(GpioPort port);
* M6 e! K6 F1 i9 \& K - GpioPort getPort() const;5 u' _8 I8 l: p2 S. a5 }
-
% X, }4 s" t9 j, p - void setPin(GpioPin pin);
" i" W6 C# q3 X- c. L/ }7 K - GpioPin getPin() const;6 V0 U: I" {+ j/ s# M
-
g0 L+ _; N3 F: k3 @* I2 G - void setMode(GpioMode mode);" M; Q% z, d9 H4 ~ i
- GpioMode getMode() const;4 _$ F9 k8 C: }% T% s0 ]
- 6 |! S: T! N7 f% ~1 h
- void setOutput(GpioOutput output); u6 t G' x) ]6 P' ~; a
- GpioOutput getOutput() const;1 I$ J( i* r/ x8 w* u& Y. Z& B
- + j7 U, j3 ?, ] r: g( L3 j; Y4 A' N
- void setSpeed(GpioSpeed speed);
. K6 `, m" ~: b% o! O - GpioSpeed getSpeed() const;) G( O8 K3 m" K+ L5 c
-
0 _0 F/ M G6 {& \: V - void setPull(GpioPull pull);4 `5 ^) J+ D" G- K
- GpioPull getPull() const;
1 \. M% [- u9 n6 c8 S# b - X# e' M: h* J9 k/ M
- void setAlternate(GpioAlternate alternate);
3 U, N5 @3 Z9 d. t - GpioAlternate getAlternate() const;3 ?7 ^, w! H [7 c7 P. b
- 6 H# ]1 A5 e7 s
- void setLevel(GpioLevel level);; j- E6 `0 k: g4 N8 j& x/ q5 Y
- GpioLevel getLevel();
5 a1 h D9 _( R0 E - % V4 A0 c9 R2 |+ l
- void toggle();) T$ S0 p+ s# q8 r% I7 d/ m
- / X0 t, t1 x: G
- bool open();
9 [0 i3 c! r k* c - void close();# e+ ?4 n4 K: N+ i5 Y1 y; f) Q
- ! _0 {( Q a& y8 N7 Z7 X
- bool isOpen() const;
7 v5 T# u2 \9 X; p -
$ b% I" G, }2 P/ S1 e/ G - private:: E3 X0 B& o' O+ ?! f
- GpioPort port;
5 i$ x1 Z. x( l) X/ | k - GpioPin pin;" C$ {( L1 ~/ \ V
- GpioMode mode;
3 ?; B; U& q/ {; k - GpioOutput output;
1 l2 H; `: `4 @* \( W& O9 M, ` - GpioSpeed speed;
$ V! c! E# }$ Y( d( J T - GpioPull pull;, \* Y: d( S- H4 l
- GpioAlternate alternate;
/ {9 k7 {! k0 L0 ]7 V* C n% ~0 c - GpioLevel level;
$ _' ]' M" |8 P, G- o. F5 v - bool openFlag; c n# t: m4 I" B" F# S
- $ _) |4 R, Z* ^0 t# L1 y9 _* L, N7 s
- XGpio(const XGpio &) = delete;! P8 T5 l8 s& z7 z2 A3 {* ~7 W
- XGpio & operator = (const XGpio &) = delete;
& Q" s" A0 C, m9 P5 C - };
5 U! G+ S; I9 I
7 c" N2 {& r+ f$ ?' N- #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- /**
: N$ ?% C* m% F( a6 A - ******************************************************************************
5 y6 A2 u2 G" N& i! q - * \file stm32f4xx_xgpio.cpp
6 u) W; a- M/ v, O3 I# }, R9 g - * \author XinLi
# [4 o4 N6 @1 C1 d - * \version v1.0. D, P$ m ~. x/ c
- * \date 20-March-2018
+ }) A# F* p; N* s, a( w - * \brief General purpose I/O module driver.
3 `/ j. }8 u! T5 {, `, C$ @5 U - ****************************************************************************** V l1 r: {; H8 q: |
- * \attention
3 ^+ x3 N8 n( d8 u/ h - *; S* ~. m3 U+ Q
- * <h2><center>Copyright © 2018 XinLi</center></h2>7 z4 b- s' T# h
- *
- V, _3 p2 Y/ z0 S/ Z - * This program is free software: you can redistribute it and/or modify: O/ r' I$ }' \3 q
- * it under the terms of the GNU General Public License as published by
% n, A. |9 a; w" W! C7 t - * the Free Software Foundation, either version 3 of the License, or! @% D5 M% [) }1 Y/ O' b# {' E
- * (at your option) any later version.) [" ~7 ~3 S3 B; X4 |
- *
, X$ a, r. {- |" u h - * This program is distributed in the hope that it will be useful,
2 J, V# t; c3 X% u" A3 u! W - * but WITHOUT ANY WARRANTY; without even the implied warranty of' \0 I- s2 Y1 D
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% ]' N. w. K2 X
- * GNU General Public License for more details.
4 ^! [4 ~% }. r) D% p2 ?& k - *
x7 S! q2 [4 @3 N) a, p - * You should have received a copy of the GNU General Public License
; N4 a. @, {! L$ M: c - * along with this program. If not, see <http://www.gnu.org/licenses/>.* o, f/ C1 H/ G# a9 d' V
- *$ `1 v: t* z/ _6 O+ C& Q* Q
- ******************************************************************************. a$ \) I* x0 s+ U
- *// i9 {0 Z3 j& j2 q- i& U+ U$ A0 A6 }* q
- % }$ P7 ]" p7 u: D
- #include "stm32f4xx_xgpio.h"* U% S( Z- G- I5 }: c
- #include "stm32f4xx_ll_bus.h"+ H6 B& f1 p) p
, O; g/ A: ]) W/ n- static __IO uint16_t openFlagPortA = 0;
' R7 Y- |. ]% a- \* ~* z7 t; h4 z% G - static __IO uint16_t openFlagPortB = 0;9 F: z4 y, c3 Z' N1 C0 b
- static __IO uint16_t openFlagPortC = 0;
$ s& `8 C' J# T0 }/ u2 ?$ @& T( o6 T( B - #ifdef GPIOD
3 g* x& j) w" G& T - static __IO uint16_t openFlagPortD = 0;8 w( F9 J- W# c: c1 s8 V4 h
- #endif // GPIOD
* P: o" ~9 M& t9 [2 u2 G - #ifdef GPIOE
. o1 T1 `4 N" M8 ?4 Q3 j2 I - static __IO uint16_t openFlagPortE = 0;
$ j8 B; }2 p+ P0 t' ? - #endif // GPIOE: k5 ]0 J1 B @# D, u& S
- #ifdef GPIOF
/ o( x( |' ?8 H9 F6 }3 Q& i: S6 Q - static __IO uint16_t openFlagPortF = 0;2 G. l; B8 k6 Z
- #endif // GPIOF1 j f# s" p/ j! ~3 F5 k6 T
- #ifdef GPIOG+ U, |1 b! }. `- W2 p. e
- static __IO uint16_t openFlagPortG = 0;
! n( z7 P( k, p - #endif // GPIOG, x2 z& u# z* I* f
- #ifdef GPIOH2 E _7 f- W8 ^4 v/ z
- static __IO uint16_t openFlagPortH = 0;6 n: h" V) r& @( {; V( @" d
- #endif // GPIOH
: G& s4 S I3 e6 v1 ^$ K - #ifdef GPIOI
% K* J' C' f) b. d/ W - static __IO uint16_t openFlagPortI = 0;4 E) R( k4 [6 E+ ~
- #endif // GPIOI7 ~& [, w- Z; a( r9 e
- #ifdef GPIOJ
0 o1 a. u8 z$ Q& i8 Z - static __IO uint16_t openFlagPortJ = 0;" E" o( Z# Q( f: s. v
- #endif // GPIOJ
8 E {& |* H. P& C8 ^1 p) N6 P c, J3 \ - #ifdef GPIOK; o3 ?$ ^4 Z! z7 \. \
- static __IO uint16_t openFlagPortK = 0;
+ s' m2 w5 O. S0 X, {6 }1 z' b - #endif // GPIOK$ `4 V1 C) z, k" |' B* S
+ ~* k6 r g9 S2 ?/ S- /*!
1 [7 \+ t; h @9 O1 K - \brief Open the general purpose I/O clock.' Q6 v( c8 B" u% z" U$ e
- \param port: GPIO port.
5 T8 N! N# k4 t0 J* r - */
; m3 p( w8 w' p: y6 ] - static void OpenGpioClock(XGpio::GpioPort port)
2 q) t, N- ] C - {! ^5 X6 r# M. a8 h. q
- if(port == XGpio::PortA)
" E8 ]7 h% N. a% l+ W - { Y0 k4 t; q3 J3 N! N2 ]
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
& B$ m. m$ a, f- |* O' V: g - }+ U; Y% L: f( A& n4 S" X1 q
- else if(port == XGpio::PortB)( C9 q! z& {0 L" v5 R* P
- {. M# ^) t1 w9 E) Z& `
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);: v/ |3 r8 ]$ p. O0 z
- }
1 H7 t" O/ h' h7 y' F - else if(port == XGpio::PortC)
" |, @7 |% }& Y - {
9 v& m9 U1 d) g4 r4 g; I - LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
* o# I: ^. B/ o6 | - }4 K" m1 d+ H, `- S# d
- #ifdef GPIOD
$ k/ E. b! O. k7 f. w0 f - else if(port == XGpio::PortD) n- T, n- e' D$ G: d
- {# L9 `! U- ~; q c3 e9 C
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOD);$ o! ~; j7 ]6 \% u' ^- t+ F
- }
7 x* R$ S: r5 {: l% g4 n - #endif // GPIOD* [8 N8 v8 h6 ]5 `( ?1 x
- #ifdef GPIOE5 l5 X# }5 i( ~5 U! ~& a- F
- else if(port == XGpio::PortE)! m, j0 D% K7 Q+ G8 W; H1 O* A0 _
- { K* I7 w2 i, r, x! W7 H* {2 Q, G- D
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOE);' o" ]* F& I1 s8 m* G
- }
?. ]; s9 s1 H( k( @2 s" v) L5 m - #endif // GPIOE
' f0 h2 P3 ~$ z( @- B1 y6 ?. e. K; c - #ifdef GPIOF# b- Y' D0 g. G7 _5 e/ @8 B
- else if(port == XGpio::PortF)
- l5 B: x1 S6 S5 ~! t- D5 U- O" C - {
7 Z4 a$ K2 z- i, C; L2 W - LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOF);3 I/ b6 {# K. L; D2 g0 T
- }6 ^3 Q* a- m4 ^, d+ f# e) i2 X
- #endif // GPIOF: J* D. }9 O' n. G. o% \
- #ifdef GPIOG
: m/ J' d# ~7 m/ X- ^. P+ F- W9 ^ - else if(port == XGpio::PortG)! b' F; Z1 \$ U3 ~0 F2 d# K6 P
- {
9 A* G7 t, x- f/ v& Q9 F - LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOG);
+ s f" e* _' G1 H" D - }# ]$ ^( M7 q& `, y$ E! M I( w
- #endif // GPIOG
% K$ c \5 _% p - #ifdef GPIOH
+ x0 p- |% r* c4 s/ H - else if(port == XGpio::PortH)
5 K h& b T) H3 }1 o& l g0 P - {
T" v) ~0 _2 s7 g8 ? - LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOH);6 ~6 Y _* ?3 H2 P
- } [+ J% P2 h5 w4 O6 y4 y
- #endif // GPIOH; ^6 v+ I# Z9 Y) X
- #ifdef GPIOI3 x) [, d( X5 w" q& j0 b" {' X( m
- else if(port == XGpio::PortI)
( `5 o O7 ?! n0 c9 o - {
. N5 W% M4 g- r. j# o - LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOI);( T) B6 [3 `/ P
- }; E+ o. g, q# e2 Z2 f
- #endif // GPIOI1 z! i* ]& k' F$ W* T8 A! a7 x
- #ifdef GPIOJ, A4 D" v8 U e0 }/ ~* G6 W( a
- else if(port == XGpio::PortJ)9 p: z: `+ L. E! V
- {
5 O' V' c9 I/ G' F - LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOJ);- y; H/ Z, G* M2 w4 V0 H
- }
% ~0 N. j$ B8 g - #endif // GPIOJ$ l7 N C$ h3 Z
- #ifdef GPIOK
u' t: i: a$ b - else if(port == XGpio::PortK)
! Y; z W. A2 o6 N b4 O' T5 | - {+ l, s5 |) N0 @" ^
- LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOK);
V. g, r+ f- H! O* ?4 q) N1 L! Y; o& [ - }) P. M; e0 e `; M
- #endif // GPIOK; J/ L: e, e0 @( Q5 J+ S2 f' K7 A
- }
0 ^2 O l: v2 @, s* w3 W3 ~5 d
# m! J5 W6 B( A- /*!
/ z+ |- @0 l* J( P - \brief Close the general purpose I/O clock.
% L( {8 Q/ P: G* u - \param port: GPIO port.5 w1 S# ~+ M% K% T6 I. J
- */, j# t: W+ H% E' {) F& V" m. F
- static void CloseGpioClock(XGpio::GpioPort port)
0 l% w8 [5 Q& Y" H - {
1 Y8 L6 e' M+ h/ n9 E - if(port == XGpio::PortA)3 T# x4 ?' o0 \* F7 q) w5 y( B
- {
4 P8 i. T4 u/ D; Y - LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
1 T# X( ]$ z" q- u - }# `: Z+ V& B- Q/ Z5 ]8 a. {
- else if(port == XGpio::PortB)
. R( s( e2 M! K Y$ h; V- ?8 W - {
0 s. r8 M3 [ c* R3 w2 x+ T2 Q - LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
. k& P; y. A- z# Z1 G8 i - }4 l' M z# \% D) V/ S
- else if(port == XGpio::PortC)
0 m- q8 j2 E9 D) K - {8 H, X# S- s/ J' p
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOC); D+ }% L# f3 n% F) k2 {$ \; @) ^. [3 h
- } |5 ]9 s5 H& |$ E& Z( X
- #ifdef GPIOD
8 c2 i- ?/ j8 k+ v2 O - else if(port == XGpio::PortD)
& _# h8 j3 Q1 K! G O - {
) p( L" w% j% e8 m7 E' e - LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOD);% w* X" y S8 I T, A
- }
0 }+ k3 F" U% o - #endif // GPIOD n' g; K4 l) A3 Z
- #ifdef GPIOE% K* b& x! t1 R
- else if(port == XGpio::PortE)9 }9 F) \3 g2 H* p
- {( V2 N: w" K$ Y, f
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOE);
- Y: J# Y" J/ U) f. q3 d, h - }
7 c. Q3 Y. r n* i! _, ]) z - #endif // GPIOE
( w+ f7 v/ ]8 Q+ i - #ifdef GPIOF& w9 {7 y5 J2 o% B
- else if(port == XGpio::PortF)
* R: Y3 E7 c4 X9 |! `# A; ~ - {6 a C% d2 m% H: r- N: Z, D) l ]
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOF);
9 D0 C' t% o% \9 N! j1 u G# H - }; b0 _9 }7 e" O
- #endif // GPIOF
0 e$ z( h. [ B0 B$ I4 H - #ifdef GPIOG
% o- o$ K8 f7 n$ ^; v - else if(port == XGpio::PortG)3 M5 P- N6 N& G; }. v. _+ I
- {" y2 d$ C# Z" P* ]" U
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOG);. ]5 \1 S& }) b S, c
- }) \ {" H3 Q% C( ]: ]
- #endif // GPIOG
- @; Y" p' I* [0 a) p - #ifdef GPIOH
' h1 n, Y& I3 V) c9 M6 c - else if(port == XGpio::PortH): h# V0 w# S7 g0 V
- {" f- E/ w" b& _& ^
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOH);4 j. Z9 o/ V% r3 m' H2 q; ~
- }
, b" F8 D* l& J* T: Q2 b: q - #endif // GPIOH/ A6 k8 g9 |4 m/ Q H0 {% M
- #ifdef GPIOI9 x, ~' \8 O- j4 A+ w0 a) q* M
- else if(port == XGpio::PortI)8 Y) D" n2 A6 f; q1 M& d4 ~, W* k
- { \* N' }8 {5 k. J
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOI);
1 R% {3 d) I. P - }: Z' h: `" P% G% V& ?
- #endif // GPIOI9 B$ r; T0 I$ M6 Q4 C; `% W$ n5 x& ]
- #ifdef GPIOJ
* F; u1 N* i/ M$ _5 e - else if(port == XGpio::PortJ)
. O5 S, L& p9 a: w - {
9 Q$ q. T3 v4 V( k/ s7 J - LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOJ);& Y6 F8 `! D/ }. }( D* F* S
- }& Z" Z+ `, X+ w9 g
- #endif // GPIOJ& w1 w, a, ^- R- N/ d4 l2 E# f
- #ifdef GPIOK; F! C+ l# ]6 M; `
- else if(port == XGpio::PortK)
3 m' n: B) T; W' C8 S c6 \; A - {) z; o: C1 F3 k+ U2 Z! m& J
- LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOK);. u% s* p! D. H- u. N
- }& H h8 D( A4 {9 J6 g5 i
- #endif // GPIOK
! A0 J j; n7 L2 y - }' j) c+ E/ {1 l2 V3 j/ E9 e5 {1 W/ D$ N
- - c+ ?- y, e$ M( I# G
- /*!, ~1 P/ m9 u" u! e
- \brief Set the general purpose I/O pin flag.* Y U- F$ L V7 ~* g3 w" V# a
- \param port: GPIO port.
3 O2 ~+ \; K3 M$ j4 M& I+ v# T5 | y - \param pin: GPIO pin. q: ]& ?2 r- }7 ^5 {! y' z
- */" Y. q9 p' I" p$ u0 B$ ~, P5 I
- static void SetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
1 ]- H1 { n' [7 v8 E/ t - {
( Q `9 H' N; `; q! D8 u$ d8 o - if(port == XGpio::PortA)8 V2 ]; Z6 ~; ]% [7 u( ~& s8 \) i* I
- {
/ r# q+ {% h% k: { - openFlagPortA |= pin;0 H+ G5 S1 {. U( ?5 H6 @- w8 ?
- }
0 F5 h8 m/ s: W - else if(port == XGpio::PortB): `* ~6 }# _& j' y% K& F7 l
- {8 K: y0 r" X' p7 t. q5 L3 T
- openFlagPortB |= pin;% q! d7 W, i1 n5 W7 E7 r
- }9 E: ^! K! `; X& k. U7 G8 w) t
- else if(port == XGpio::PortC)3 i- A7 d& P: @3 }* e" A
- {' W. I5 U/ G7 u9 o- i ^7 S- M
- openFlagPortC |= pin;: A& G& V' n/ b4 _# k7 n
- }+ h: g1 Z7 I. M6 U4 J
- #ifdef GPIOD
0 H# x4 `3 [) { - else if(port == XGpio::PortD)
% {" ^) R% h" y - {) X6 o6 F0 G# Z( E9 {* Q
- openFlagPortD |= pin;
1 p% ]/ v2 k& ~6 N G1 Z* \/ V4 M - }
" C% C. N) W6 ~% h* V7 f# p" M - #endif // GPIOD
+ L6 X3 K) w- L8 L2 x - #ifdef GPIOE
! i( \/ ~2 V7 {( a6 v" G - else if(port == XGpio::PortE)
5 q: g% N- H8 t$ k - {
- h ]& U& f3 d c; i1 P% G - openFlagPortE |= pin;3 U2 k1 T; N& {) h
- }
" E5 V6 N, c. u2 N: ?5 l$ @0 p - #endif // GPIOE0 j9 v. A2 `. Q$ C
- #ifdef GPIOF
. N2 ^* t3 D: ~- U - else if(port == XGpio::PortF)
, J1 T) c8 ?" \# _* y- B& d% _ - {: d0 [& r; z$ K9 J/ f' q3 y
- openFlagPortF |= pin;$ S: s: K3 ^8 G+ T) S
- } E2 [7 u7 K7 C9 q/ I$ y1 c
- #endif // GPIOF6 T/ c& o7 B9 K+ J& [
- #ifdef GPIOG
7 }, a1 d3 N* l! ^- @4 w - else if(port == XGpio::PortG)
. m c: v. U) h' _1 N3 J5 G - {
b T' b3 r0 C - openFlagPortG |= pin;
, q/ x+ a* B. F7 i& B, W3 F. u - }, A$ R- i: o8 ]
- #endif // GPIOG
4 }% {, H: i: n J3 @' P( U - #ifdef GPIOH; ?+ M0 _$ Z1 Z* N5 q) u1 o1 \% I6 L
- else if(port == XGpio::PortH)& w9 N& w: M/ ?2 f2 ^$ v
- {
7 a" H/ y6 K7 H* Y) y" p - openFlagPortH |= pin;
d/ C* j& l0 }5 ], a* Y$ W. P6 ] - }2 p" `, E9 S9 ^1 q P
- #endif // GPIOH
8 Z! H) d% T' b$ z8 \8 \' K& Z - #ifdef GPIOI9 ^" K2 R* z1 }: w* K
- else if(port == XGpio::PortI)
4 k1 a# F( K$ k9 n4 j" C$ a1 l - {6 s& |( p1 _' V" V9 E6 o9 Q
- openFlagPortI |= pin;- ]/ V- S# K! x+ Y* R
- }
9 ^& {& N" B* b - #endif // GPIOI
' m! Y' D! I- o. A T1 T1 ] - #ifdef GPIOJ
- ^+ O3 `9 y0 _/ T- T - else if(port == XGpio::PortJ)
& j |0 B' H; m0 F1 n - {" c: D p7 Z2 F1 v7 c7 Y1 E. e
- openFlagPortJ |= pin;; A* m9 ]5 {" f( l! s
- }
/ C" x' D$ z$ p3 a" R - #endif // GPIOJ" X6 G0 z c, i0 N
- #ifdef GPIOK7 E- @6 s. f4 `: F
- else if(port == XGpio::PortK)
8 u6 K- S+ G y - {
/ n# ?3 g) S2 e7 B3 \# ]+ A - openFlagPortK |= pin;
3 Y0 s. H5 Y% {" t - }- S; L6 n* U0 j4 ~" d0 c
- #endif // GPIOK
6 z' g0 H" K& I7 A2 y2 Q - }
+ q" U/ B/ w+ d& k5 J3 I - ) q8 z+ |! j2 n9 _: J) }
- /*!
5 A" q6 I/ B* b% D( z - \brief Reset the general purpose I/O pin flag.
! p; t7 Y& ~$ i - \param port: GPIO port.
" K) v8 Q$ K% x& E3 s3 Z: r - \param pin: GPIO pin.; _# b% g5 e) y, c; M
- */
6 {$ ^6 k6 ?+ x7 G L9 ] - static void ResetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
4 }- V7 ~3 I" |# T; R - {1 r. P* z$ W8 u: T, w
- if(port == XGpio::PortA)
. G Z1 F7 X( Z3 @/ z - {
$ F. |1 X; f, m% U - openFlagPortA &= ~pin;$ o1 X, E, V% {+ o% z9 d# K
- }
" S. y% P0 P2 E& j4 z! B' O- } - else if(port == XGpio::PortB)! S# q, q4 R2 n
- {& ?. R" m* j& p! G7 ?3 ^. b. {
- openFlagPortB &= ~pin;9 v6 k0 d# V# h' X( s* `( T; }
- }' o; G( H" |9 I7 j
- else if(port == XGpio::PortC): t: F0 h+ ]& f% e2 T
- {
& W% C2 B8 y# F. \ n - openFlagPortC &= ~pin;$ w2 b9 V( k8 O2 Y
- }
, z/ E* ?; c+ k% i: U" W/ } - #ifdef GPIOD
+ j) \ _5 p) S4 V9 f - else if(port == XGpio::PortD)! p8 W2 p' x: T7 Z. U
- {
6 m5 @ p- L6 B& i5 d - openFlagPortD &= ~pin;- m$ o9 O# H1 s# B& S# h9 E# H
- }7 X" A3 n3 z4 f% m2 x) h2 S- K
- #endif // GPIOD
2 d* P- c, B& q( e+ x- v' } - #ifdef GPIOE2 v Y5 U1 p$ w# w! M' k
- else if(port == XGpio::PortE)
8 O: v& w/ G1 N - {* _- e. q$ ^! G4 {6 B1 L" C8 n( G+ k$ v
- openFlagPortE &= ~pin;. G5 L7 V7 z8 |( T
- }* e3 o9 ^1 _+ \# i; \
- #endif // GPIOE
' v- k7 V8 _& p8 l* @7 y# @9 t8 j - #ifdef GPIOF
$ R. J2 J" U$ R+ L: \2 w, D - else if(port == XGpio::PortF)
& D7 }9 O3 M; P' Y5 \2 @ - {, Q( F4 G$ B! w
- openFlagPortF &= ~pin;7 C3 b3 [2 ?9 i1 h$ V# f
- }3 Y$ `( c) S8 E' D9 W
- #endif // GPIOF! A) d2 @* @2 o: x- N- _
- #ifdef GPIOG/ [: }+ x g5 |1 R8 [/ y: A
- else if(port == XGpio::PortG)! f j. h& H9 Y) e8 q U$ M7 U
- {3 e$ a, V5 y0 S" m. x
- openFlagPortG &= ~pin;
- f+ d1 B& t8 S% | - }
$ Y1 m: I- z3 M8 W6 w1 X! M - #endif // GPIOG
! _4 D+ }& w+ _' u+ v H) W - #ifdef GPIOH) E k7 O0 T+ k
- else if(port == XGpio::PortH)
& O% a; C" g% R4 Z" g# t, q - {1 L$ [$ x1 C2 I# _( M3 s
- openFlagPortH &= ~pin;
7 z* c( j1 G+ ]4 A* u" b - }4 _2 h5 K2 u5 s
- #endif // GPIOH
0 T8 C- l' q; r+ z0 z: h - #ifdef GPIOI7 k1 O9 A: o/ K _! ?* [
- else if(port == XGpio::PortI)
" C, p) g4 S; u5 K- a% E( ^ - {1 V m9 o# b4 b; h1 c6 G% D
- openFlagPortI &= ~pin;& D# Q0 Y$ d. I- |
- }0 N; W# n' x6 H
- #endif // GPIOI) K8 c0 ]+ _. ~) |2 x/ `; m C
- #ifdef GPIOJ) N% B. N6 ] O. x% S
- else if(port == XGpio::PortJ)% c; M$ L, s! c9 K& v- B+ A
- {
% U, o7 w7 b1 J9 D5 J - openFlagPortJ &= ~pin;- W5 K e# d) v( r
- }: m* |: U1 U! E0 V) b7 {
- #endif // GPIOJ2 O4 D- [/ l7 p% I( S0 G
- #ifdef GPIOK2 n) S; D* |9 b6 R: e# g3 c4 Q v
- else if(port == XGpio::PortK)
1 O' b7 S0 F0 n9 O. E: ~ - {9 j( ?; A, f4 L
- openFlagPortK &= ~pin;
( b' ]6 G# Q( a; |) v% b2 [9 D - }
* l, n0 R9 k/ q1 q8 K - #endif // GPIOK
9 \& H) {0 J$ ~- C/ m - }
) B. i! r% M j( H4 w/ d - , N5 N2 T: h. f. q: ^3 R
- /*!8 Q2 ~% E$ r+ ^/ Z; {
- \brief Is a general purpose I/O pin flag set?
2 e+ N( P7 Y, f+ A4 h; |1 D( G - \param port: GPIO port.. J6 c* e+ b# {6 b$ g5 v
- \param pin: GPIO pin.
, D- |' R, O1 T; O( ?9 L, o - \retval true: General purpose I/O pin flag are set.) \) m9 W3 w6 ^
- \retval false: General purpose I/O pin flag is not set.
" j/ |# ~9 w H4 r0 x7 w) x$ L - */$ V _& B- C, o, S6 Z# q6 \0 S' j
- static bool IsSetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)* [ Y8 a: y( L: M
- {# ~. n7 U4 ^4 ]( o
- if(port == XGpio::PortA)
& W# G `" l. q& m7 |: { - {
) [% `) f8 c: m' Z1 _ - return ((openFlagPortA & pin) == pin);$ _1 D, C5 v i/ }1 c" i7 z k
- }% g; @; s+ n/ r2 i+ N" j
- else if(port == XGpio::PortB)( C! [$ D# e( \3 T/ B1 p. L
- {
$ E3 O5 f" p4 b$ [% E) _7 Y - return ((openFlagPortB & pin) == pin);
, G. h/ |, H2 P! y* U - }) J2 b1 k- o# a8 K$ G
- else if(port == XGpio::PortC)
- H: m7 Y0 L5 K5 f9 v - {
$ K! g( C& z( p0 m0 `% ^ - return ((openFlagPortC & pin) == pin);
5 N. |, y$ e, ~8 G - }! I* T6 `0 M$ G% i e
- #ifdef GPIOD( D8 h" Q( X6 V. b* G0 i
- else if(port == XGpio::PortD)
& w! w F# m! L3 z5 f. `0 r - {
8 c* d( F# G: f3 x) {1 s' \ - return ((openFlagPortD & pin) == pin);
( E3 V' \ B2 R: l - }: \$ t$ R! j) o' V: M; ^! ?9 z
- #endif // GPIOD* F4 Y1 c' D% ?+ C2 g
- #ifdef GPIOE
& X# r L0 D) P3 R - else if(port == XGpio::PortE)7 w- ~; F8 o1 g; T3 s
- {
: i3 o9 [& ^" h) f1 s+ ?, s - return ((openFlagPortE & pin) == pin);
s$ H/ U' h& v2 u4 ~# b' ?; c - }0 b( t6 P! }' Z
- #endif // GPIOE% x1 C( g7 S! ?5 I# V
- #ifdef GPIOF! o& t, S! ]1 m5 W( F
- else if(port == XGpio::PortF)
5 m/ k1 o* h, C, I* B6 s - {/ w- X3 U8 S6 `0 x9 p9 e5 E# B
- return ((openFlagPortF & pin) == pin);
6 r/ u2 S: U' n9 M* ?$ G - }
& B1 G7 u! Y8 G7 T: W) m8 l - #endif // GPIOF
( }; D3 b( B: N' [4 ? - #ifdef GPIOG p C! f+ n+ H6 B- m# U
- else if(port == XGpio::PortG)9 D3 y5 ]* z3 m$ X# e5 W" u% L7 x
- {
1 G6 s9 I7 d" F; D; _ - return ((openFlagPortG & pin) == pin);
0 K+ R- S6 B9 b( W* G - }! Q- w5 Y/ c5 g' d& }
- #endif // GPIOG
4 ?7 Q# l$ S1 b6 l) p: p& o - #ifdef GPIOH
3 g5 G( Q5 o5 j- `0 e8 d8 F$ g+ y# X - else if(port == XGpio::PortH)* P. Z6 S! O& x0 U# p0 ^
- {. m6 H/ }9 r9 `' }% f3 M" b# s, M
- return ((openFlagPortH & pin) == pin);
3 b& `. g4 N s: ^ - }+ W5 F- P* R# b6 i( k1 l+ H. m
- #endif // GPIOH
+ d* I$ D2 U5 E. G l) r" C - #ifdef GPIOI
) P% g5 j3 p$ H8 C$ W# b - else if(port == XGpio::PortI)
: K! n# z$ f; `/ I5 ~. s M - {
4 n: a4 z, o) x1 f5 l* I9 b/ H - return ((openFlagPortI & pin) == pin);
$ l, J6 D2 p, h' Q1 e" P - }
, k, X8 s Z7 M9 e k; W5 Y: J8 B - #endif // GPIOI5 |- J8 A& i; C# }" [6 \
- #ifdef GPIOJ2 P4 Q2 b& Z6 y2 E
- else if(port == XGpio::PortJ)
- v$ z8 w+ a: |% a7 B) ?% w5 B - {
, ~3 Y) y V* g- K- t' l - return ((openFlagPortJ & pin) == pin);, U1 J0 ~; h: ?! K$ c4 @
- }( A I$ }8 r9 \0 T
- #endif // GPIOJ
# Z2 w' u! d( f/ m; z - #ifdef GPIOK
6 T" v2 w. x% f O - else if(port == XGpio::PortK)
- z( v* P; W7 m6 F8 P( }- s - {
' w1 F% M. n, w - return ((openFlagPortK & pin) == pin); v! Q/ Y. G- I) ?) ]4 W
- }4 a4 b6 P% i% k# v% C
- #endif // GPIOK
0 u( ]; w% g' Q& e7 z - else
4 l' [+ M% }5 L9 n. V - {
|: z' ?! G M( J - return true;+ d" ^& o( g0 B
- } u* U% g0 W- s2 e# P4 i) i% g
- }
) J i% ^4 Y! R5 ? - # U7 ^9 B' L. q+ f5 e( ?, O
- /*!+ r7 y2 e0 q: }1 l" }( K6 e3 I2 c
- \brief Is there a general purpose I/O pin set flag?
1 H& q7 h% ]" y+ _ - \param port: GPIO port.
" s. |1 R7 L2 S: p$ e, ^ - \retval true: There is a general purpose I/O pin set flag.
1 e; j' v1 F# x/ U0 k3 n1 U - \retval false: There is no general purpose I/O pin set flag.
! [# t; b' t- J0 ? - */' l7 ]) i# U6 L* p' a( M
- static bool IsHaveSetGpioPinFlag(XGpio::GpioPort port)
' R9 b: {5 y7 b+ P - {
9 X& c2 e8 u5 o/ c$ B2 ? - if(port == XGpio::PortA)
/ { N( ~# s' z' z4 Q - {
" H- M- z G2 D: u0 Z - return (openFlagPortA != 0);/ i+ p$ r3 Y+ @6 T# u* u
- }
- f( G) Q3 R, B4 o: l- F - else if(port == XGpio::PortB), u6 ^* p7 l0 S! T
- {. a. |0 _5 G! [0 a
- return (openFlagPortB != 0);
( ~$ ?8 S- S/ |5 B$ x% u: V' u$ t - }+ L/ U# U0 @. m" u' b E
- else if(port == XGpio::PortC)6 e! C$ t: s7 {2 T a( \ v
- {; W D$ @1 Q* m3 T2 ?
- return (openFlagPortC != 0);) h6 f2 `% u2 j2 ?( ]
- }
5 F. T5 s/ u( J( r0 E9 d1 [ - #ifdef GPIOD! K8 i7 f6 H: M6 S
- else if(port == XGpio::PortD)
* F3 r( ~4 f8 n# l& f - {
$ ]: v5 k8 `" Z( i! u/ C! D8 {; ` - return (openFlagPortD != 0); T& G1 d+ l* K; @: S1 q8 s
- }
7 v v/ s' Z `7 L1 c' x# e) U2 A& B. C' F - #endif // GPIOD
) i4 ` J% B4 J: o2 l2 y/ W - #ifdef GPIOE: a) e: p& a H/ [
- else if(port == XGpio::PortE)3 c/ I9 ?5 V' J# s- ~
- {9 g0 {' {- Z7 V' V8 A
- return (openFlagPortE != 0);
2 p& r7 A ^# ^9 Z; Z - }
# `2 L" m6 Y8 \/ D1 o - #endif // GPIOE9 Y; p4 ^) U1 T
- #ifdef GPIOF% U" I, p# P& `; I. e0 @% V+ Q
- else if(port == XGpio::PortF): O5 n: y; X8 K3 U, j
- {+ Y$ g7 a+ d* {2 A4 `: _8 p
- return (openFlagPortF != 0);0 h& [/ ?! @# u5 ^
- }3 @- a$ i" R& Y9 J. |
- #endif // GPIOF0 i8 ~2 m; h3 v$ z, P0 A4 U
- #ifdef GPIOG
9 f: t3 Q; k* l0 l - else if(port == XGpio::PortG)$ A+ X' }% w7 i5 N$ V( |, n1 i/ X
- {
V1 P# V' q0 [3 W# } - return (openFlagPortG != 0);" a6 g1 H9 Q Y, g
- }2 p# z* |( l+ s7 _5 y8 A8 e: W
- #endif // GPIOG
8 P& |/ ?" h3 K2 i% p! S @ - #ifdef GPIOH- f& D! J( F- J
- else if(port == XGpio::PortH)1 ~+ U9 t' K8 Y2 k7 R
- {
9 o+ a' d: J" E: q, Y$ x - return (openFlagPortH != 0);
) l# B6 a; N9 W2 j! n - }
, z6 |$ k4 [4 l. h1 K - #endif // GPIOH
! v) ^- l( _, F8 j. ]4 ] - #ifdef GPIOI
+ \* @4 L' W1 V+ ]: w N/ [ - else if(port == XGpio::PortI)
3 G: W- w0 R+ J - {# o, _2 T4 [( w2 A# e
- return (openFlagPortI != 0);
3 t3 p9 l3 ?9 V! n5 w - }
/ l; o' d" G1 a7 J6 } - #endif // GPIOI
; m4 N+ j" ^ {1 o3 t7 F - #ifdef GPIOJ! p- X- R1 c: G; g( u+ n4 Q9 F, x
- else if(port == XGpio::PortJ)% }# x: e. R( X# o, N- ^
- {
: R e. G# b, n, h* y( d - return (openFlagPortJ != 0);4 `/ w( M3 n6 ^' d+ M
- }
+ m" F5 m5 q% x6 {' | - #endif // GPIOJ6 X2 I2 I) L& G' g4 k
- #ifdef GPIOK
8 l3 f" @7 B, ]: ?' }7 @ I2 e - else if(port == XGpio::PortK)
: C# o+ x- S, Z( j4 P; ^. Z - {
. o( v o6 `3 \ - return (openFlagPortK != 0);3 U, e9 a* Y5 j; A& X# M0 Y# H. I
- }9 i+ H8 n* C2 E
- #endif // GPIOK( S3 c- Z, S' P( z) m
- else. E% \% R6 y0 x2 L/ W( C* Z2 c
- {. q1 [ V6 n1 `
- return true;
7 U" y$ z! @3 I* { c$ H0 f1 z' ] - }
% z( m0 N" E/ B$ N2 R - }' L* z1 r& X: R) e
- , P/ }/ e) t) ~6 j' P/ D
- /*!
$ b5 p c$ `' B0 f: W" s+ | - \brief General purpose I/O module constructor.$ b- J" d/ y. ~- q! e! ~
- \param port: GPIO port.0 X% [$ N: ~1 `5 F. V2 Z4 a
- \param pin: GPIO pin.
% Q' B9 l5 Q3 j- ` - \param mode: GPIO mode.+ R5 c0 |) I# D* l# _7 a
- */
5 y% H- [8 U' S" f4 I0 L' c1 f - XGpio::XGpio(GpioPort port, GpioPin pin, GpioMode mode)
2 e+ `8 ?. u/ T& Q. R! e* u - {
; s8 k6 k% ]! o5 I5 h$ W* ^- u - this->port = port;
$ h* V. T+ e" n, c+ ] T - this->pin = pin;
# l( o3 D, V6 B: { e" [ - this->mode = mode;4 ?+ x, }! v* P1 y9 K! J- ^. i
- this->output = OutputPushPull;6 q' v: @; T' D2 @; l
- this->speed = SpeedLow;3 U5 S4 u. T$ V
- this->pull = PullNo;% Z( p* x( E6 c+ C* q
- this->alternate = Alternate0;$ ]; f( k7 @" L6 e# j- @2 m3 D9 \* R+ x
- this->level = LevelLow;
, i2 ^" x& \% Y* L9 l5 z% x/ j" \ - this->openFlag = false;
7 y9 c. Z1 F Q$ @& D" {7 G - }# @. r0 m" b# x7 ?8 b. [
- . n! w% ]7 w: T! U. k# L
- /*!7 F4 o/ B1 i0 u5 e4 U5 S9 c6 q
- \brief General purpose I / O module destructor.
4 u3 w v7 C! n - \details Restore generic I/O to its default state(input mode, push-pull output,/ `% Q- P) C' V, O
- low output speed, no pull, alternate function 0, low level).7 j' V2 Y( g/ \- u0 N* l4 y
- */: E0 l/ O, T& H' y" r. \
- XGpio::~XGpio()
2 U$ V: U( v% {) B - {
& ~6 s3 m7 Q7 O/ C9 r - close();$ |4 t8 s: @ ~4 e! L3 x
- }' s- l$ i% x! L* d% T/ \
" ]1 G+ [4 V- ]' k3 J S- /*!; j% |4 }' m* q, ]: U6 l
- \brief Set general purpose I/O port.
/ h2 P$ J8 V$ T8 _ - \param port: GPIO port.- h$ [0 f, x% u
- */# G. z' C5 H3 u8 R5 a
- void XGpio::setPort(GpioPort port)
( A1 B( m& e( O+ C - {
* M r; q, s: }8 n* ] - if(openFlag != true) q- \7 r& e. U R
- {
! `- {4 L; O8 F& T% T# p3 c# O - this->port = port;0 A0 C/ [ m9 i2 X
- }
5 w' [. W9 i" _ - }
) u4 [" d5 k7 J0 G - / A3 h- p* g/ T9 k9 q1 d" N
- /*!; k; s1 D1 e# c" V5 D2 k4 W
- \brief Get general purpose I/O port.- i3 b8 \+ a( s4 m. J- l$ j
- \return GPIO port., ^3 a3 E3 E, O' H" z; h4 ~
- */
# ^) {1 Y' T- r8 A - XGpio::GpioPort XGpio::getPort() const* w$ h3 U8 R4 D! a3 r
- {$ K( ^6 d5 ~2 l |' f
- return port; x+ c2 _( ` y' U3 ?$ j# D5 A5 }
- }
5 z3 m F8 A4 s6 j
( X R2 Y; I- ^. p# H6 X- /*!
+ w$ a& f3 e1 Z S$ X" j3 R4 O - \brief Set general purpose I/O pin.
4 z# U0 T5 i8 R. D$ _; G - \param pin: GPIO pin.
) Q- U- n. D9 o; a - */) r8 t8 e# X, d; D# k3 Y+ W7 X, j
- void XGpio::setPin(GpioPin pin); l( K, l5 X1 l$ ] g+ f2 e: G
- {7 w: Z: N* k; Y
- if(openFlag != true)
0 K2 o% f# y T" c - {
W- X2 c5 m4 n6 b0 p7 W( s - this->pin = pin;
# m% g2 v) x6 L3 d! w4 D! A - }
3 G$ x6 v& s' p7 i - }
6 V% I% j: \8 [" w
+ k) @ K1 t% T- /*!
" r. `: O; Q) a, r$ U; m) o2 x - \brief Get general purpose I/O pin.1 P( M f+ k- P- J+ [% C, `$ y
- \return GPIO pin., h% m1 N! y9 K: c- B1 S
- */
- e1 A( Z; ^# {. g. W% o - XGpio::GpioPin XGpio::getPin() const; c* ~5 J7 h. Y! J+ B( \
- {- F2 Z7 `% F, q" Q- ]9 i
- return pin;
3 a. Y+ U2 G9 [ k6 [3 C: ? - }
6 X! E, U9 {0 w% d! l% V; [9 Z - " Q) \4 v" W0 ~$ p: ]' Y
- /*!
; p$ s' z0 z& P% m) T, c7 } - \brief Set general purpose I/O mode." Y1 ~2 I9 R& U- q
- \param mode: GPIO mode.3 u7 _7 c5 V; O0 z7 S
- */+ `- k* u1 |# P1 ?; }
- void XGpio::setMode(GpioMode mode)
3 }, B. Q. n3 Y" S - {8 d0 J( S$ {, L' {7 m: Y
- this->mode = mode;9 Y; B4 ~8 H, n, P( a s4 t
-
9 u0 f( B7 t" `3 w Z' I - if(openFlag == true)% z) a$ E- p. o' W
- {
1 t9 A" K: b6 S4 N - LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, mode);
9 g% P4 E( D) c9 c7 W/ G - }
7 n9 @, R# k2 U% s: Y; s: f& [ - }+ v! \0 x1 _6 p, C& W" t
- / z- U' `/ L5 U
- /*!' N# h6 o% d; X* `/ w
- \brief Get general purpose I/O mode.6 j' t$ ?& w6 A- C
- \return GPIO mode.5 p* @" i& m9 [) t1 M W1 @
- */. {) R- I6 u' C! T
- XGpio::GpioMode XGpio::getMode() const- n5 E/ G4 y# `
- {5 Z5 a0 E! `5 O5 @
- return mode;4 i) v j, D- |. J% R" u/ d9 k9 `3 u
- }# d( @5 g! A" ~8 e. h( U
+ ]( f W E8 O. \; l- /*!% a. g6 {' Y( R6 ]+ H$ F$ v
- \brief Set general purpose I/O output type.0 G. l% n; s8 I4 w, F2 J) ^
- \param output: GPIO output type.
" N" [/ K, e5 }/ P0 Z - */
. Y" @& Z* e8 ]) [5 l& h. j5 P; X - void XGpio::setOutput(GpioOutput output)" _) o9 n7 `9 l6 ~* ] u, E
- {) s4 R+ N7 ]" y4 C5 `* O
- this->output = output;& N7 p# b# r5 `) \6 _
-
0 \. }* P% Y$ Q u f - if(openFlag == true)2 {0 \0 b2 \) Y7 M$ j2 Y
- {
8 W# T3 T; ]- w8 Q - LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, output);
s- H4 |. A. M& A( |7 c - }- d' @6 G/ [# ^+ \
- }/ U6 R& R, M% }/ e$ E0 }
- W5 n/ _- ]) j0 P% V
- /*!
" n8 i j4 f5 i* h) \9 Y* n - \brief Get general purpose I/O output type.
4 x( Z( y6 N$ l; g# h1 [ - \return GPIO output type.
' ?3 T+ f0 @8 A, Q/ J: C( T - */
) D# A8 D' R6 V, i5 ?* ~ - XGpio::GpioOutput XGpio::getOutput() const
1 ~% \: i. n$ S. B% ] - {
; t4 L- S3 Y3 M( v - return output;( d; Q; _+ `2 v1 j% v
- }% y! W1 a( S* [! i
- + {* R% o3 J+ U5 V/ B) u1 H
- /*!
7 q7 }. U. u1 s, o9 X ^$ A - \brief Set general purpose I/O output speed.* m% I F, } T* {7 F2 F. L4 N
- \param speed: GPIO output speed.8 d+ D( A6 d* i H1 v7 f* W1 i
- */
2 }3 Z. O( E9 d$ ?' @& [ - void XGpio::setSpeed(GpioSpeed speed)
0 Q' C8 e" O! g! y- E- `& B - {0 u! S" w# `' s
- this->speed = speed;% b3 Z0 D' q! F9 _
-
0 w4 ?7 `8 V8 ?7 h - if(openFlag == true)
% K' ]0 J0 m$ E' E( U - {
) }0 b3 C0 v+ s$ ^8 n - LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, speed);
9 ~9 |2 d( ]* c* o, p - }1 b' y: b: a" g }! K
- }
5 ?) o& B! O1 j9 T% _* z - * U/ I( `0 R5 v3 w F6 ^( M
- /*!0 b0 W; ?$ q) Z) b0 Y
- \brief Get general purpose I/O output speed.
, B9 S& p# N) j3 {' c9 S% W0 o - \return GPIO output speed.% E5 x5 ]+ L' ^ a
- */2 f! {# d. h- c! w L- r! s. O
- XGpio::GpioSpeed XGpio::getSpeed() const
2 r1 w; L! n8 k7 ], X7 X3 z - {3 o+ e. T/ g- s3 u5 y0 J
- return speed;
4 ]* w5 C; J1 S - }
: [0 \" F3 h9 r - ) {0 g( v! N( p% t0 O! V( v
- /*!
/ r. Y* k9 _, ?8 p - \brief Set general purpose I/O pull-up/pull-down.
* ?9 G, w; [; _! }( Z# Z9 O' L4 u - \param pull: GPIO pull-up/pull-down.
5 p, K; s. G7 k - */ A& p- T' y; _* T, M: \
- void XGpio::setPull(GpioPull pull)
. N; b3 `) f0 ?0 O1 |9 {! G/ Q, I7 {8 i1 S: r - {
# a8 [& S" r0 n% b; t, S/ @8 C( n - this->pull = pull;* E ]8 e1 x' e( p2 \ g
- ! \/ g' J4 e% G/ \: V- q7 d
- if(openFlag == true)( h+ f, `( A" M2 L- \
- {7 o# [+ K: C5 C7 c7 C
- LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, pull);
, d7 Y: x7 l0 g3 Z - }# q) _2 D' K. B. J2 S
- }
; k* e, h. J* Q( _% a" H& s, |& F - 8 L: h6 q8 ~' o* x: M
- /*!, I! ~8 I3 _5 N" Q. v: _
- \brief Get general purpose I/O pull-up/pull-down.
, [4 q" _# I4 ?/ O* o - \return GPIO pull-up/pull-down.; m5 ~( i `, g! U
- */
$ A3 Q6 ^- t( H - XGpio::GpioPull XGpio::getPull() const, r( B& j- N8 W
- {. y: w6 t$ L3 z' G* w
- return pull;/ u+ Z1 ~4 _1 a! F
- }
- \( I, N: C; g# @7 e4 e% K4 _% K1 B
' h* V9 `. E- X1 B! k- /*!
. q* I- w1 S' ^! o* o - \brief Set general purpose I/O alternate function.) ?: m% o. W$ U% W
- \param alternate: GPIO alternate function.
4 D, Y( \* x+ D' r - */4 r v7 M7 x9 ]) A' | ~) z
- void XGpio::setAlternate(GpioAlternate alternate)* e+ f9 D3 @# w7 Q
- {
9 J* k1 I2 w& T' x. s- Q - this->alternate = alternate;" K) U: f2 I% m- p: P* T& v( {
- ) |2 O% w( r7 ?; _5 I+ N( Y
- if(openFlag == true), }9 X5 _# W' q# [* B
- {( M' Q } ?8 p; e: x
- if(pin < Pin8)/ ~ z6 i' a9 w& m% O" t
- {
! S* k6 P- V7 E( Y, A - LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, alternate);
9 I+ }# W- i2 E$ W+ ~: B& P - }( \& ~" {; S! e' ^# ~
- else' L4 Q% |: D+ Z7 r
- {
! \) S) ^. a8 s( x. ^ - LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, alternate);" f# P# R' v) K C0 R+ s
- }0 a5 U% Y- r) |9 C) r: J5 U4 ^9 z
- }
1 V9 ^& V+ C5 m+ J! B1 V7 K - }6 I+ g: h. b" N) s" O
- # Y& K' T7 x9 b5 e. ]7 U2 A$ {* ~$ R
- /*! c8 H6 M6 t' a% g7 O
- \brief Get general purpose I/O alternate function.
0 |/ q7 J/ d8 m x - \return GPIO alternate function.0 t4 { r- @/ _
- */6 B x5 E4 R0 X8 i9 u
- XGpio::GpioAlternate XGpio::getAlternate() const) |% e2 R0 }8 h8 w" E
- {0 F7 Y! ?: b' g) }0 h
- return alternate;
) l% n! D" Q: H0 g8 h, t - }8 B: J, I8 S3 y$ l! {; L- o
- # y- F! O r# e7 O0 [
- /*!
2 K( z1 B" k0 j$ ]! w# _ - \brief Set general purpose I/O level status.
* P9 R# D) z% R" p - \param level: GPIO level status.( L9 B# L) _+ e
- */
; t6 e ~2 k0 j v/ `1 z7 n - void XGpio::setLevel(GpioLevel level)6 q8 J5 f" o4 |0 Q/ @* h5 l! a
- {
; O. a C. {: ~4 q( B! b' Y3 ?$ f - this->level = level;; T. F' D/ H. H" q6 i3 B
-
9 z7 A9 [8 u$ H2 L7 { - if(openFlag == true)" ~& F \- T$ k- u% Y
- {# X$ H, o5 Z- g. f1 }2 G8 B
- if(level != LevelLow). y3 f, L7 @+ \+ h, N9 [
- {
6 Y, s9 s1 u7 Y' X6 w" G5 Z% L - LL_GPIO_SetOutputPin((GPIO_TypeDef *)port, pin);
" d. ~# A9 q5 w4 y g- e - }& [3 R) a- C9 @, r
- else& K4 I- Z) k( c* y( y5 N$ O" ~
- {
* `5 n) t/ s! ^# w2 x- | - LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);+ l5 M$ x1 P* d3 m8 b- S8 E
- }( G" |; V" i, q' O
- }
( e- [5 Z; [- x* T3 W* M - }
% U9 u3 g3 p3 F+ n. [
5 v# H4 U# E% D. r- /*! O A: Y" c9 ?2 n# D$ A
- \brief Get general purpose I/O level status.
$ R" ^( g, P3 r9 K: z - \return GPIO level status.
L) J5 p3 I, I: ]' L2 O' k/ E - */; _7 ?. n% B, L
- XGpio::GpioLevel XGpio::getLevel()
) T- Z2 P8 B& t, L - {) L1 U4 D: ^. q5 \1 ^
- if(openFlag == true) L* R9 v3 W, ?/ z5 X! h! m! s7 Z
- {
" O- h& @. q, X$ M3 X - level = (GpioLevel)LL_GPIO_IsInputPinSet((GPIO_TypeDef *)port, pin);9 ?4 V6 k. j) y$ W3 i5 ?, e2 ~
- }, z: {6 @3 |/ I5 Z Y4 P- f
- , l o/ `% c" S& h4 B0 N5 ]9 A
- return level;
+ Q6 r# p, I- P# w1 l# } - }: e* B, |2 ?; m$ D: {- n+ A7 z5 C, K
- ! ^; L! ]0 p9 G0 M8 A
- /*!
7 {7 l4 s$ ]7 i% v' _# g) {0 w ? - \brief Toggle general purpose I/O level status.* b8 `( g4 n) ?- ?2 U. l
- */
) G2 @3 k, e! u8 g% Q - void XGpio::toggle()0 I/ u0 q" K; M2 _5 |% L* O) T+ Y3 z
- {# y s3 q4 o7 l2 b3 N
- level = level != LevelLow ? LevelLow : LevelHigh;1 p& v- {/ ~/ ]7 ^ t% r0 N6 l
-
; c" D& o' x5 j) T6 g - if(openFlag == true)& j5 ]5 [: H, d T4 r
- {
7 E6 k& \) R _; V. K( a- c - LL_GPIO_TogglePin((GPIO_TypeDef *)port, pin);; ^ b. p& n3 {" u& D+ T
- }# y$ y6 `. c: u, j r; k& Q. [8 }2 H
- }- G: O; E/ s2 D! V& e
0 ~' ~- G8 ^3 ]& J" ?- ^- /*!5 j8 d g. ]0 r
- \brief Open general purpose I/O pin.2 W/ R# A7 ] A
- */
7 p" [. D0 t8 r. C0 A# H - bool XGpio::open()
[9 J3 b/ k/ \+ A% X. C - {9 k8 n* Y* e* `. x" B5 W+ O0 K8 D& r
- if(IsSetGpioPinFlag(port, pin) != true)6 N3 a6 A, [6 _& x5 s: o
- {! ]% x" q% ?3 j" e
- if(IsHaveSetGpioPinFlag(port) != true)
' k% {( Y$ d2 G3 M - {
. v" T/ _$ V" T - OpenGpioClock(port);
2 T, K9 q6 W) A9 [5 B/ T - }* I5 A3 r/ r9 m. u
- 4 G$ t/ r; N9 Y& n9 k8 _
- SetGpioPinFlag(port, pin);8 r0 \0 |. v! v# X
- % L! P3 {6 y/ B6 v
- LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, mode);
% X2 t5 E0 G. u( J! k- l* }! G, j$ L - LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, output);
$ F. ^; S, @% O+ a: p( ^" z: {6 R - LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, speed);0 N, h$ h" Y4 @$ f
- LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, pull);, t4 L% P& I2 S
-
* D" e$ E# h9 P - if(pin < Pin8)
: K$ \+ w) c( v4 U" n2 x1 h0 L. M - {* G3 s1 L ~1 Q4 b" J! ?1 e) s) [: T
- LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, alternate);
- b7 z8 n; M- W' K( d - }) K1 y/ f; a, q; A
- else v) h4 f+ Q! S1 u3 H
- {
! \ d/ [2 c9 O; W - LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, alternate);
3 X' e; D: ~0 t - }3 H: h, j8 U* X7 e2 ^% ~" H
-
' j7 b6 N4 V: N5 E6 K - if(level != LevelLow)
* K6 u% q1 T+ }. S, t- i D8 ] - {
' Q) v; J8 c4 X, Z) j) O - LL_GPIO_SetOutputPin((GPIO_TypeDef *)port, pin);) L! D, J; z n" H+ U* l
- }2 b7 q0 ^* l7 ^ ~! D
- else2 J% Q6 U' z q' l' x
- {% b8 g0 u2 U% R9 {8 g
- LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);( @& P8 {9 W4 [7 k# M
- }6 W& ]) O" ?! n
-
* x5 H% } c( H( [$ n! C5 v+ z7 W& [ - openFlag = true;! \* f. }. N1 K- Z9 o0 s7 F
- 5 S. s4 T% }4 s5 H* }9 ~7 G
- return true; m) U) X' p: k: c1 ~+ ]" Q
- }% n7 m, ?: N9 `! f* l2 Q
- else; H+ s* o7 ]! d- U/ V
- {
1 [3 u' W) k3 t4 G. k9 U9 D - return false;
2 s- x e& ]$ d: {/ j - }
, t( I3 z5 q4 s, ~6 z. J# F4 o# n - }
0 ?+ b( `% ]4 s4 c$ P& _
& p* `! |6 o J4 l- /*!
- _, G: F$ ~6 d% H - \brief Close general purpose I/O pin.; k* c7 G& l8 ^6 w
- \details Restore generic I/O to its default state(input mode, push-pull output, V: e5 d+ g7 Q$ E [
- low output speed, no pull, alternate function 0, low level).% a, g# D; w' w* m- v5 v8 c
- */
3 S1 U. w% r+ ~4 n& p" p6 @ - void XGpio::close()
; _1 O0 V8 W+ O" \: U1 V% S) ~ - {) y) [" e) Q& g1 Y! J' |
- if(openFlag == true)
, p* b+ @, B! m8 }" f7 ?# H - {& }7 e" A4 P+ Z6 q: g$ G5 ]2 v
- LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, ModeInput);
# W; J2 t8 ~& X# M9 J - LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, OutputPushPull);
" m7 V0 C. r- D- V9 G4 C7 s+ c - LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, SpeedLow);. U n# n# ]8 [: F. N6 Z' b* O8 l$ U! ~
- LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, PullNo);9 p! Q. n- ~0 C+ w. L! [
-
1 x" n- \- V( g. Q8 C7 y - if(pin < Pin8)
9 h: R* V9 r4 n# P& i# x: Q' } - {
6 j& g J! l" W - LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, Alternate0);
3 y' ~9 d+ p6 K( ?7 u - }
4 A& ]. u/ k: a5 q! Y% z1 n. k: Q+ o - else4 g# V* `: \/ f/ B* j& H
- {
$ q# j4 r' L' ~1 l. y& p- p. h - LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, Alternate0);8 U; F3 ?5 s9 w6 y. B
- }
m0 r1 b0 |3 C. t; r/ F -
1 L& V5 z% F) z. t, R - LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);
3 x2 _6 q& p3 ~4 \! o - + z4 \* d4 |% s/ P4 y1 d
- ResetGpioPinFlag(port, pin); k% f, q+ q4 \# K
- t% _- v; R5 [7 X# v! g, f$ n
- if(IsHaveSetGpioPinFlag(port) != true)$ x0 }& l5 U& k1 a' m
- {& X9 b1 w+ I: m
- CloseGpioClock(port);
7 y8 T' Z6 M# \ Y1 E - }
! E7 C ?5 j/ }+ ~9 ^4 U - ) M# _/ [. y. r5 x6 r, h
- openFlag = false;7 _, ^2 A$ g1 R- A; H
- }
; I* n! z' ^' h4 \! v - }
' q* K3 m3 G' V W" l4 j - : O; z0 D* |9 ]9 o
- /*!/ y3 z: s% w+ J2 I" i" ?
- \brief Is the general purpose I/O pin open?
; Y" M. t, w3 j2 u* u - \retval true: General purpose I/O pin open.& D$ |& W8 g% c+ L; R
- \retval false: General purpose I/O pin not open.
5 r4 R$ _7 g2 u6 }# a( V - */9 j: J; _% k) N/ B* [5 J; _
- bool XGpio::isOpen() const4 I7 m4 {4 v. ]1 i ~ R
- {
* ?+ y4 j% [9 B: R1 f2 A% p - return openFlag;3 T/ d. U, S1 A6 D% O% N
- }/ 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
- /**
$ [' M8 X6 U+ ~5 F' k% L. C7 p - ******************************************************************************9 Z2 @+ R/ C4 N9 y: Q
- * @file main.cpp, k. s6 N9 t* V0 E) S' C
- * @author XinLi
+ V# m; d; I6 v( B - * @version v1.0, N4 a9 j3 u$ w6 s
- * @date 20-March-2018
4 ]* U; T/ U* N( i - * @brief Main program body.* Y) p8 U% x, W; B. i
- ******************************************************************************
$ [% i* y- o* }. z, F) k9 c9 ? - * @attention
7 ~& {4 {& ?5 x% ]0 J1 J* T - *
0 f& D. C' }* {; ^2 A- V4 T# M - * <h2><center>Copyright © 2018 XinLi</center></h2>
n9 s9 j( F+ _, a) `. L - *- @' r0 x7 m" `9 G+ l
- * This program is free software: you can redistribute it and/or modify
) \* i$ o8 q1 F. d$ z- X0 z) n: c - * it under the terms of the GNU General Public License as published by
4 Y2 h* m3 X' z6 Y# q - * the Free Software Foundation, either version 3 of the License, or
; P* S5 c3 R h6 G2 ^ - * (at your option) any later version.5 d+ @1 K7 R# ~. _
- *0 A" N: k; i/ P; |! }
- * This program is distributed in the hope that it will be useful,
: a2 O8 g2 U; x3 b - * but WITHOUT ANY WARRANTY; without even the implied warranty of
0 {: a/ b% k9 O; `! k4 a# w - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ k2 h9 J: S6 B; T% u' w
- * GNU General Public License for more details.
- H5 l, k& n* }/ T" D! E( _ - *' o5 s+ F x# f- p; A( y& g0 }
- * You should have received a copy of the GNU General Public License6 Y3 T: D- j! \6 T# }% {
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ {4 G; a0 B7 Y4 B0 \ - *
+ _9 d' U$ R3 F3 S! e5 t# o0 } - ******************************************************************************$ ]8 o% o: Y% u. K
- */% n, q# l$ V# C5 X, n) e$ J3 s
- " m9 \+ U" u: S
- /* Header includes -----------------------------------------------------------*/
- c; E4 P/ u! E( `, V5 j+ K - #include "main.h"* w* ?7 U9 c# P$ z; ?! @5 o, k
- #include "stm32f4xx_xgpio.h"
+ b6 u; U2 |/ {$ h8 y8 C
9 P+ d; E, z1 G- /* Macro definitions ---------------------------------------------------------*/
( v% Z+ T8 W2 M; Y) H1 S - /* Type definitions ----------------------------------------------------------*/' P: v2 n3 Z% Y
- /* Variable declarations -----------------------------------------------------*/$ i1 R: l/ A O* T3 a+ z3 Q( [
- /* Variable definitions ------------------------------------------------------*/
9 M; m$ a( e8 T1 D# R ^" z - /* Function declarations -----------------------------------------------------*/
/ G$ X+ N `" l) E - static void SystemClock_Config(void);
/ J U5 v0 c U6 T1 W% v @ - . a* ]7 ^9 p& X% H
- /* Function definitions ------------------------------------------------------*/
/ K/ e/ U- B$ ]0 W/ i
2 R0 N7 \& b6 T- /**" i4 t/ d3 T+ |7 _
- * @brief Main program." [0 D O) x3 L0 k+ m
- * @param None.8 P5 \% l5 {& F1 `- U8 ]$ O" A
- * @return None.
! V/ e! W, C/ P/ |+ C2 R - */8 e) g9 J% r% q
- int main(void), }* D1 y: `4 l# n9 [; E
- {
3 C( q( d% p' f2 N0 D O - /* STM32F4xx HAL library initialization:
/ t1 P) t' c! i: W$ u: Q4 \ - - Configure the Flash prefetch, instruction and Data caches! N- r; h" G9 N0 y8 b* S/ T
- - Configure the Systick to generate an interrupt each 1 msec
5 J% F5 z( F5 S0 ` - - Set NVIC Group Priority to 4
. s/ W8 k0 M5 ^/ ]: ?% h; r - - Global MSP (MCU Support Package) initialization
! V/ F# H: x# { - */" c. D! h5 p4 ~9 ~% l6 m
- HAL_Init();
6 [& T5 }' h" E W( k } - 6 F9 v/ _* @- ?2 J$ W9 d
- /* Configure the system clock to 168 MHz */
1 k- k+ t6 n) q - SystemClock_Config();. e7 L; R% m2 B
-
' W# G# I2 ]# X) L+ \* Z - XGpio led0(XGpio::PortF, XGpio::Pin9, XGpio::ModeOutput);
0 }9 J. x; ?. A" j - XGpio led1(XGpio::PortF, XGpio::Pin10, XGpio::ModeOutput);5 X! i+ w# X! |# m: A q+ W5 t
- * X* @( w3 L: f" u, ?4 a
- led0.open();
) r; U0 N2 K, B$ j# o! I - led1.open();% a7 q6 X6 \5 Z
-
7 w8 k" v4 d! d. U - for(;;)# f3 o8 L. Q. u
- {
: Z) h5 q# n* e% f: G6 T - HAL_Delay(250);
- ^5 v8 a' q+ {9 }3 m \, t7 A' W& Q - led0.toggle();
" j9 ]" F7 G; ~/ Z. U* x: u - HAL_Delay(250);. h% u% H$ z8 U5 V. Z! L: G
- led1.toggle();! v7 D2 R' ~, Q: p
- }
F3 G5 m, H* d# T - }/ r0 X( c2 y; f i; J4 ]
- 5 v8 a+ J' Y# y3 F( \
- /**
% f- J0 X' e/ ^1 [& c; k - * @brief System Clock Configuration* r* |& `( H! d7 D4 b
- * The system Clock is configured as follow :
6 _+ i V2 v2 N - * System Clock source = PLL (HSE)
) Y6 P# U7 M3 d4 s U" l - * SYSCLK(Hz) = 168000000
8 ]7 T2 v; G3 J) ` [: k - * HCLK(Hz) = 1680000008 C y% Q+ y1 ]" {& N+ q& r
- * AHB Prescaler = 1
/ }' F9 u, D- j# M1 d - * APB1 Prescaler = 42 i! Y; B P/ t) @
- * APB2 Prescaler = 2
3 j* e5 z. N$ B; A- u - * HSE Frequency(Hz) = 8000000
" Z1 \: x0 O$ S - * PLL_M = 8
+ O3 Z p8 o, E - * PLL_N = 3362 s J( x7 F' r2 }) k9 v1 J4 @5 x. a
- * PLL_P = 2
1 c% G3 A- i% F5 c+ A5 V, x, ?# H - * PLL_Q = 7
5 U: G, J" ~4 U+ B - * VDD(V) = 3.3
+ [ [9 M$ s/ ?: U N6 V: E+ O - * Main regulator output voltage = Scale1 mode
- a8 I! v& u- R - * Flash Latency(WS) = 5
+ x, w& i9 I3 Y- l p) K; w0 s - * @param None! I5 a: P: j0 V V2 |( k
- * @retval None
2 x* ~' G# T/ B8 h - */
. z8 @, G" C M5 g* i2 E3 Y; ] - static void SystemClock_Config(void)% K3 }" v: z+ O2 C/ V
- {7 I. M3 x$ \+ C2 G+ v- Y# W* Z
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
0 O! L8 Y9 }# Z - RCC_OscInitTypeDef RCC_OscInitStruct;( X2 l$ Z- A5 I- G# k) b* a
- 2 X' L3 V7 L0 c) S. N5 |: A. e
- /* Enable Power Control clock */ d9 E; V4 _& ?0 J" f+ W
- __HAL_RCC_PWR_CLK_ENABLE();
& L) Q, f3 }9 P) A9 {$ u - c5 `# @+ }1 R) d' G
- /* The voltage scaling allows optimizing the power consumption when the device is % G2 ~5 L1 m2 l( h/ N: ] h
- clocked below the maximum system frequency, to update the voltage scaling value ' ^# i" D) V' O( k# l$ }
- regarding system frequency refer to product datasheet. */! \2 L7 M/ @! h; p! J! c d
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
: X+ I; p2 m# l" ~* p6 G - / G* e) J+ E7 z6 B2 p/ j% V
- /* Enable HSE Oscillator and activate PLL with HSE as source */2 |. J+ X* A2 ~; E6 c% N* X
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;8 k" L1 {- `7 e" Q8 h9 @" v- ^
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;7 j9 X. @* K% e1 I* e$ R
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;: Y6 I0 @* x# c& _3 P6 d1 V
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
! u2 o0 \" o6 H8 R& N9 B5 [. d - RCC_OscInitStruct.PLL.PLLM = 8;
7 Z% U6 K8 a5 p3 X/ _/ M - RCC_OscInitStruct.PLL.PLLN = 336;
3 a' t1 ]6 ]4 b5 ` - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
8 p4 s8 k. l0 ]- V, K - RCC_OscInitStruct.PLL.PLLQ = 7;
. o. `2 D2 p' M - HAL_RCC_OscConfig(&RCC_OscInitStruct);
( y8 j6 W# O0 `4 ~0 i -
! l2 G. \- m( ~, h- ] y - /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 * ]6 [' O. `) N9 M* V4 ?' v/ k
- clocks dividers */
( ?3 \& f$ J% K% y8 o - RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
. y1 X% j# [( Q j6 S" B) |% w Y - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
% H! f: r5 O& F1 F: [ - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
C9 s: P6 e, B# L" H2 T - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; # l; J! ^% V' k( C/ J; B9 Z
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; ; K% ~' d( X5 U7 I7 m% z1 E
- HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
0 Y/ z7 j: w; B4 S7 O
" ~# h5 t9 f0 Y4 ]- /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported */9 u# T+ f# N9 U
- if (HAL_GetREVID() == 0x1001)& `# G' `8 `: |9 L
- {
/ R6 i4 f" K, f. I2 s# X - /* Enable the Flash prefetch */" d; U2 ]4 _+ C0 ], Y
- __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
; ~9 J+ f: i E/ q W! T& A$ u - }2 u7 \2 W+ \# \, d. e" H6 L- T* l
- }
/ }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 |
用 C 语言想要写出容易维护的程序,远远没有 C++ 语言实现的要简单,更何况刚入行没有多久的新人去开发那,C++ 语言只要稍微学习一下类和虚函数,用到开发中还是比较容易的,然后后续的程序维护也简单了些。
是这样的,但是 mbed 的程序,当应用层的对象销毁时,底层的硬件,并没有跟着去恢复上电的初始状态,驱动部分并没有用 C++ 去实现,只是封装了 C++ 接口。不过 mbed 经过这么多年的发展已经到了 v5.8 生态系统也比较完善,也有一定的生产力了,看来是时候把它用在工作当中了
赞一个
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
这是我的类
PORT:
PORT:
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;
if (gpio==GPIOD) PortNo=3;
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;
RCC->AHB1ENR |= 1<<
! {. Q6 A5 @/ Z
setType(type);
setMode(mode); G% ~, P+ m; Z0 V. b0 G! G8 w
setPUPD(pupd);
setSpeed(speed);! `' `6 n; t* }& A( X6 s4 O8 M
}' L$ E- A8 W. `) [
void PORT:
///GPIO->BSRRH =Pin;6 V6 E \$ x4 ?
GPIO->ODR &=~(1<<(PinNo/2));% A4 p: X) _: \
}
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) {
//GPIO->OTYPER &= ~(GPIO_OTYPER_OT_0 << (uint16_t)(PinNo/2)) ;
//GPIO->OTYPER |= (uint16_t)(type<< (uint16_t)(PinNo/2));
GPIO->OTYPER &=~(1<<(PinNo/2));
GPIO->OTYPER |=type<<(PinNo/2);
}
void PORT::setSpeed(GPIOSpeed_TypeDef speed) {
//GPIO->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << PinNo);
GPIO->OSPEEDR &=~(3<<
GPIO->OSPEEDR |= (speed << PinNo);
}
void PORT::setPUPD(GPIOPuPd_TypeDef pupd) {
//GPIO->
GPIO->
GPIO->
}
void 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<<
GPIO->MODER |= (mode << PinNo);; m& C/ H% m+ s6 T- ?; O0 w7 @$ W
}
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 |
}
支持 f103c8t6和f407vet6。
usart,iic,spi 实现软硬2种方式。
LED 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);点黑
7 e7 j; y) }, y, o9 u$ |
SWITCH wifiSwitch(GPIOE,9);$ Y; A1 u+ F, V) h; J# z5 [
使用:if (wifiSwitch.isOn) 是否开,if (wifiSwitch.isOff) 是否关,类里已经处理重复触发。
) q6 e8 f7 D" Q5 e6 s
USART usart_wifi(USART1,new PORT(GPIOA,9),new PORT(GPIOA,10),0,115200);
使用:usart_wifi.sendData(buf,8);
9 n" X) O4 G, X9 m0 k' Z- m& h
SPI spi_flash(SPI1);或者SPI spi_sort(new PORT(GPIOA,9,....)软件模拟spi
使用: 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));
WIFI wifi(&usart_wifi);
DTU dtu(&usart_dtu);
LAN lan(&spi_lan,new PORT(GPIOE,0),new PORT(GPIOB,8),new PORT(GPIOB,9),&LED_Lan);
+ 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);
内部自增加socket,2 y8 a, r( K( ?& V9 d8 j9 R x
EFLASH eflash(&spi_flash,new PORT(GPIOA,4));
VAR var(&eflash); 变量管理,如果用内部存储,就定义个 MEMORY flash(&spi....)然后 VAR var(&flash)
使用 var.setInt(key,value) var.getInt(key)
TEMPHUMI TempHumi(&usart5);
ION Ion(&usart5); 温湿度和负氧离子,使用的是同一个485的 usart5口
PM25 Pm25(&iic_Pm25); pm25用的iic的,如果是串口的,就用 PM25 Pm25(&usart5);2 h0 E# o+ @0 I$ }, D
使用 Pm25.setType(厂家设备型号), 里面会处理,发送什么数据,接收应该检测什么数据。