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