01. ADC概述# r& `4 r' f0 j. N( v( y* K. J4 u
STM32F4xx 系列一般都有 3 个 ADC,这些 ADC 可以独立使用,也可以使用双重/三重模式(提高采样率)。STM32F4 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 19 个通道,可测量 16 个外部源、2 个内部源和 Vbat 通道的信号。这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。% [5 J1 n2 e, z
- k- \1 e. U# Y, m1 |: E$ x
相关文件为 stm32f4xx_adc.h和 stm32f4xx_adc.c。
) T t4 P& F& A6 s, v7 s; [: A" w
02. 相关类型, t* Q5 T4 f+ Y
- /** + U- f1 ~# z3 f: P( O
- * @brief ADC Init structure definition ) z* ^8 G$ z) Y1 e
- */ 9 m$ Z# N" C5 u) ]2 Y! S) L
- typedef struct, T4 u1 G# D8 a7 N2 w$ ?4 A
- {3 T! b! b2 v4 h' _
- uint32_t ADC_Resolution; /*!< Configures the ADC resolution dual mode. ( O5 R8 u! E& v5 [6 I2 z
- This parameter can be a value of @ref ADC_resolution */ 6 z2 E3 ]% L: h2 S4 N
- FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion # |& f' ~0 l" @( w$ `
- is performed in Scan (multichannels) 5 i$ C; ]. I; X; A2 y, w
- or Single (one channel) mode.
3 X) B: E/ C0 l5 H, g( l - This parameter can be set to ENABLE or DISABLE */
- d. K# |3 d. o& S' k4 k" b3 R% g - FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion
' x! e0 m" N, h- H1 V) e/ z - is performed in Continuous or Single mode.
0 t" p9 i7 {; K* b8 b2 y, C9 q - This parameter can be set to ENABLE or DISABLE. */
7 J- ?% q" {3 e4 R - uint32_t ADC_ExternalTrigConvEdge; /*!< Select the external trigger edge and
; ~+ b& u, E2 w" C% |: j - enable the trigger of a regular group.
+ N, a' f- ^6 C) b+ K) X - This parameter can be a value of
, @7 S0 \# F' V- u; `+ a - @ref ADC_external_trigger_edge_for_regular_channels_conversion */
3 J" [, Q/ I" q" e - uint32_t ADC_ExternalTrigConv; /*!< Select the external event used to trigger
: l5 N& ^0 ~4 a$ @ - the start of conversion of a regular group.) _, l3 B: x( ^
- This parameter can be a value of # p. g/ u7 z# B2 q$ x
- @ref ADC_extrenal_trigger_sources_for_regular_channels_conversion */+ N) Y4 x7 }6 L4 |( e; ^
- uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment
& e. K7 S. e! M% v$ h* Q2 Z - is left or right. This parameter can be 1 Z6 l, V# p5 q! V1 M
- a value of @ref ADC_data_align */
' \. p- t, A4 d( o ` - uint8_t ADC_NbrOfConversion; /*!< Specifies the number of ADC conversions
1 Q" W7 {* |* h: S/ {4 ` - that will be done using the sequencer for
7 [0 L0 A$ w7 k3 N' w V - regular channel group.
1 o O2 Q9 d# a - This parameter must range from 1 to 16. */
* q! w [9 V7 ^4 Y2 y7 i+ \ - }ADC_InitTypeDef;6 h1 j, t0 U. b: t( C
; W A g& x8 K: i- /** 2 l. e# \* J7 Z" @7 R
- * @brief ADC Common Init structure definition
5 U! d* Y* ^. o& Q" s: s: u1 G/ x/ { - */ ! a# I8 v3 H! W. b+ I: M
- typedef struct " l( f* l& k0 M' ^
- {3 E$ ?! b+ h. Q
- uint32_t ADC_Mode; /*!< Configures the ADC to operate in
4 h3 f# k; B7 t8 o3 L9 G8 W - independent or multi mode.
$ B) {7 X* E* Y- b2 S$ v - This parameter can be a value of @ref ADC_Common_mode */ 5 L+ u; v5 B" @1 C( c6 H! H. d
- uint32_t ADC_Prescaler; /*!< Select the frequency of the clock - V& n) J: r+ K
- to the ADC. The clock is common for all the ADCs.
5 ?) i. H5 U1 K4 L* T. f - This parameter can be a value of @ref ADC_Prescaler */
9 i6 w8 Y0 B* S# w Y* Z4 d" v, \ - uint32_t ADC_DMAAccessMode; /*!< Configures the Direct memory access @4 _1 o) h( r- q
- mode for multi ADC mode.
3 t1 U3 d, Z+ @ - This parameter can be a value of 1 K9 [0 a, f" C/ K7 I
- @ref ADC_Direct_memory_access_mode_for_multi_mode */5 @, H. G0 C. u& q7 k0 s. Z% a
- uint32_t ADC_TwoSamplingDelay; /*!< Configures the Delay between 2 sampling phases.
7 M. C6 {. A1 Y! H5 k& L* [6 J - This parameter can be a value of 9 a j- G, d% b+ U `7 z
- @ref ADC_delay_between_2_sampling_phases */
7 Q& B" G6 m J- G" ? - + G$ g1 Y5 a. p+ y0 J
- }ADC_CommonInitTypeDef;
( |# ~- ]2 @/ N/ _* u, F1 l5 x - # V5 @" I. g$ i# i, \1 c8 f
" F6 Q' D9 s, t3 g$ ^ _% l- /* Exported constants --------------------------------------------------------*/
: L8 O9 M% A6 z) q
* p0 S1 s. i* t h( w; F W* K- /** @defgroup ADC_Exported_Constants
( M! ^: m6 T4 I2 ]8 u' j - * @{
5 O7 \4 G3 z; Q2 r$ j, Z+ O - */
) N3 G2 i. l" D4 V6 O, h; { - #define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \
! w& o! w# B- G( a/ P4 Q - ((PERIPH) == ADC2) || \' p7 a. N, @2 }3 U/ N
- ((PERIPH) == ADC3)) % `$ W9 ~3 P* Q5 Z0 }
- - H2 e9 r% ]0 V# v! o! W+ Z- f
- /** @defgroup ADC_Common_mode
/ H6 D, R' t/ R; p! D' Y+ u - * @{
6 K- h Q, e4 q1 N. `4 d - */
$ M9 D% v9 K2 Y' E0 ^2 O* {( I - #define ADC_Mode_Independent ((uint32_t)0x00000000) 2 c) ~) x: ?" l$ O: J* r5 H. v% S
- #define ADC_DualMode_RegSimult_InjecSimult ((uint32_t)0x00000001)9 _$ S( a% Q5 O+ e" \
- #define ADC_DualMode_RegSimult_AlterTrig ((uint32_t)0x00000002)8 c: H7 H, B0 S4 p0 b z
- #define ADC_DualMode_InjecSimult ((uint32_t)0x00000005)
# p* C6 q; Z* v( Q, T) N- ^, Z - #define ADC_DualMode_RegSimult ((uint32_t)0x00000006)
! e0 w [/ g& A9 G& U5 n - #define ADC_DualMode_Interl ((uint32_t)0x00000007)
% m$ ?, i8 Y$ z# H - #define ADC_DualMode_AlterTrig ((uint32_t)0x00000009)
6 I* m* A) \6 \$ G' ?3 ]3 m - #define ADC_TripleMode_RegSimult_InjecSimult ((uint32_t)0x00000011)/ B1 q! J0 o4 S% m+ E+ C
- #define ADC_TripleMode_RegSimult_AlterTrig ((uint32_t)0x00000012)" n# O$ ]# J" w3 @8 g i6 I
- #define ADC_TripleMode_InjecSimult ((uint32_t)0x00000015)
) \2 Z" }- A2 Z' \/ J" X - #define ADC_TripleMode_RegSimult ((uint32_t)0x00000016)6 E: f8 B# f. T& b6 Q0 q- u
- #define ADC_TripleMode_Interl ((uint32_t)0x00000017)/ G# Z8 c+ O: l% I
- #define ADC_TripleMode_AlterTrig ((uint32_t)0x00000019)) q% \+ }1 \7 W o' W0 K
- #define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \& O9 l# c7 }$ n& k3 x1 {+ P
- ((MODE) == ADC_DualMode_RegSimult_InjecSimult) || \
) Z1 D1 F( l" y+ f7 S - ((MODE) == ADC_DualMode_RegSimult_AlterTrig) || \" q/ D8 T$ w- I% e, V/ q
- ((MODE) == ADC_DualMode_InjecSimult) || \
! D: r) @3 S1 q* n: I* k, ^5 ^ - ((MODE) == ADC_DualMode_RegSimult) || \, b* p4 ~/ S5 y. |" `
- ((MODE) == ADC_DualMode_Interl) || \
( T/ x3 \& d* [, C4 x: @) Q; O - ((MODE) == ADC_DualMode_AlterTrig) || \
3 d. a# q* \8 n# U5 O8 y - ((MODE) == ADC_TripleMode_RegSimult_InjecSimult) || \+ u% Q; {7 s/ C5 a
- ((MODE) == ADC_TripleMode_RegSimult_AlterTrig) || \
* D2 M% y" A+ i: o0 T - ((MODE) == ADC_TripleMode_InjecSimult) || \! L0 d, R: N. Y3 ~; v0 Z1 h
- ((MODE) == ADC_TripleMode_RegSimult) || \" Q5 N2 M3 a" ^. |* ^* V/ j
- ((MODE) == ADC_TripleMode_Interl) || \
' I" A1 X# o0 S, Q8 Q& n - ((MODE) == ADC_TripleMode_AlterTrig))
2 {& l- E$ v* n! Q" a8 L - /**. R& y; C% M# N- x
- * @}; i, o: K3 l. ]% T* D( Y, ^- C
- */ ! W( T9 c# J$ ]& Q5 ?$ t5 O
- 0 Y/ T3 o. [$ o. S* i& Q# e
- - m9 w4 n, m/ p% N
- /** @defgroup ADC_Prescaler ) S2 Q% k* R$ o
- * @{$ u: K& ~- S8 R6 Y
- */
# i* B( W/ X" B2 F6 c- O- G& ?) v - #define ADC_Prescaler_Div2 ((uint32_t)0x00000000): `" r: Z9 ?* O6 C/ S, K
- #define ADC_Prescaler_Div4 ((uint32_t)0x00010000)
5 i: {. ^. V( \+ L; m- n p5 K( b - #define ADC_Prescaler_Div6 ((uint32_t)0x00020000)$ K+ l! H% A& Q* O& Y/ N T; H+ W
- #define ADC_Prescaler_Div8 ((uint32_t)0x00030000)
0 `0 D8 S. E+ H- b W( U; ] - #define IS_ADC_PRESCALER(PRESCALER) (((PRESCALER) == ADC_Prescaler_Div2) || \
6 p9 K) g! p. V' l6 L - ((PRESCALER) == ADC_Prescaler_Div4) || \
9 x2 A, m/ E% c' t8 D - ((PRESCALER) == ADC_Prescaler_Div6) || \
4 X3 y7 ~/ [( M& ]* [+ ?) k - ((PRESCALER) == ADC_Prescaler_Div8))
+ e% q' ~4 K0 M4 v/ B2 { - /**
9 w/ N: N0 U3 ]; n+ ?; w v f: \ - * @}1 }& B& h1 S+ W$ x
- */
F& G+ N2 N2 B! N V
5 q% D8 @2 j& a6 u. B \5 C3 p- 4 i4 j# U) n5 G) Y
- /** @defgroup ADC_Direct_memory_access_mode_for_multi_mode
+ K |9 A# Z# t! S - * @{
$ X7 n M) M8 e" z+ _7 H- o - */ ! `) L) R" r0 P( D+ i P
- #define ADC_DMAAccessMode_Disabled ((uint32_t)0x00000000) /* DMA mode disabled */
7 S. p* J1 p6 g6 J - #define ADC_DMAAccessMode_1 ((uint32_t)0x00004000) /* DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3)*/
* e( X4 D, R2 d- G* f - #define ADC_DMAAccessMode_2 ((uint32_t)0x00008000) /* DMA mode 2 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2)*/
" W& i& E( x# s' C - #define ADC_DMAAccessMode_3 ((uint32_t)0x0000C000) /* DMA mode 3 enabled (2 / 3 bytes by pairs - 2&1 then 1&3 then 3&2) */$ G# X& U( n9 E1 C
- #define IS_ADC_DMA_ACCESS_MODE(MODE) (((MODE) == ADC_DMAAccessMode_Disabled) || \, f* t/ O# a! t& b1 d
- ((MODE) == ADC_DMAAccessMode_1) || \9 K$ v3 ^6 \* A0 \- {+ C3 a4 e
- ((MODE) == ADC_DMAAccessMode_2) || \& r3 O/ w& [% @; p x
- ((MODE) == ADC_DMAAccessMode_3))) ~# N1 T; i4 C
" l/ @( B1 c; y7 t& t( f8 u/ W- /**
0 m8 ^' x1 ?0 O3 j: ]3 K, u - * @}
( g: l" `# a# M7 g5 h- @) s7 \ - */ 4 g$ [# d d. a6 U; e1 S
- 3 v( i& {' Y Y1 M) w% u. I
- % V6 H2 K" T8 x: M
- /** @defgroup ADC_delay_between_2_sampling_phases
# s& j' Y( b1 [ - * @{5 X) h5 k4 Q, c2 o7 B9 R; R
- */
/ H9 g5 K" X( }+ g, [) V8 { t - #define ADC_TwoSamplingDelay_5Cycles ((uint32_t)0x00000000)
' z2 S$ w6 @3 }2 I8 @ - #define ADC_TwoSamplingDelay_6Cycles ((uint32_t)0x00000100)2 h9 R9 a; [/ X6 k% C- n: G
- #define ADC_TwoSamplingDelay_7Cycles ((uint32_t)0x00000200)
% k; ] I+ l6 a: G! _9 ]: r5 W - #define ADC_TwoSamplingDelay_8Cycles ((uint32_t)0x00000300)
& h ]8 r3 P; [8 m/ `" B+ S - #define ADC_TwoSamplingDelay_9Cycles ((uint32_t)0x00000400)
5 c% B& r# s/ F8 n( R# o - #define ADC_TwoSamplingDelay_10Cycles ((uint32_t)0x00000500)
3 I. g; {; b# ?6 t* C - #define ADC_TwoSamplingDelay_11Cycles ((uint32_t)0x00000600)
3 Z1 [6 o0 O; O+ {% a5 Y) f - #define ADC_TwoSamplingDelay_12Cycles ((uint32_t)0x00000700), X* _' H: K9 H8 j/ E8 D: m
- #define ADC_TwoSamplingDelay_13Cycles ((uint32_t)0x00000800)6 W- \: a8 T* Z' z) \7 w3 ?4 m
- #define ADC_TwoSamplingDelay_14Cycles ((uint32_t)0x00000900)- r. h6 K* G1 p7 x! U0 Y* Y
- #define ADC_TwoSamplingDelay_15Cycles ((uint32_t)0x00000A00)9 i* m! m. P3 L8 E
- #define ADC_TwoSamplingDelay_16Cycles ((uint32_t)0x00000B00)
" k) r6 f5 ~1 k2 } - #define ADC_TwoSamplingDelay_17Cycles ((uint32_t)0x00000C00)
/ v; P. V( {* v; V# E9 O - #define ADC_TwoSamplingDelay_18Cycles ((uint32_t)0x00000D00)
) c9 Z8 }9 m( X; k - #define ADC_TwoSamplingDelay_19Cycles ((uint32_t)0x00000E00)
: K8 Y1 \& Q9 c5 d - #define ADC_TwoSamplingDelay_20Cycles ((uint32_t)0x00000F00)& r _ W, Y8 c
- #define IS_ADC_SAMPLING_DELAY(DELAY) (((DELAY) == ADC_TwoSamplingDelay_5Cycles) || \. ^7 b1 P9 ~: C3 `1 `
- ((DELAY) == ADC_TwoSamplingDelay_6Cycles) || \
) y6 ^; A* F8 h# A - ((DELAY) == ADC_TwoSamplingDelay_7Cycles) || \. E4 H* l' E9 J+ `
- ((DELAY) == ADC_TwoSamplingDelay_8Cycles) || \
- G" y& i) X0 j$ N6 H3 X0 D& b" a5 i - ((DELAY) == ADC_TwoSamplingDelay_9Cycles) || \: c( r" P3 @9 ]8 ^# D! ?
- ((DELAY) == ADC_TwoSamplingDelay_10Cycles) || \
& ^+ h* o3 I. c: c - ((DELAY) == ADC_TwoSamplingDelay_11Cycles) || \0 j' ~- q' x+ A, R$ \
- ((DELAY) == ADC_TwoSamplingDelay_12Cycles) || \
, U/ J6 {( G1 b: p9 \, L; W! z - ((DELAY) == ADC_TwoSamplingDelay_13Cycles) || \
: U3 Y' O$ l! p - ((DELAY) == ADC_TwoSamplingDelay_14Cycles) || \# r! |& t$ @7 g, g8 P7 |
- ((DELAY) == ADC_TwoSamplingDelay_15Cycles) || \
( D$ ]( V! d* ^, H. D$ A - ((DELAY) == ADC_TwoSamplingDelay_16Cycles) || \
S4 N4 x+ r* H1 }- k5 s- ] - ((DELAY) == ADC_TwoSamplingDelay_17Cycles) || \
) `" j v) K( P- k6 O7 @6 F; p- L1 q - ((DELAY) == ADC_TwoSamplingDelay_18Cycles) || \
" t1 S* R" Y+ ~ - ((DELAY) == ADC_TwoSamplingDelay_19Cycles) || \) i6 k* m' i3 A8 R
- ((DELAY) == ADC_TwoSamplingDelay_20Cycles))0 d" w q& u8 V0 K9 \! b3 z
- * S; b6 j$ F* `; ?9 {$ ]
- /**5 L4 ?" _! L$ d
- * @}6 G6 Q- i+ L3 @, H& s
- */
5 j5 F% L# k5 V' s - / f' w8 Z" v) [6 r7 _* Z
- " Q9 v' b5 l) ]3 B& ?4 [8 P2 e2 c
- /** @defgroup ADC_resolution
6 `& P: `- j/ l/ I4 h+ ^7 P4 U* ~ - * @{
, C- k7 V9 A& `( z4 c - */
/ R& z; H. o% j1 @ h - #define ADC_Resolution_12b ((uint32_t)0x00000000)
) x* z2 I$ F1 K, G# Q - #define ADC_Resolution_10b ((uint32_t)0x01000000)
& M0 i p) ^! J# R! q, P6 K - #define ADC_Resolution_8b ((uint32_t)0x02000000)
i) @+ l1 A6 l: W, S, T; y - #define ADC_Resolution_6b ((uint32_t)0x03000000)! h, N; T; n( Q; z0 T
- #define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_Resolution_12b) || \
7 K/ A% j! t) {: i7 C- Y - ((RESOLUTION) == ADC_Resolution_10b) || \: g* r* G) H6 R& A5 Q3 N3 }
- ((RESOLUTION) == ADC_Resolution_8b) || \
6 c9 J. V4 g; ], }% J: _6 E* Z& O - ((RESOLUTION) == ADC_Resolution_6b))1 T% n) M( R' B
% B' n: Y. S _, A8 G6 O% t- /**
8 h" a& w8 y' c5 ]: X4 r - * @}( c9 z2 |8 p0 ]2 u2 w- X, ^
- */
3 G/ K% R% R% k
) E9 V: p2 o* `8 ^2 z- * T2 ~" b3 J* n l$ S* B
- /** @defgroup ADC_external_trigger_edge_for_regular_channels_conversion
4 w' Z8 T( ^, g M - * @{
& \5 }$ s6 |2 S$ N - */
/ U4 F G0 d x) c" H - #define ADC_ExternalTrigConvEdge_None ((uint32_t)0x00000000)& F; r1 m& _1 j
- #define ADC_ExternalTrigConvEdge_Rising ((uint32_t)0x10000000)
. I% I. ?* k h0 ] - #define ADC_ExternalTrigConvEdge_Falling ((uint32_t)0x20000000)
9 c* g! H1 o1 L" u) c. M - #define ADC_ExternalTrigConvEdge_RisingFalling ((uint32_t)0x30000000)
q6 c9 i9 x$ t - #define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigConvEdge_None) || \
. w& L, g: Z9 x3 F% ^ - ((EDGE) == ADC_ExternalTrigConvEdge_Rising) || \
8 \" F$ y: N5 {: ~2 i) O1 n& i& o - ((EDGE) == ADC_ExternalTrigConvEdge_Falling) || \/ X6 A) b( n Z
- ((EDGE) == ADC_ExternalTrigConvEdge_RisingFalling))
1 V1 Y0 G" R0 Y) W2 r1 y: O9 ? - /**
8 |- O# t7 U" g0 r( w - * @}
3 r. j1 `, y4 S$ O3 i - */
$ d5 h* L, k1 S - " x, x" ?/ I$ d: U" M
p/ c, `+ \* p. v- /** @defgroup ADC_extrenal_trigger_sources_for_regular_channels_conversion 2 N, E* F# j9 `3 _- ?
- * @{
. F9 l* C' R+ k/ \ B/ T" Z - */
, n6 M$ Y/ W1 g - #define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000). A/ |$ P1 n6 M+ g, g
- #define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x01000000)* K o; y+ z" A! G- z+ y: a
- #define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x02000000)
% A! w3 V. _* q4 g. {* S0 o - #define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x03000000)' Y6 [3 X6 \5 y$ g! w% N
- #define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x04000000)
. W* |; s/ i/ m - #define ADC_ExternalTrigConv_T2_CC4 ((uint32_t)0x05000000)
' q' _6 |1 J/ D! h8 L - #define ADC_ExternalTrigConv_T2_TRGO ((uint32_t)0x06000000)6 S* s) \+ Z* n$ r8 d
- #define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x07000000)
- g1 t8 }* e6 `) T" w, n' \# | - #define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x08000000)0 t V( P7 W' V6 F+ P8 t' G
- #define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x09000000)9 p( ]# d; k9 P( m$ l. C: z! X; R
- #define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x0A000000)
$ l+ l+ _( x8 h2 R7 `7 u. ~" _- B( z2 ^ - #define ADC_ExternalTrigConv_T5_CC2 ((uint32_t)0x0B000000)' h! U, A# q) r! {- e8 i
- #define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x0C000000)
; V6 x9 F( I+ \5 v) ^ k5 F - #define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x0D000000)
% K5 `! J! h/ H& F. R0 `4 ]& T4 _ - #define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x0E000000)
3 w# q0 k! R" G! j - #define ADC_ExternalTrigConv_Ext_IT11 ((uint32_t)0x0F000000)0 K* o, _& P& n! C: b S k
- #define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \0 Y9 w0 J! v1 U0 o% @7 }0 V4 i, A
- ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \
; j3 l0 ]" D! x1 J" O( a - ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \
% D; X! b1 X6 t7 `4 P. w0 T - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \
+ B& D J1 L: \' ]! j: T - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \
3 \* i) V0 _7 O2 ] - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC4) || \# B! x; q6 R) C. n @
- ((REGTRIG) == ADC_ExternalTrigConv_T2_TRGO) || \. {9 l3 S4 a* o4 r
- ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \
, S8 P! A+ Y4 ~( q* I - ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \
& d# p, V5 G' d - ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \! o( ] G1 ?7 t* n8 R& a' Y" N) _
- ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \6 r8 {: V4 y' J# g* J7 x, g ~
- ((REGTRIG) == ADC_ExternalTrigConv_T5_CC2) || \
! R$ {, D+ n. w1 _; V- y - ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3) || \0 g4 W! I* `4 a
- ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \1 C8 h1 G* `+ Y; Z
- ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \, s% r* L4 l6 R& w/ Y3 W
- ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11))' k& d7 J8 e. ]
- /**: C/ j! h8 {3 t1 p" a% ^/ x, G( _
- * @}! b u5 P& V/ P9 R& }4 i+ e
- */
r9 S+ ~6 y7 W2 N) ^
$ a4 L- W Q! d- 9 C6 l7 l+ `) k' s7 [8 |) s+ V
- /** @defgroup ADC_data_align 2 R7 B9 {2 W9 U2 D1 P2 [$ C
- * @{
2 u) \, y( T, ? R- ? - */ 1 H; y0 ~ h/ q1 u! T
- #define ADC_DataAlign_Right ((uint32_t)0x00000000)/ }1 T5 R9 u5 L
- #define ADC_DataAlign_Left ((uint32_t)0x00000800)
w, E7 B; K5 k& V7 t3 Z' r; S+ g - #define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \! X9 k" e5 |& ?- F' T/ Z; }4 a7 `
- ((ALIGN) == ADC_DataAlign_Left))
% O! z% l. e- S! A9 I - /**2 h7 @' a1 _+ B/ w" n1 v3 \4 o6 ^
- * @}+ c# h1 \5 X$ U
- */
% w8 K6 B) Q5 q4 a2 W - - A& ?2 T' t4 C& @9 C! V. `
# M7 V' |+ [/ ~+ ^. E# _& @( c- ^- /** @defgroup ADC_channels & S# i% c1 m$ `& E, m6 a$ b
- * @{
: f% w3 q3 l; L+ t/ m" s: I7 k - */ - }& }" {) {5 Y- \
- #define ADC_Channel_0 ((uint8_t)0x00)3 p# w; U7 v# ^$ {5 Q4 U. `
- #define ADC_Channel_1 ((uint8_t)0x01) p! X4 c% {! u7 j1 O D0 l, n' U
- #define ADC_Channel_2 ((uint8_t)0x02)
K" e/ {0 e/ h" b/ ^ - #define ADC_Channel_3 ((uint8_t)0x03): J' M! r n- B$ W5 F# X
- #define ADC_Channel_4 ((uint8_t)0x04); g; A, B9 d. q g3 b3 p# \% P& ]
- #define ADC_Channel_5 ((uint8_t)0x05) C% s4 ]7 J# H5 G/ g
- #define ADC_Channel_6 ((uint8_t)0x06)
9 P: a+ C# P7 C- D. w - #define ADC_Channel_7 ((uint8_t)0x07)
' ^- D8 Q; o d0 ]6 J3 w" L - #define ADC_Channel_8 ((uint8_t)0x08)
( g* }6 {1 u* w0 S6 K - #define ADC_Channel_9 ((uint8_t)0x09)% c; ~* f( S. Y2 h3 c
- #define ADC_Channel_10 ((uint8_t)0x0A)" V& W& L1 F4 l7 r1 _, W
- #define ADC_Channel_11 ((uint8_t)0x0B)
0 b' }( m: K" {2 ~ - #define ADC_Channel_12 ((uint8_t)0x0C)
" t$ D# W) _0 ?/ x( f) v - #define ADC_Channel_13 ((uint8_t)0x0D)
# O' s3 N8 B: q2 J- V0 u, z7 Q - #define ADC_Channel_14 ((uint8_t)0x0E)
; m8 z+ w1 v2 y/ _ - #define ADC_Channel_15 ((uint8_t)0x0F)8 q; u, s+ y$ u. Y% _$ n% j
- #define ADC_Channel_16 ((uint8_t)0x10)+ P! G9 s4 T( K8 X6 X7 P2 I
- #define ADC_Channel_17 ((uint8_t)0x11)
+ l0 X7 P2 r) F" \# r - #define ADC_Channel_18 ((uint8_t)0x12)
7 ^# V3 ~5 f% C: ~/ R - / F. u0 U- Z5 C9 k( \/ @' y
- #if defined (STM32F40_41xxx) || defined(STM32F412xG) || defined(STM32F413_423xx)4 }" x, r6 y7 Q: v9 |* O9 K2 d
- #define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16)
& p* j) L( O! E2 Z/ N+ @ - #endif /* STM32F40_41xxx || STM32F412xG || STM32F413_423xx */
* u3 H4 \+ `2 b3 i" A
: D( m/ }, y" J6 e: {4 N: X. }- #if defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx) || defined (STM32F410xx) || defined (STM32F411xE)
+ O! ~! H4 @: I# t2 f( I u - #define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_18)
8 w5 ?$ ~; j2 n - #endif /* STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F410xx || STM32F411xE */
) h: L# F6 n+ U+ R) F( A
5 f! H2 W+ R8 [# y% A+ Q. W0 ?- #define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17)' K; q' t/ U2 ^' D
- #define ADC_Channel_Vbat ((uint8_t)ADC_Channel_18)) e2 K- j% |5 P, ?% e8 f+ Y
- ' |2 T& y: x" e8 h: ]
- #define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || \
0 `4 u, @6 \9 q8 q( E+ u- e% @; | - ((CHANNEL) == ADC_Channel_1) || \
6 {- T* I: H0 v$ Q( t - ((CHANNEL) == ADC_Channel_2) || \
3 o( E$ }4 b5 u. x# a - ((CHANNEL) == ADC_Channel_3) || \
, S# @7 L& Y% U+ T! i7 v. Z+ v - ((CHANNEL) == ADC_Channel_4) || \
8 X3 j; X! A/ @ - ((CHANNEL) == ADC_Channel_5) || \
, G+ ~# X( s& C2 V# j( x: y - ((CHANNEL) == ADC_Channel_6) || \
# g6 Q o S& G: O. w - ((CHANNEL) == ADC_Channel_7) || \
5 |: y1 i) s2 R! r - ((CHANNEL) == ADC_Channel_8) || \
: J$ K% S9 V1 l0 V - ((CHANNEL) == ADC_Channel_9) || \% w/ l% I0 M( L% {7 J! K1 F
- ((CHANNEL) == ADC_Channel_10) || \
% v' G4 |: Z6 z, h5 M! F: L - ((CHANNEL) == ADC_Channel_11) || \
9 u s# e+ _/ E$ e% D - ((CHANNEL) == ADC_Channel_12) || \) _8 [; g R% g. S
- ((CHANNEL) == ADC_Channel_13) || \- [3 k+ I1 }9 h7 `
- ((CHANNEL) == ADC_Channel_14) || \
1 p) d" k8 [0 x - ((CHANNEL) == ADC_Channel_15) || \: ]+ M. v9 D: Z0 s
- ((CHANNEL) == ADC_Channel_16) || \! I- m4 M7 a8 p7 A
- ((CHANNEL) == ADC_Channel_17) || \
& E X1 ]: \; [: d+ \0 X - ((CHANNEL) == ADC_Channel_18))
1 O. o- Z0 K3 {: e$ Q3 J; n - /**
& Y7 K! {/ \0 F7 y3 v- z' o1 j l# ]5 g - * @}
/ O# ~% p, o3 }8 ^3 H - */ ! `7 f2 p) A1 q; U! u
0 J* \, F% j" ~6 h3 v4 d- {. A
2 \" w; p1 P4 T5 t* m- /** @defgroup ADC_sampling_times
6 N$ `( X: s% t - * @{
$ O0 c- t7 s7 | S - */ & L# n0 k' t' p3 C) w% I+ u
- #define ADC_SampleTime_3Cycles ((uint8_t)0x00)
6 ~2 n2 \* T" g6 v - #define ADC_SampleTime_15Cycles ((uint8_t)0x01)
) y5 a5 `+ q# H& k$ V* g' }# X, U - #define ADC_SampleTime_28Cycles ((uint8_t)0x02). ?: u3 ?' }1 b& x
- #define ADC_SampleTime_56Cycles ((uint8_t)0x03)+ s4 |% [, o" ]. g w
- #define ADC_SampleTime_84Cycles ((uint8_t)0x04)3 a i" I- ?* Y, s! S
- #define ADC_SampleTime_112Cycles ((uint8_t)0x05)
) _0 k/ Y4 D% i) G5 P6 A) G N - #define ADC_SampleTime_144Cycles ((uint8_t)0x06). A7 ?* k% q# t' s. l
- #define ADC_SampleTime_480Cycles ((uint8_t)0x07)0 u( {( R' `& F* K8 t5 L
- #define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_3Cycles) || \
0 O8 d n& W- X# G2 n/ [' e - ((TIME) == ADC_SampleTime_15Cycles) || \
" { A+ j/ F, j2 R) a - ((TIME) == ADC_SampleTime_28Cycles) || \/ o4 P' y( D: D B! W7 M/ B8 U
- ((TIME) == ADC_SampleTime_56Cycles) || \2 y0 N( q7 v* b0 F0 ?8 c: i: F! |7 U
- ((TIME) == ADC_SampleTime_84Cycles) || \ u& B. W" L4 x; c' W9 X; f
- ((TIME) == ADC_SampleTime_112Cycles) || \0 Q8 N% j1 F$ f& X/ A; @" Z! h
- ((TIME) == ADC_SampleTime_144Cycles) || \7 ]8 R5 i9 {* s; K# C
- ((TIME) == ADC_SampleTime_480Cycles))
' t; s7 S4 y+ h7 R0 {! [ - /**/ B' \% a& b& m' W* c' k
- * @}6 C3 @1 L& n: c% O. y" c$ S5 B
- */
L1 V7 M" l* g! G% P7 c/ v
# B" v8 O+ E0 L. c- a5 ~$ x- + T5 Y, h; Q6 c8 ~
- /** @defgroup ADC_external_trigger_edge_for_injected_channels_conversion
4 e. D8 M. y0 s0 b2 b, g - * @{
) e0 B; ], n8 g% ?% y, ]3 I6 {. S - */
5 I# Q$ n4 J1 B. j7 Y - #define ADC_ExternalTrigInjecConvEdge_None ((uint32_t)0x00000000)) s: @. g) w3 R1 k$ r
- #define ADC_ExternalTrigInjecConvEdge_Rising ((uint32_t)0x00100000)
7 F. b$ o S1 E- y! i4 J - #define ADC_ExternalTrigInjecConvEdge_Falling ((uint32_t)0x00200000)- o6 k* x5 u' J8 E; E
- #define ADC_ExternalTrigInjecConvEdge_RisingFalling ((uint32_t)0x00300000)1 u' @ S, U% {8 B
- #define IS_ADC_EXT_INJEC_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigInjecConvEdge_None) || \5 ^+ M. f) x- }. K- d
- ((EDGE) == ADC_ExternalTrigInjecConvEdge_Rising) || \5 ^3 Y, G3 b% h
- ((EDGE) == ADC_ExternalTrigInjecConvEdge_Falling) || \* L$ |% Q, ~# x
- ((EDGE) == ADC_ExternalTrigInjecConvEdge_RisingFalling))
7 Q; z# }/ [0 l - : [) t" A) J, ^$ U2 G+ n7 d- q) s
- /**
3 O. T8 Q5 X5 V V, S - * @}
+ W" v( K' S$ C, I - */ # u J% E) C: t3 d
% _' g$ w R- B$ q3 U
4 {' @, y) U- O- \' h: S& j- /** @defgroup ADC_extrenal_trigger_sources_for_injected_channels_conversion
8 k( F: O( M0 N; u2 H/ ^- W) W - * @{
9 x9 v" e8 E6 ~: {( { i - */
9 J8 i* C5 N$ ] v$ l# j - #define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00000000)7 g7 U3 _: P" y1 k/ e
- #define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00010000)) }! [0 n/ x$ }$ K' G7 `) [/ e6 y
- #define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00020000)
! J) g5 G% V3 C7 x6 K - #define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00030000)0 i' z, Y6 C' Y
- #define ADC_ExternalTrigInjecConv_T3_CC2 ((uint32_t)0x00040000)
! O, D- N. h3 Y: b2 X9 ]3 H - #define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00050000)& t( J7 ?- l5 i d
- #define ADC_ExternalTrigInjecConv_T4_CC1 ((uint32_t)0x00060000): r. H' t2 Q3 Z! S* x3 t. D8 ~
- #define ADC_ExternalTrigInjecConv_T4_CC2 ((uint32_t)0x00070000)" n7 c# J# Q0 b
- #define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00080000)
8 X6 ]. j+ `4 [ - #define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00090000)/ h, h7 n* C% O2 I5 i$ W
- #define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x000A0000)+ {, V' b ]/ U& W- s p2 {# o
- #define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x000B0000)
" v. z# @ Y$ b4 L - #define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x000C0000)
# c3 S9 w/ A2 E5 g M3 R0 ? - #define ADC_ExternalTrigInjecConv_T8_CC3 ((uint32_t)0x000D0000)
+ `% K# ~* e0 v, j% Z. |4 v - #define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x000E0000)6 }: B8 G5 T( L! d& `6 o, C# I% e6 S8 M
- #define ADC_ExternalTrigInjecConv_Ext_IT15 ((uint32_t)0x000F0000): ]) `+ m8 J% E, F, Z: H) y9 ?" A
- #define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T1_CC4) || \
3 K/ o% M( J; o* Q( @9 a - ((INJTRIG) == ADC_ExternalTrigInjecConv_T1_TRGO) || \6 N2 Y" B7 |5 c
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \! I+ V- ?( }( K/ B
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \
% b$ X& V) f. ^/ X+ N) Q& Y# U - ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC2) || \2 A; A3 n) j$ \& x7 \8 M4 N
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \
' G3 g0 z8 D- b$ ~/ y5 e. \3 Q - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC1) || \$ D5 d7 s4 L8 n2 Z; c
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC2) || \* w- @& H9 U" p3 e9 \
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \
8 k& c/ i0 E9 E: `! Q4 H6 I0 K - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \
: _- o+ V! {0 N# n - ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_CC4) || \, q, X2 w7 U( r) Y
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_TRGO) || \
, ]7 e9 F V# u - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC2) || \
% W- h' T" \3 P. c" N( P- N8 [1 s* [# y - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC3) || \' y4 V, S9 J" l4 x
- ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC4) || \: p0 P3 n$ v1 u. Y* p
- ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15))* R/ q }5 f' `& T' K, n2 M" r' j
- /*** H: I1 [4 i" B( T9 v
- * @}
$ q; M; V1 w0 ?' ] - */ 9 \2 Z; K$ c* V- Y. Q8 R
- 0 C X& a0 m/ A3 t& l2 d
- + T2 @0 x, l2 J3 ~
- /** @defgroup ADC_injected_channel_selection : @5 y; r: p. ^. O! r, \0 r
- * @{( e. S2 b1 h3 K: I& k( @7 P- {
- */
! N& T+ F2 M; n! U# h* G* W0 q - #define ADC_InjectedChannel_1 ((uint8_t)0x14)! t5 {; Z& s' y' B7 h+ y# o3 u
- #define ADC_InjectedChannel_2 ((uint8_t)0x18)
2 ?2 J6 H, u" ]# M; T# o( ~ - #define ADC_InjectedChannel_3 ((uint8_t)0x1C)
' G1 k/ b& W( u* G$ e - #define ADC_InjectedChannel_4 ((uint8_t)0x20)
! N3 U" a$ X$ u' s7 q, } - #define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \
5 E4 l% U# b2 O - ((CHANNEL) == ADC_InjectedChannel_2) || \
' }2 M& o( \8 Z7 l6 N( C - ((CHANNEL) == ADC_InjectedChannel_3) || \3 j' J8 ]3 [% W1 o1 h
- ((CHANNEL) == ADC_InjectedChannel_4))
' r6 J2 \3 O) {" h4 E3 g - /**. b% t- D0 O7 B: g+ Q
- * @}+ u& ?, r6 m* i# j, h4 d
- */ 5 T3 I, c4 _4 a! ]; ]4 V" M
6 F% s7 p* W2 J' Q1 }
* `0 M X1 k5 D* U* t N- /** @defgroup ADC_analog_watchdog_selection
( G3 c& v! D* q, k4 u. x3 p - * @{' S: D% q2 n' \
- */
5 t/ h) q1 }# [# X: Y3 I - #define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200)
! e9 r# D# `1 _ f5 o& v - #define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200)% h" q) r% O0 M: ]" H% ]
- #define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200)
6 @# ~1 P6 p" Y! f - #define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000)4 g3 [7 D* M3 m
- #define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000), T6 S3 c% }+ x" P7 q
- #define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000)9 d$ h) ]+ T% U- {$ G, d( r, B# T
- #define ADC_AnalogWatchdog_None ((uint32_t)0x00000000)
7 e( l5 T4 {$ Y5 Q) }4 d& h/ Q - #define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \# [5 l7 G' ^- f
- ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \. \' B a* T+ N0 {
- ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \
+ a0 ]7 k$ S7 g* g9 O; X - ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \9 `3 @8 o+ {# n r) G" y/ s
- ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \& T! B' Q% d6 }( w: U
- ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \
, Y0 Q% ~) u8 {! P: m$ z f - ((WATCHDOG) == ADC_AnalogWatchdog_None))% Q9 s& N I$ F, B# ~
- /**
$ [# h4 M) E W: [/ u - * @}
: M" \2 H6 N2 l3 n% y - */
7 P' Z: V7 Z- T9 [ - / J& f2 I* E: x' f: V
- + T* ]% l6 O* R% L" V! G5 D" ^
- /** @defgroup ADC_interrupts_definition
5 `1 W& H, ?2 f+ b s3 V0 D5 F) | - * @{. [4 i3 ]; b# h$ G6 I' c; x. a
- */ ' f$ b. c& o8 z+ P
- #define ADC_IT_EOC ((uint16_t)0x0205)
5 g% `& |3 C$ O. z2 v& }( r - #define ADC_IT_AWD ((uint16_t)0x0106) & B# R, W! ^+ u5 E& F3 R
- #define ADC_IT_JEOC ((uint16_t)0x0407) 7 L$ Z5 m( E- V
- #define ADC_IT_OVR ((uint16_t)0x201A)
4 E& m' P2 b6 p3 |! p - #define IS_ADC_IT(IT) (((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_AWD) || \
* r% X. f- v2 z- @ - ((IT) == ADC_IT_JEOC)|| ((IT) == ADC_IT_OVR))
% U, D) K; J, e; R/ l - /**' \; R" h7 k8 [) d& A
- * @}
8 O1 X. Q2 @7 {5 T, y5 D4 j7 h - */ ) i- t7 b) T) E$ X
# _) N5 g2 r0 l; O5 O
5 Q2 I- m* s0 ^/ u- /** @defgroup ADC_flags_definition ( \7 ^! S6 C1 x9 v3 B2 c5 w) l
- * @{
) w$ t) b& d; b+ | f - */
8 J8 X; P; B0 w& o - #define ADC_FLAG_AWD ((uint8_t)0x01)
. [3 I/ c/ q9 j: C5 w* Q0 R - #define ADC_FLAG_EOC ((uint8_t)0x02)
3 F% S1 B8 a: J L n - #define ADC_FLAG_JEOC ((uint8_t)0x04)
2 @# `- ~, s) P" U: s O+ ~( t" x - #define ADC_FLAG_JSTRT ((uint8_t)0x08)
9 U w& w) K6 s4 \' L2 V - #define ADC_FLAG_STRT ((uint8_t)0x10)
V' Y" X. y) b8 i# F8 B - #define ADC_FLAG_OVR ((uint8_t)0x20) $ F0 i+ D( @* ?* R& Z+ o% f: t
- . E9 D5 o0 j. \! A. u
- #define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint8_t)0xC0) == 0x00) && ((FLAG) != 0x00))
7 ^9 X* a: `2 }' C: R- K - #define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || \/ F# J4 x) z2 q5 E% i+ s
- ((FLAG) == ADC_FLAG_EOC) || \
6 j' I- ~& w1 q: b' _ - ((FLAG) == ADC_FLAG_JEOC) || \
9 ]% q6 G# q& ~ - ((FLAG)== ADC_FLAG_JSTRT) || \
/ f# p7 A9 d% H, P2 ` - ((FLAG) == ADC_FLAG_STRT) || \$ S7 k8 \# M, A0 {2 ]6 b, _
- ((FLAG)== ADC_FLAG_OVR))
7 _- r9 f; _: i7 C8 p5 v - /**
' Q1 [7 r' H2 X3 [. e" t* R - * @}
- \$ m! Q2 y& M. `, f - */ # x9 E% ]+ a R) i. w
2 t4 Y: R7 _' Q" l4 h9 }9 o. Z
; f! z: d( H# n. G5 {/ e* [: }( |7 P- /** @defgroup ADC_thresholds
5 Q1 i6 K3 ~' L& Z - * @{; }+ w4 r% z% G. I8 V: n
- */ C' W L _* S5 Z
- #define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) G: M" P' U' ?, q' G8 P7 x% F7 g
- /**
; \- e/ I; k- c - * @}8 d3 }4 u" K3 ~4 j: K0 \6 F
- */ ( I3 x" Z; N7 T0 r A! t: W) n8 M
3 C& z: b* I4 W" g
$ ]8 E8 N* `$ [) G8 Y! W/ I- /** @defgroup ADC_injected_offset @( L# H; d3 v3 [( a
- * @{4 X- h s+ D8 \& b! Z
- */ : S3 _- A, m+ ?
- #define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF)
" h9 e& E( {! I J4 P - /**( u; l; x1 }" D& _
- * @}
! S$ Q/ D9 q" V - */
+ M5 H2 O' r2 h0 H' P% K
5 W; ~! z0 b+ j2 ~7 K- * g1 p4 Z/ e* A$ G) U
- /** @defgroup ADC_injected_length
9 C. h! b0 m. |) s* @1 c8 ] - * @{9 M& q- D, F! \0 d0 F/ D) U7 D
- */
* D U+ M9 A! F& w3 |0 N - #define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4))% X* m- N. R2 W' B8 `* o" b
- /**
' t2 N" v, u, A8 _5 v) b/ @ - * @}
3 W9 D; Z- W4 N! t2 w o - */
7 h4 O4 D9 r f5 S7 K5 T( Q7 B9 h
- X" c A1 Z8 F" @* S
1 v: x2 B! Z$ P1 {. b6 B% r5 `' r- /** @defgroup ADC_injected_rank - `. P: G/ N5 D$ l4 O
- * @{
4 e$ l8 x9 b$ O - */
( i0 m( g! x: J% D - #define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4))
' R2 N% G) R6 p' w0 G6 ^) J3 s - /** D; D) u3 A) w. s$ `
- * @}' b6 l" k( w4 V% |0 _: u: H3 i' n4 K
- */
, q6 V5 H4 U- ^& k% o4 f - " T3 [1 q; [, {8 G0 D
- $ d: s& b6 m' u) o- K1 ]
- /** @defgroup ADC_regular_length
: C/ E% o- e- ~6 c5 L6 P - * @{
& b: q- y1 Z+ {' x- k1 S - */
" y, Y7 b+ ~4 v; T - #define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10))
3 H. c0 o. x2 y- s T - /**+ @4 [$ P" L) }9 Z2 I
- * @}/ X. D. a9 X* q$ p
- */ # s9 x0 ]1 T3 f
p4 P6 C+ G9 Q5 f9 n6 O- - |9 z* h4 q H$ G
- /** @defgroup ADC_regular_rank
8 @8 H u2 u3 Z! p6 T+ m - * @{% I. R! o& ^! N( _ k5 }
- */ % @. |6 |' s' ?. k# d0 N8 L: \
- #define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10))
- W( ^5 C" r: X p2 L U1 h' Z - /**4 k4 d' N7 l, \4 }
- * @}) ~. X" J; W; o a& T! S
- */ ; `* ?$ K3 m( X& H, i
' E. D: y; p* N _6 l# w7 h; b
0 U& L. N2 B: I2 y& A- /** @defgroup ADC_regular_discontinuous_mode_number + [! h- u' b/ s/ [5 I e
- * @{0 d" U2 h( x5 }% o4 M0 i
- */ / U" I: P7 ~# i& G+ @2 V: _9 v
- #define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8))
& F: @3 W0 Q; ~! V1 h; U - /**7 U' T L. h% i( K0 p Q
- * @}
- j; ?9 _8 j: L R" C - */
复制代码
. W* L _+ F9 p% J: }* l" E03. 相关函数# p0 e6 l+ w+ ^0 Z9 k; Z# J& \9 I
- /* Function used to set the ADC configuration to the default reset state *****/
6 c* H7 F3 L$ s5 b9 J- g' G& z - void ADC_DeInit(void);
, ]7 P4 V4 a( L" p9 p3 K2 c' Y
- y+ P, R" h+ G0 p- /* Initialization and Configuration functions *********************************/
0 H6 }2 w) \' Y; S - void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
5 k% q7 D5 b/ T, h9 S - void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
% s9 {+ ] F; S4 e - void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);
4 x: ^6 q. U1 Q1 _; G& ^. o - void ADC_CommonStructInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct);3 ?9 g y% e2 P! O r7 v
- void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);' {- V$ |; o6 i& j/ ?" a/ \- F
" Q3 f! ~# { P4 H- /* Analog Watchdog configuration functions ************************************/ l1 x+ Q- k4 @6 K. K9 D
- void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);, o4 K1 L- q6 M, H
- void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold);
. J; Q- S( C% h* P6 U - void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
: ]! A$ I, ?2 Y0 N
6 M- S0 ~, Y1 f' _4 h- /* Temperature Sensor, Vrefint and VBAT management functions ******************/3 X0 v/ S' N; E5 _8 k- J8 {$ g. ]
- void ADC_TempSensorVrefintCmd(FunctionalState NewState);
3 h, i# v: D* j+ M - void ADC_VBATCmd(FunctionalState NewState);
- Z$ c! \- C- N. r4 Z5 R
8 n7 E! Q% h% p* v- /* Regular Channels Configuration functions ***********************************/
" H* u v( Y2 t$ t/ U. v+ e - void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);" O/ F: ]! A- k$ c
- void ADC_SoftwareStartConv(ADC_TypeDef* ADCx);
( v: y: Y$ q. E1 w7 K6 x1 \ - FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);
o. l1 v5 r% p+ p' j: ]" T - void ADC_EOCOnEachRegularChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
' e2 [6 U& |3 h; g$ I' W - void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);- z, |1 Q( n( Z2 G' l2 p0 G
- void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);1 N: T% I+ ~' f1 j
- void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);' H; r" _/ O% _8 O/ r1 w
- uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);+ |5 y) n8 m, j/ S" D# N0 |( z* U
- uint32_t ADC_GetMultiModeConversionValue(void);7 e- y' R2 ]2 Z% S. K8 f- ^
& n& B* i. r( e( f! Y4 r- /* Regular Channels DMA Configuration functions *******************************/
2 D, }/ `$ T4 f/ _8 T - void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
% Y/ S0 O T0 n6 W) N$ _$ x - void ADC_DMARequestAfterLastTransferCmd(ADC_TypeDef* ADCx, FunctionalState NewState);3 }5 u3 M( E2 Q& S8 S+ x
- void ADC_MultiModeDMARequestAfterLastTransferCmd(FunctionalState NewState);. A# M3 g0 m/ e
* D# W# e: u, v4 Y- /* Injected channels Configuration functions **********************************/$ @2 N/ M) n- N/ s9 G$ _% j8 e* c
- void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
+ Y( e8 H1 u# X G6 @$ j- Y - void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); W3 F( n. `# r6 ]7 ?
- void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
# P; J, f) \1 S4 e - void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);( X. {( W" I `9 c3 b
- void ADC_ExternalTrigInjectedConvEdgeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConvEdge);0 N8 f9 z" G, E4 l) R: a( N k
- void ADC_SoftwareStartInjectedConv(ADC_TypeDef* ADCx);
$ S1 \" K! D- G5 c! Z8 i4 |6 h - FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);
% l3 n9 x, N( z. R0 W- }/ _" H - void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);( m! A2 S9 K+ Y' _2 v( n
- void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);% ^2 j' [1 J) A
- uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);5 R$ _+ C, Y6 D" C' H
- ' ~+ |5 f+ ~3 ]# e T. n
- /* Interrupts and flags management functions **********************************/; F. f$ V y2 q
- void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);8 b2 G' `: M* E/ f- }
- FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
0 P# C" `- {9 ^/ f - void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);8 a; \* \; H3 x5 b3 R% o6 ]2 L
- ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
; t0 F3 O, U+ g, p - void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
复制代码 : C9 y0 Q( |2 V2 L+ ^5 g
04. 结构体封装/ [; ^2 H- T5 A: F; b/ ~
- /**
# z( [6 a( L) F* A5 O' f - * @brief Analog to Digital Converter ! [% X* y/ i! m
- */
$ \* L0 y* l( v5 ~ - / R, O' n8 k! z1 w( S" A. ]
- typedef struct
) t; E8 w9 D% j0 j; {' h/ v- z - {* a4 u$ j9 \: W4 c. p, H8 ~
- __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */
" F9 H1 ^# `8 x1 `. k - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ 3 [$ X) F7 q4 H9 [8 R2 _
- __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */
" ]6 u9 } |0 C7 W( t4 p0 f - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */
# E. B/ Q& E% m; B$ `( d& b - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */: d# p/ w; Y4 ^7 r6 B! K: Q
- __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */9 c6 |! U6 N r# v8 l1 `
- __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */
4 @& r7 t, a$ z: G9 g0 \( B - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */6 ^; b, [( y% W) M+ I+ o
- __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 *// i2 M1 r) I" o( @8 g
- __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */: M5 c7 a) ~! Y8 _+ y5 j1 e
- __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */
0 h0 ^0 f& b) F7 n# w - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */; r1 M) |9 G% x- O8 W9 {, s) K
- __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */
5 A P, U7 c4 K- h+ L( ^: V - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */3 G1 G6 m* c- l! g1 h `
- __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38 */( Z# U: n9 |; R0 K
- __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */4 q" i$ a" L; J* x L) i
- __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */
7 e3 B9 v8 Z8 G% p: I$ c - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */
" S. S% l( v' f* c4 v0 w7 ^- z - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */
4 B8 L# T1 O8 J4 J: i - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C *// F7 ^5 W, K+ _6 ~( ? f
- } ADC_TypeDef;9 d$ ~6 O0 W# M# Z& o+ U
8 `$ f. W0 P. @: t; i# Y: b! F
复制代码 H4 n- F, l; o
|