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