ADC时钟6 n, K- F& [6 e
# ?' q0 A) E% g) J
8 H5 `7 o& j0 {8 f
7 c) W) }3 ]0 x. h( P如果只用规则通道而不用注入通道,则ADC时钟与AHB没有约束关系。
+ y4 j1 z- T. h4 f- S5 o; l" o7 \$ u" e c: S( G' d$ b s
上图可以看到,ADC的时钟输入有两个时钟源:adc_hclk 和 adc_ker_ck 。3 e3 v [$ {9 g2 p( U
adc_hclk 被认为是 同步时钟。
6 e( D' v+ F" H" g+ }) f3 n5 _adc_ker_ck 被认为是 异步时钟,他也有两个输入时钟,可以通过 RCC_CCIPR 寄存器配置选择使用 SYSCLK 还是 PCLK 。% j$ @7 h/ v' s: S! b9 ~
9 [4 P( V* {7 U% N1. ADC的启动
+ `+ B2 C# H! A6 ?) s0 V! v# T1.1 退出深度掉电模式和ADC稳压器的开启
4 L1 \ L/ z" ]8 {使用ADC的第一步就是退出“深度掉电模式”,即ADC->CR中的DEEPPWD = 0;1 [. d: h# {# z" X) r4 O5 G
然后使能稳压器,即ADC->CR中的ADVREGEN = 1;8 a- [% Q- K& H8 u
等待稳压器启动,具体启动时间参见数据手册。(G474数据手册写的是20us )数据手册第146页 DM00431551_ENV3
1 C' x8 s8 Q* q" a5 M7 q1 T- m$ ]2 ^, z& V. i
0 E' w& ^8 x0 N) C( J1 }# Q, b
, j% J" ]( P# V3 A- ADC1->CR &= ~ADC_CR_DEEPPWD;//退出掉电模式
5 A! {' D9 ?1 V1 o$ s5 E* Y9 h - ADC1->CR |= ADC_CR_ADVREGEN;//使能稳压器
+ q% O# z+ A# B% Q- Z5 F - for (i = 0; i < 0xffff; i++)//延时等待稳压器稳定+ O& q4 V% b9 T$ b( Z5 D
- {7 n/ J: ?( F( Q9 ?, o- W
- /* code */# }, y( ?, ?# N& X. Z+ U
- }
复制代码 ' o. T) }5 c) }2 T, B' f; q
1.2 选择输入模式# Y4 v. u9 k5 q4 w- U0 B" S
ADC->DIFSEL 模式选择寄存器 中选择 差分输入或者单端输入模式。% G- k b6 ~* \' s; |5 ]: F
2 C5 @# }8 b( d- q v2 E
- ADC1->DIFSEL = (ADC1->DIFSEL & 0xfff80000)//模式选择寄存器
5 O/ V% P; U& y' p0 z - // |ADC_DIFSEL_DIFSEL_18 //bit18:【0|单端输入模式】【1|差分输入模式】
! I; j0 a2 z2 g. C5 |- S - // |ADC_DIFSEL_DIFSEL_172 |2 ~$ e. V( v: `+ ]3 D+ K: M
- // |ADC_DIFSEL_DIFSEL_16
* E9 c: ]1 J; w% S; e2 L - // |ADC_DIFSEL_DIFSEL_15
& h$ y/ o% [ Q - // |ADC_DIFSEL_DIFSEL_14
; W' s3 z7 R! T/ u- r - // |ADC_DIFSEL_DIFSEL_13$ n0 H$ e$ o- ]! m9 |6 c3 ^# x6 D+ g
- // |ADC_DIFSEL_DIFSEL_12* u$ M0 a E: l& g3 D# R
- // |ADC_DIFSEL_DIFSEL_119 `3 a; O; p: V9 L5 |7 `7 S
- // |ADC_DIFSEL_DIFSEL_10
# {# z: N! D0 |4 G! i+ b) K - // |ADC_DIFSEL_DIFSEL_9
F1 [& O# w9 Z: d5 c% l' @0 d - // |ADC_DIFSEL_DIFSEL_8
8 n: z: x- T; ^2 |6 d% p5 \/ N - // |ADC_DIFSEL_DIFSEL_7/ C! x& n/ P9 T9 ~: }4 P
- // |ADC_DIFSEL_DIFSEL_68 ^) |+ U: O7 P; F' G' T. \3 c6 ^
- // |ADC_DIFSEL_DIFSEL_53 s) z) s" j! O% q+ z( V
- // |ADC_DIFSEL_DIFSEL_42 r( ~ n& ]8 B
- // |ADC_DIFSEL_DIFSEL_3
$ u( z$ Z! H+ C) O% N/ }# H - // |ADC_DIFSEL_DIFSEL_2, y& q8 e \3 `$ I) }2 x# r
- // |ADC_DIFSEL_DIFSEL_1& v) g- M: N! E0 R% `' u, z! F0 k
- // |ADC_DIFSEL_DIFSEL_0. v/ X% k7 ]1 _
- ;
4 h) R1 W& L8 e% s5 m -
复制代码
1 K/ C0 m8 P' v1.3 校准# W5 _9 ~8 O ]8 K. X
校准分为单端校准和差分校准5 @3 Y1 h p0 c6 S& ^1 ^3 M* }: u" {
k" z! U% F0 F( i* Z" W
! E+ k& F; E' W, H8 ?
1 e& ^* R7 u: v3 |1.确定DEEPPWD=0(退出深度掉电模式),ADVREGEN=1(稳压器开启),并且已经等待了稳压器的启动时间。3 v8 S+ z v( h4 M- p+ v4 r1 S
2.确定ADEN=0。
1 `, h8 M+ ^- V2 N6 A& ~( q: T3.配置ADC->CR寄存器中的ADCALDIF标志位,选择输入模式(ADCALDIF=0 单端输入 / ADCALDIF=1 差分输入)。9 \2 d R, A# R& i! n( v2 G
4.ADC->CR寄存器的ADCAL标志位置位,即开启校准(ADCALDIF配置为什么模式就校准什么模式)。
) O7 c& ], T2 F2 Y! n [9 q" r5.等待ADC->CR寄存器的ADCAL硬件清除,即ADCAL=0,代表校准结束。, R7 ?0 H2 ~7 i, R0 l
6.在ADC->CALFACT寄存器中读取校准系数。
+ |0 x% P# r/ U! C- E( @3 m; j下面以单端输入校准为例:$ m) Z f! i* N6 N9 d
- j: B0 B2 ?& T- ADC1->CR &= ~ADC_CR_ADCALDIF;//单端输入模式 步骤2
8 W& d% ]& {* K" T" h - ADC1->CR &= ~ADC_CR_ADEN; //禁止ADC 步骤3, B b0 G% f4 _
- ADC1->CR |= ADC_CR_ADCAL; //校准ADC 步骤4
$ S: B8 g6 y3 L - i = 0xffff;
4 e0 z% [1 i3 i* O3 o5 m1 \ - while((ADC1->CR & ADC_CR_ADCAL) && (i--));//等待校准结束。步骤5
" Q% j2 K5 h, z - if(i == 0)//超时判断
- R: ~) T% Z8 u7 K8 |9 D - {
( m8 Z4 Z! F; y. P3 M - return FAILED;5 ]- {5 K- O, U+ y& J6 U& s8 y
- }
复制代码
. w, T/ I( c, J如果通道中又有差分输入还有单端输入,则需要将两个系数都进行校准。* z1 A. ~1 M I* `
1 f2 x/ X0 h. H' L1.4 转换队列设置
W. c: ?3 N4 S, n, I" O9 n5 Y1.5 采样时间设置' _6 L8 D0 J5 [( P0 C! k6 G' F2 P
' ?: M/ _4 A* d/ E8 q, U' T
3 e! K1 G; @- q* ^* r! t
1 ^1 W+ e# r' m
每个通道都可以用不同的采样时间进行采样,采样时间由ADC->SMPR1寄存器中的SMP位进行编程。因此,可以在以下采样时间值中进行选择:
2 H% M3 l3 Y2 u• SMP = 000: 2.5 ADC clock cycles
, F f" a" a8 l& ^/ k1 r, n8 L• SMP = 001: 6.5 ADC clock cycles- c: m. G& {8 G, D
• SMP = 010: 12.5 ADC clock cycles" m% l# R# _1 a) p5 y1 N
• SMP = 011: 24.5 ADC clock cycles2 i* J K: @+ U, z# ^( D1 @
• SMP = 100: 47.5 ADC clock cycles
! {! a+ {9 X" V8 q/ V T• SMP = 101: 92.5 ADC clock cycles, t# k8 b" }" H$ ?% ]
• SMP = 110: 247.5 ADC clock cycles/ ]9 q/ w5 D: @$ t6 K" r5 _
• SMP = 111: 640.5 ADC clock cycles. P1 F/ Z. o. q
总转换时间计算如下:TCONV = SMP + 12.5 ADC时钟周期(12-bit)
# ~& s; l# L; n6 q例如:
0 n4 a1 L5 Q( U, g. cFadc_ker_ck = 30MHz,并且SMP=0 即2.5 ADC时钟周期
9 ^. u) R& c- d8 hTCONV = (2.5 + 12.5)个 ADC 时钟周期,即 15 / 30 us = 500ns- v& C9 {- u9 w
采样结束后,ADC_ISR_EOSMP置位,代表采样结束(仅在规则转换中有效)
1 b8 u A6 n" R2 m& I* H( z9 }4 \- I ]( y0 o1 Q) Q
器与分辨率的转换时间如下表:+ |( U) M% t0 t( [8 C
; y0 g( m/ ` ^: A
9 z: Z: w% j# w' h" s
4 ]' c+ M5 `' x" S" u2 Y* Z9 b
注意:
: r# p0 x% H% [, S* m
' @8 }' c3 p) p- [) j# R7 }. K' y
; ~. ~0 Q. B/ w3 a
6 m5 V" g; ?6 K8 j" t( X' o
每个通道的采样时间必须遵循数据手册的最小采样时间。(数据手册第146页 DM00431551_ENV3)( ]1 p( } D$ W3 u" z, i6 C
. n& Z: J* z! d7 g! m9 l
: y( I: D& ?* Q, B: o# t
! f7 P6 ~2 S8 L6 `2 M
SMPPLUS control bit
6 n: ` W+ s1 d1 T& b( F在ADC->SMPR1寄存器中有这么个标志位,其作用是为了方便 交错模式 对称。1 x( z @4 m' l- ~
9 R2 j* i z( Y$ O: R
2 ADC采样模式9 x: L: s h( e
2.1 Bulb sampling mode(灯泡模式?)
3 l& Y4 M; T1 C' j启动该采样模式,则在第二个ADC空闲时间进行采样,如下图
, ^: m ` w- ?# d, x5 V$ @/ _0 V- O& b1 i2 O% T/ O
& l8 A; r$ U0 y, n+ e
1 D# z) k+ i6 @. R! M
该采样方式有最大采样时间限制,参考数据手册。
6 _" s* e6 q& W1 {: i( J, k该采样方式不适用连续采样和注入采样。$ @; ^. l" f. }! }3 z: X+ e- W% U
如果该模式启动(ADC->CFGR2中的BULB=1),则不准置位ADC->CFGR2中的SMPTRIG。
( `! E1 V2 P g1 @. j; b$ v3 G2.2 Sampling time control trigger mode(采样时间控制触发模式)
. y* I9 W$ S/ ~" n0 m4 g当SMPTRIG置位时(在ADC->CFGR2寄存器中),通过SMPx位(在ADC->SMPRx寄存器中)编程的采样时间是无效的。采样时间由触发信号边缘控制。
3 Y- h6 f+ ^& S3 v' q0 w/ s; w+ m0 W$ n9 N
该模式分为软件控制和硬件控制:, j9 n+ ?3 D7 m9 H
硬件触发- k7 c5 d! I/ z8 ~- M
当选择硬件触发器时,触发信号的每个上升沿开始采样周期。下降沿结束采样周期并开始转换。EXTEN(外部触发极性选择,在ADC->CFGR寄存器中)必须设置为01(上升沿有效)。 Hardware triggers with not defined rising and falling edges (one pulse event) cannot be used in Bulb mode.
- Z+ I% s9 @( m+ G. |软件触发+ y8 Z+ o: @# w
当选择软件触发器时,软件触发器不是ADC->CR中的ADSTART位,而是ADC->CFGR2寄存器中的SWTRIG位。置位SWTRIG位开始采样周期,清除SWTRIG位结束采样周期同时开始转换。EXTEN(外部触发极性选择,在ADC->CFGR寄存器中)必须设置为00(禁止外部触发)。
$ ?# o- D* C( r( u+ C# X
1 D/ F* s3 l, e
; V7 A7 p' s3 n3. 转换模式
4 [7 c0 i% i$ a% Q& [( r3.1 单次转换模式(CONT=0)8 q, ?% ~3 {* x7 x/ I6 W, Q. \
当ADC_CFGR_CONT=0,代表配置为单次转换模式。9 v0 k7 n! o. B2 p
规则模式:置位ADSTART(ADC->CR寄存器)或者外部触发
) l+ w# e& ^. b" v# I* h L注入模式:置位JADSTART(ADC->CR寄存器)或者外部触发- s/ v* n9 B! d, R/ s
" N! P& Y2 A) y+ m8 |7 u在规则序列中,每次转换完成后
" P2 w- q/ B; ^- P( o9 f: Y' r转换后的数据存储到16位ADC_DR寄存器
% L9 `+ C5 {5 y置位ADC_ISR_EOC(结束常规转换)标志(读取或者写1 清零)
" Q6 x) g3 J- P; M; A如果设置了ADC_IER_EOCIE位,就会产生一个中断* H' z3 b6 S% [0 o# m9 \3 P |
4 e) ~+ l Z( D- U+ Q在注入序列中,每次转换完成后
0 h, O' e3 _% ~; K- d" k2 P. D+ N3 D转换后的数据存储到16位ADC_JDRy寄存器
% @! B; p4 r/ `0 F3 z# r; }- d3 f置位ADC_ISR_JEOC(结束常规转换)标志(读取或者写1 清零)
( V' ]9 s# D6 q( h* h5 v0 i如果设置了ADC_IER_JEOCIE位,就会产生一个中断
9 q3 i; g& `" B( |, K+ A+ c: |2 @! q! c6 C: f f1 Q
在规则序列完成后9 n' }/ a/ A9 Q, K# Z0 X. [4 G
ADC_ISR_EOSEOS标志位置位(写1清零)
8 V! Y% i5 Z0 k$ H# I9 u* q( m如果ADC_IER_EOSIE置位,则会产生一个中断
$ q s& R% d. J) U8 ]1 ?" I! M& G* j8 t; U
在注入序列完成后8 r+ @* t, H% G
ADC_ISR_JEOS标志位置位(写1清零)
* `" L9 Z( E# n; H, g7 [如果ADC_IER_JEOSIE置位,则会产生一个中断+ } _9 D+ m, c& q; u; F
; s9 l, E2 [9 p1 j提示:如果想转换单个通道请将 L(队列转换长度,在ADC1->SQR1寄存器中)设置为0(0代表转换1次也就是1个通道)。
: i3 g% o( w( e2 I* D4 r" R$ T( c" P' ~% g4 N# J
3.2 连续转换模式(CONT=1)# F3 b( J7 }: r! N( N
当ADC_CFGR_CONT=1,代表配置为连续转换模式。
4 i! t: m& Q/ t2 i9 y. s2 p. b! G: w" w
只有规则通道有连续转换模式。
0 n- d6 w5 f) E) K
5 }0 o9 y( Y8 R7 t7 Q在规则序列中,每次转换完成后) Z x5 S$ ^) k8 `
转换后的数据存储到16位ADC_DR寄存器& w n* s7 Y' n
置位ADC_ISR_EOC(结束常规转换)标志(读取或者写1 清零)$ `4 D n! Y$ q( A2 t% R
如果设置了ADC_IER_EOCIE位,就会产生一个中断3 b. s4 ^6 E1 F; W! p1 d
! ?4 @, i3 j2 _3 X6 Q; E) @
在规则序列完成后
" q8 z. E5 m/ G4 p& V+ K# ^ADC_ISR_EOSEOS标志位置位(写1清零)
7 d& g, }8 P) T% t* o/ o7 l如果ADC_IER_EOSIE置位,则会产生一个中断4 q) n0 s3 |# H9 h. e1 y
3 A! w. L/ R/ o/ @然后,一个新的序列立即重启,ADC连续重复转换序列。; X* J# X& N# @4 E0 ?
禁止同时置位 ADC_CFGR_DISCEN 和 ADC_CFGR_CONT。) F: r( q; e Y4 L' K* B
注入通道要想连续转换,需要设置自动注入。 w+ B( D8 g% |/ v
m. k6 }# W6 x1 y连续转换模式下,ADSTART不会被硬件清除。
7 ~6 O9 d0 B9 n( g: t2 v5 c不能同时使能ADC_CFGR_DISCEN和ADC_CFGR_CONT。
) i+ |' N. p a; F" y( k( z) F% e5 ~7 H b7 S
3.3 不连续模式" V- O4 x8 u0 d v I6 y& x
当ADC_CFGR_DISCEN=1,开启不连续模式,每次触发都只转换ADC_CFGR_DISCNUM个通道数量,每次转换都会置位EOC标志位,直到转换完ADC->SQR里面的通道(总个数为ADC->SQR1中的L),最后置位EOS标志位。
* W4 D7 i, U' ^" K8 b6 \$ l9 L, _% ]' U
当ADC_CFGR_DISCEN=0,关闭不连续模式,一次触发转换ADC_SQR1_L个通道,每次转换都会置位EOC标志位,最后置位EOS标志位。2 q% `" K$ t$ N, A
; u. ]/ ]" j- E, C3 I不能同时使能ADC_CFGR_DISCEN和ADC_CFGR_CONT。
1 M# m5 L) D6 [
- J2 q: q' e* B: V0 V. |4. 触发模式
- {3 k) t* n# B5 cADSTART/ j( U) G7 N/ N4 p# p
当EXTEN[1:0] == 0,ADSTART=1立即触发转换% H$ }5 ~3 S7 O: B9 N
当EXTEN[1:0] != 0,ADSTART=1得等待下个有效硬件触发才进行转换% l- X* Z- q6 i# z2 S
0 n O3 @) T/ O8 i3 c+ q
JADSTART
6 n5 B/ j/ ~2 W/ a6 g. K2 l当JEXTEN[1:0] == 0,JADSTART=1立即触发转换
9 y1 W& m! d# o6 h( d" l2 v+ t当JEXTEN[1:0] != 0,JADSTART=1得等待下个有效硬件触发才进行转换
3 t( r7 s7 {- I% E2 \/ }1 R' W" L3 E! i+ J" c- P. N8 ~: j) G
外部触发
7 A2 r7 d, N) N当注入队列使能(ADC_CFGR_JQDIS=0),软件不能触发注入通道。
, V, Z# l" X3 g+ @: n转换过程中,触发会被忽略。, y6 b- c: g0 V
7 K- B0 w b6 m, x触发极性2 H$ K1 m6 V( n: @
- ?, @9 h# y& W3 A# D; r0 \7 f
1 o# Z/ ?! \$ O5 e. G" q3 Z
9 [% D- c; Z0 f
! V* Z v" r0 H- [% z' J
$ U2 i! _1 \1 s0 k触发源
K% |5 K2 P, Y. S4 |) W! J1 Y- s8 A0 J$ V7 [* Q. ~
$ n; B1 `! @5 o5 {5 m具体触发源见手册的第627页(DM00355726_ENV4)
]4 v2 E; l, V
# K' [- K5 @$ e( c& [5. 使用方法; O2 \1 `& P p5 r
5.1 注入模式
6 U- C9 {& ?7 O% D) t3 C$ ~5.1.1 描述
1 s/ l& z( |" M* e1 f注入模式 的优点就是相比 规则转换模式,队列模式 有更好的灵活性,它可以在ADC使能运行的情况下,修改 触发源 和 采样队列。对于经常变换 通道采样 或者 触发源 的工况下,这种模式更适合应用。
* g; i7 [0 c/ p- L( {$ B+ U, \3 f( O/ \' P3 k; `' _
5.1.1 触发注入模式
, t+ E3 J6 r: j在选择触发注入模式时,JAUTO 控制位(自动注入) 必须清除
) u4 F( w3 ]# d1.通过外部触发或通过设置 ADC_CR 寄存器中的 ADSTART 位来启动一组常规通道的转换
- n( m$ ^4 Q- H- R) d: Z# k2.如果发生外部注入触发,或者在常规通道组转换期间设置了 ADC_CR 寄存器中的 JADSTART 位,则当前执行的规则转换复位,然后启动注入转换序列(所有注入通道转换一次)
' W( M7 J! _# S. i3.然后,恢复上次中断的常规转换# | S- e: V, i V
4.如果在注入转换期间发生常规事件,则注入转换不会中断,而是在注入序列结束时执行常规序列
$ e5 X) [, @8 { y: n( r; s配置 触发注入 模式的方法如下:* a$ x% H! I; i1 t2 A7 c
1.退出 睡眠模式(清除ADC_CR寄存器中的位DEEPPWD)
5 W, |; X% q9 P* v; c) _ C- A2.使能 ADC电压调节器(置位ADC_CR寄存器中的位ADVREGEN),延时等待电压调节器稳定* ]7 o8 Q5 D5 X2 u3 _% l! C' F/ d
3.配置校准的模式(差分 和 单端 ,ADC_CR寄存器中的位ADCALDIF)
) g2 j6 i! _1 W% t4.使能校准(ADC_CR寄存器中的位ADCAL),等待ADCAL清除,代表校准完毕
4 N5 H9 v; f; W* r; r. N3 a, @如果需要存储校准值可以读取CALFACT寄存器获取校准值,下次上电直接写入该寄存器- Y* k' c/ S! ]
5.配置 ADC12_CCR 寄存器,选择单独工作还是同步工作、时钟配置、传感器使能采样延时等参数
$ q1 v; N: N, V4 D6.配置ADC_CFGR寄存器,清除位JQDIS,允许注入模式,DMA、采样模式等参数2 \$ L3 ]2 v" P
7.配置ADC_SMPR寄存器,来确定采样时间
: j# ^4 U6 n6 {/ e8 p8.配置ADC_IER寄存器,使能需要的中断
: B7 R% L& M- y. h6 v) d9.使能ADC(ADC_CR寄存器中的位ADEN),等待ADC就绪(等待ADC_ISR中的位** ADRDY**置位)
/ H9 n% c* S3 o w7 p10.允许注入触发(ADC_CR寄存器中的位JADSTART) k9 l7 T# a- E! M% V
可以在任意处配置ADC_JSQR寄存器,选择触发源和采样序列。
3 b( M+ I }; V/ J9 h3 p: }! x; K- O. C: w2 N
下面是
" J! v; W+ t2 G/ ^/ }' TADC12同步注入模式
4 Z/ [$ T) h$ V' {; q% mADC1、2 触发模式,每次触发序列为2次转换
: f, ?; K/ x2 i触发源为 TIM1的TIGRO2
8 L1 D+ l+ S% Q- `+ R
9 H; Q7 E+ y$ ~/ o4 F转换序列为
7 D, S1 ^' t0 O+ hADC1 第一次转换通道3 第二次转换同道4
2 k# K4 J' R6 g) w& T0 NADC2 第一次转换通道2 第二次转换同道155 F. ] X: c, U/ R; N8 M
- void ADC1_2_Function_Init(void)
# E# I# h! D/ J - {: \5 n$ h/ Y4 \% }. A
- volatile uint32_t j; // 避免延时函数被编译器优化6 ^, s- Z) B6 k" P$ C, g
1 k+ e! S1 I' l8 @! a, \1 a+ X# j- //============================================基本初始化开始2 W9 }) W. T2 F- m* b N
- // 步骤1 退出 睡眠模式
$ N# G6 {" m9 f" A5 r. E) \ - ADC1->CR &= ~ADC_CR_DEEPPWD; //退出掉电模式 ; z0 p2 A' M$ z/ V1 i0 Z
- ADC2->CR &= ~ADC_CR_DEEPPWD; //退出掉电模式1 ^. ]2 |5 R6 k4 _7 `" H
' T- \! v2 o0 e6 u. X* j2 b0 k- ( s! I" s1 \. j# k) E3 P
- // 步骤2 使能 ADC电压调节器' u: r( P# F# l! s) p6 k' z
- ADC1->CR |= ADC_CR_ADVREGEN;) v& `" m2 \$ f. W
- ADC2->CR |= ADC_CR_ADVREGEN;
3 E( C, Z- y2 C K/ A - for(j=0;j<430000;j++); //延时,等待voltage regulator启动4 |6 W% I: K. u8 J. r& ^( g
- ( m/ l0 P) S% O/ X" ?& O
9 {/ z7 n# V. F! \% d- // 步骤3 配置校准的模式5 ^4 }3 K7 @9 n+ F- K% Q9 U
- ADC1->CR &= ~ADC_CR_ADCALDIF;//【0|单端输入】【1|差分输入】
7 F0 |+ H1 m2 c - ADC2->CR &= ~ADC_CR_ADCALDIF;//当前为单端校准: G( m6 A) I! E l* l: a
- - p! t1 S& E/ ~. q4 g+ b0 y4 r
- $ W, \4 s) l' o1 Y
- // 步骤4 使能校准* }+ E; k2 n1 N7 g' c+ N2 G
- ADC1->CR |= ADC_CR_ADCAL;! L8 |6 b0 x; N* [; U1 N% N
- ADC2->CR |= ADC_CR_ADCAL;
' J# F: ]/ A/ E( l& |- `: |7 G/ q - //等待ADC校准结束
4 s& q* x! c) H: s! f7 s. g2 j: m - while((ADC1->CR & ADC_CR_ADCAL) != 0);
K6 D: X9 W* C$ f! Z - while((ADC2->CR & ADC_CR_ADCAL) != 0);
9 ^& F# k5 i6 h7 t. H: O8 m! M - //============================================基本初始化结束
% Z/ b0 ]8 v7 X% Z4 ^0 w( M* b
! L0 u' _3 n$ Z m! ^, X" B2 g
" Y6 z# O# J3 [& o- // 步骤5 配置 ADC12_CCR 寄存器2 j/ ]7 C. V, o1 \
- ADC12_COMMON->CCR = 0x00000000
T) A% U( l1 C3 X; ^. i& v% U - // |ADC_CCR_VBATSEL/ a4 s& u: l+ ~
- // |ADC_CCR_VSENSESEL1 Y$ L8 l7 L* \0 `% \; ]
- // |ADC_CCR_VREFEN& ]; _, ~) N' V) w
- |(0 << ADC_CCR_PRESC_Pos) // 时钟配置(详细见手册 DM00355726_ENV4手册718页)2 V5 ~- m/ h5 ~: C. ^3 Q+ ~
- |(3 << ADC_CCR_CKMODE_Pos) // ADC 时钟配置(详细见手册 DM00355726_ENV4手册719页)8 f+ i+ x+ i$ P' Y/ ]7 K% J; I# {0 h
- |(0 << ADC_CCR_MDMA_Pos) // DMA 数据分辨率配置
) ]6 q6 M; O9 k. J. e. o - // |ADC_CCR_DMACFG // DMA 循环模式配置1 a+ x U% G) b9 ~
- |(10 << ADC_CCR_DELAY_Pos) // 延时采样时间配置(详细见手册 DM00355726_ENV4手册720页)
/ V* {: B+ [$ \4 W - |(5 << ADC_CCR_DUAL_Pos) // 选择 仅同步注入模式(详细见手册 DM00355726_ENV4手册720页)3 ~" K' _" E, v3 m7 Y
- ;( |% w0 X: _, s u) a; ? e
: U; K6 g7 Y3 p0 J- 8 |1 D" `3 W& g% M; m0 p& \9 M
- // 步骤6 配置ADC_CFGR寄存器7 X; [% Q+ _1 o) h
- ADC1->CFGR = 0x00000000
3 T! K/ O( e, |! q5 ] - // |ADC_CFGR_JQDIS // 禁止注入(默认为1) 【0|允许注入】【1|禁止注入】' |" G$ b: L$ {/ m7 z
- |(0 << ADC_CFGR_AWD1CH_Pos) // AWTD1 通道选择$ P- R: Z& j+ Y6 u
- // |ADC_CFGR_JAUTO // 自动注入组转换(当启用双模式时,从ADC的位JAUTO不再可写,其内容等于主ADC的位JAUTO。)
; k, a8 \) e8 M7 P6 D - // |ADC_CFGR_JAWD1EN // JAWTD1 使能注入通道
; d& W3 P, n+ D - // |ADC_CFGR_AWD1EN // AWTD1 使能规则通道2 K8 g0 ~) T' t c- Z0 N* A
- // |ADC_CFGR_AWD1SGL // 【0|AWTD1使能所有通道】【1|AWTD1使能 AWD1CH 通道】
$ u- X& v5 i! ~) o$ |% x - // |ADC_CFGR_JQM // 注入队列模式。【0|一次序列后,保持队列参数】【1|一次序列后,队列不保存,清除,续重新配置才能再次触发,这段没有配置的时间不响应触发】8 W' y! S K, _: P6 j+ ]
- // |ADC_CFGR_JDISCEN // 注入通道上的不连续模式。【0|禁止不连续模式】【1|使能连续模式】(不能同时使用 自动注入 和 不连续模式)(当启用双模式时,从ADC该bit无效)
6 {9 `' j$ X/ |% Z1 K* K% p - |(0 << ADC_CFGR_DISCNUM_Pos) // 不连续通道数
+ \# l H+ E* O8 Z" N/ l% k - // |ADC_CFGR_DISCEN // 规则通道上的不连续模式【0|禁止不连续模式】【1|使能连续模式】(不能同时使用 自动注入 和 不连续模式)(当启用双模式时,从ADC该bit无效)# R% v/ J) h l' f& w9 P
- // |ADC_CFGR_ALIGN // 数据左对齐【0|数据右对齐】【1|数据左对齐】' b7 ^0 N0 C2 U; P/ E4 L3 W' J
- // |ADC_CFGR_AUTDLY // 延时转换模式开启 (当启用双模式时,从ADC该bit无效)8 `! O) h( ~) @+ @4 r
- // |ADC_CFGR_CONT // 单独/连续 转换模式规则转换【0|单独转换模式】【1|连续转换模式(只有规则通道有该模式)】 (当启用双模式时,从ADC该bit无效)
: R- ]4 w( r4 {2 R& i - |ADC_CFGR_OVRMOD // 【0|溢出后保留老数据】【1|溢出后覆盖老数据】
# X" I7 H2 x, j- Q7 G/ B - |(0 << ADC_CFGR_EXTEN_Pos) // 规则通道 触发方式选择$ P% u! _2 _/ E5 t9 C' G7 R
- //【0|禁止】
3 \( h' s7 q6 o! i - //【1|上升沿触发】0 x2 C* L' Z( B Z/ a- q
- //【2|下降沿触发】( p5 n2 G* a5 a8 k( H+ o
- //【3|上升和下降沿触发】# J0 z# T8 S% I; U
- |(0 << ADC_CFGR_EXTSEL_Pos) // 规则通道 外部触发源选择5 E5 L" p/ B5 u- Q
- |(0 << ADC_CFGR_RES_Pos) // 数据分辨率 【00|12-bit】【01|10-bit】【10|8-bit】【11|6-bit】: ^9 n0 F. z0 f! [. B, E! |. n* G
- // |ADC_CFGR_DMACFG // DMA 配置
& f# {$ a1 p/ I- A - // |ADC_CFGR_DMAEN // DMA 请求使能
' A/ U' l% P6 ?$ F* \- F2 R - ;) c0 u# L6 e- X
# q! }+ `$ E8 [( C" }% X/ B- ADC2->CFGR = 0x00000000
1 d4 ^; a2 f7 f6 N - // |ADC_CFGR_JQDIS // 禁止注入(默认为1) 【0|允许注入】【1|禁止注入】
) @2 f4 F9 k/ L& ] - |(0 << ADC_CFGR_AWD1CH_Pos) // AWTD1 通道选择. G) `0 s8 G: D( F8 i
- // |ADC_CFGR_JAUTO // 自动注入组转换(当启用双模式时,从ADC的位JAUTO不再可写,其内容等于主ADC的位JAUTO。)
& U5 c( s1 [2 [" m% ]- z - // |ADC_CFGR_JAWD1EN // JAWTD1 使能注入通道
5 o. X n4 b& ? - // |ADC_CFGR_AWD1EN // AWTD1 使能规则通道6 R: J0 m. u" _: p6 {9 v
- // |ADC_CFGR_AWD1SGL // 【0|AWTD1使能所有通道】【1|AWTD1使能 AWD1CH 通道】
1 v D1 i! \1 e: M* t - // |ADC_CFGR_JQM // 注入队列模式。【0|一次序列后,保持队列参数】【1|一次序列后,队列不保存,清除,续重新配置才能再次触发,这段没有配置的时间不响应触发】. G% Z# H$ V0 a/ A4 S$ p3 Z1 {
- // |ADC_CFGR_JDISCEN // 注入通道上的不连续模式。【0|禁止不连续模式】【1|使能连续模式】(不能同时使用 自动注入 和 不连续模式)(当启用双模式时,从ADC该bit无效)/ y+ H! G" m5 S
- |(0 << ADC_CFGR_DISCNUM_Pos) // 不连续通道数* [1 o# ~: S; F/ v
- // |ADC_CFGR_DISCEN // 规则通道上的不连续模式【0|禁止不连续模式】【1|使能连续模式】(不能同时使用 自动注入 和 不连续模式)(当启用双模式时,从ADC该bit无效)
: z) }7 }5 ?& I% B2 A: S - // |ADC_CFGR_ALIGN // 数据左对齐【0|数据右对齐】【1|数据左对齐】
* D7 G+ D5 S9 w, g - // |ADC_CFGR_AUTDLY // 延时转换模式开启 (当启用双模式时,从ADC该bit无效)
- {3 i. \7 C' r" `3 b Z* w - // |ADC_CFGR_CONT // 单独/连续 转换模式规则转换【0|单独转换模式】【1|连续转换模式(只有规则通道有该模式)】 (当启用双模式时,从ADC该bit无效)
8 a* X) V! l9 g6 K. }; H9 N - |ADC_CFGR_OVRMOD // 【0|溢出后保留老数据】【1|溢出后覆盖老数据】
- d" `, ^$ N: U, \) R: ?; I [ - |(0 << ADC_CFGR_EXTEN_Pos) // 规则通道 触发方式选择
& g2 B6 B0 k) s# | - //【0|禁止】8 E% d) ~; `. C: q
- //【1|上升沿触发】
% v8 }0 I+ v: w8 a( R# _. Z0 F3 c - //【2|下降沿触发】6 w* C" j/ I8 k7 l4 S; g- e7 e9 |
- //【3|上升和下降沿触发】
0 R# J7 X: `" L+ Q% V+ P8 S% v - |(0 << ADC_CFGR_EXTSEL_Pos) // 规则通道 外部触发源选择
7 `; N: K9 B. O6 | - |(0 << ADC_CFGR_RES_Pos) // 数据分辨率 【00|12-bit】【01|10-bit】【10|8-bit】【11|6-bit】
5 J) c3 k1 F" V7 z% [ - // |ADC_CFGR_DMACFG // DMA 配置9 `3 u- X- m) q6 R1 b9 i6 u! c
- // |ADC_CFGR_DMAEN // DMA 请求使能
# z+ C- r2 C3 L: U Q g - ;9 L: ]) M: j+ c5 c8 p, M- P% T
+ E' m2 Y# ]' ^& a6 w. I
% d, P H: b# r3 r$ E0 r- // 配置 ADC 看门狗, 如果不需要就不用配置
8 e1 X; V6 u- @; c5 _ - ADC1->TR1 = (3548 << ADC_TR1_HT1_Pos) //2048+1500 = 3548
5 N# o5 p9 s0 X- j - |(548 << ADC_TR1_LT1_Pos) //2048-1500 = 548 I4 D) W4 L: j P6 [
- |(1 << ADC_TR1_AWDFILT_Pos) //达到阈值次数- f1 F/ M0 b5 p1 ^7 {0 \* \
- ;
* Z8 w: G2 q' x: I& p8 U V2 Z - ADC2->TR1 = (3548 << ADC_TR1_HT1_Pos) //2048+1500 = 35481 g4 f/ O; N: Z
- |(548 << ADC_TR1_LT1_Pos) //2048-1500 = 548
( l+ m! v) W) }# h8 V' H* X; t - |(1 << ADC_TR1_AWDFILT_Pos) //达到阈值次数
# c- T7 I( @& ?6 t$ H5 B0 b: | - ;
9 O6 i' X. x5 m i/ p* A" b2 {
' w2 B2 ]8 V2 q: v( g+ K% v' w) T/ z
2 ], Q- ] ~/ G) q2 ~- // 步骤7 配置ADC_SMPR寄存器2 \8 f5 X) l4 X6 m. Z
- ADC1->SMPR1 = (ADC1->SMPR1 & 0x40000007)7 c: [ x# V6 N3 }. [/ W
- // |(5 << ADC_SMPR1_SMP9_Pos) //bit[29-27]: 通道x采样时间选择; Z) _: y% \2 v7 C/ b
- // |(0 << ADC_SMPR1_SMP8_Pos) //bit[26-24]: 【000|2.5 ADC clock cycles】 0& Q: B/ H7 L5 |- }& Q4 t
- // |(5 << ADC_SMPR1_SMP7_Pos) //bit[23-21]: 【001|6.5 ADC clock cycles】 18 ]% D4 K/ r( j
- // |(0 << ADC_SMPR1_SMP6_Pos) //bit[20-18]: 【010|12.5 ADC clock cycles】 2
3 t7 n; `5 Z4 I9 ]! f - // |(5 << ADC_SMPR1_SMP5_Pos) //bit[17-15]: 【011|24.5 ADC clock cycles】 37 l. K- r3 u- j* ]/ G/ C
- |(3 << ADC_SMPR1_SMP4_Pos) //bit[14-12]: 【100|47.5 ADC clock cycles】 4
( o& |1 X9 C3 E - |(3 << ADC_SMPR1_SMP3_Pos) //bit[11-09]: 【101|92.5 ADC clock cycles】 52 ]% |1 D4 Z$ M/ O |7 L
- // |(0 << ADC_SMPR1_SMP2_Pos) //bit[08-06]: 【110|247.5 ADC clock cycles】6/ Y. i& h# ^( W
- // |(0 << ADC_SMPR1_SMP1_Pos) //bit[05-03]: 【111|640.5 ADC clock cycles】7
5 |# J# ?. O& S1 k" Y - ;. b) L/ ]# J Q& M
- ADC1->SMPR2 = (ADC1->SMPR2 & 0xf8000000)1 S3 m6 `/ R3 M b- v
- // |(0 << ADC_SMPR2_SMP18_Pos) //bit[26-24]: 通道x采样时间选择' [4 R' i! n" T4 o) `/ W- y! h
- // |(5 << ADC_SMPR2_SMP17_Pos) //bit[23-21]: 【000|2.5 ADC clock cycles】 0
7 v+ p3 R/ L! M F" V, C - // |(0 << ADC_SMPR2_SMP16_Pos) //bit[20-18]: 【001|6.5 ADC clock cycles】 16 h5 l) C( z: I$ F+ P
- // |(0 << ADC_SMPR2_SMP15_Pos) //bit[17-15]: 【010|12.5 ADC clock cycles】 2
~( m3 R) o& d - // |(0 << ADC_SMPR2_SMP14_Pos) //bit[14-12]: 【011|24.5 ADC clock cycles】 33 t% ]) N* T# l7 g$ g
- // |(5 << ADC_SMPR2_SMP13_Pos) //bit[11-09]: 【100|47.5 ADC clock cycles】 44 c" d) E4 d: B6 r {8 T/ A: V
- // |(0 << ADC_SMPR2_SMP12_Pos) //bit[08-06]: 【101|92.5 ADC clock cycles】 5
. P( v8 F4 j3 P- @9 d, n/ X - // |(5 << ADC_SMPR2_SMP11_Pos) //bit[05-03]: 【110|247.5 ADC clock cycles】6
3 {# Y% N9 z' h( c5 y - // |(0 << ADC_SMPR2_SMP10_Pos) //bit[02-00]: 【111|640.5 ADC clock cycles】7' b% q) N8 Q2 n% m* X2 e# y3 u* B
- ;* w! r. T, {0 m* w& n& _, L7 ^- @( t
- ADC2->SMPR1 = (ADC2->SMPR1 & 0x40000007)
- E2 w1 E3 @* G- k3 W6 {- G0 C - // |(5 << ADC_SMPR1_SMP9_Pos) //bit[29-27]: 通道x采样时间选择
9 y% K( a3 i5 X( G - // |(0 << ADC_SMPR1_SMP8_Pos) //bit[26-24]: 【000|2.5 ADC clock cycles】 0% d1 g7 d% ]4 t" k. j
- // |(5 << ADC_SMPR1_SMP7_Pos) //bit[23-21]: 【001|6.5 ADC clock cycles】 1; O U: L4 }1 M$ V! O: A9 v+ n* r
- // |(0 << ADC_SMPR1_SMP6_Pos) //bit[20-18]: 【010|12.5 ADC clock cycles】 2' d4 x# s5 S$ j2 q4 x
- // |(5 << ADC_SMPR1_SMP5_Pos) //bit[17-15]: 【011|24.5 ADC clock cycles】 32 s g, K: x9 d. X$ P$ |! w5 v6 L
- // |(0 << ADC_SMPR1_SMP4_Pos) //bit[14-12]: 【100|47.5 ADC clock cycles】 4
; K6 p3 r6 r" }, h% }; }+ ~( j - // |(0 << ADC_SMPR1_SMP3_Pos) //bit[11-09]: 【101|92.5 ADC clock cycles】 5
/ z! C3 E5 h( P - |(3 << ADC_SMPR1_SMP2_Pos) //bit[08-06]: 【110|247.5 ADC clock cycles】6
9 H4 f7 K* K& X& m3 m. T+ A S - // |(0 << ADC_SMPR1_SMP1_Pos) //bit[05-03]: 【111|640.5 ADC clock cycles】7
0 [2 L/ S7 G! [( P, Z; b* J - ;
! l' Y5 w4 J( p9 p8 i - ADC2->SMPR2 = (ADC2->SMPR2 & 0xf8000000)6 p- B' ^% q. r
- // |(0 << ADC_SMPR2_SMP18_Pos) //bit[26-24]: 通道x采样时间选择1 S4 r: s3 Q. J; I4 L
- // |(5 << ADC_SMPR2_SMP17_Pos) //bit[23-21]: 【000|2.5 ADC clock cycles】 0
; Z% `$ h& X6 F9 R: U - // |(0 << ADC_SMPR2_SMP16_Pos) //bit[20-18]: 【001|6.5 ADC clock cycles】 1
! q1 Y6 I: u9 V' X' Z( ^ - |(3 << ADC_SMPR2_SMP15_Pos) //bit[17-15]: 【010|12.5 ADC clock cycles】 2
% @5 S0 p$ L8 U) P+ d9 G% ? - // |(0 << ADC_SMPR2_SMP14_Pos) //bit[14-12]: 【011|24.5 ADC clock cycles】 3
6 ?1 L9 V+ B5 O+ ?/ L9 H - // |(5 << ADC_SMPR2_SMP13_Pos) //bit[11-09]: 【100|47.5 ADC clock cycles】 4+ X9 N$ C, f; M) Q! R: b) h# q
- // |(0 << ADC_SMPR2_SMP12_Pos) //bit[08-06]: 【101|92.5 ADC clock cycles】 5- G5 ?4 c; Z% k6 ^, w4 J
- // |(5 << ADC_SMPR2_SMP11_Pos) //bit[05-03]: 【110|247.5 ADC clock cycles】6/ L& t, z+ s% T+ o+ @# U% \
- // |(0 << ADC_SMPR2_SMP10_Pos) //bit[02-00]: 【111|640.5 ADC clock cycles】7) x4 t8 f- }/ a u
- ;) Y+ l' _ k0 ^8 U/ n. n+ |
1 Q/ i$ f5 N1 x* J3 _
2 u( ~8 a) K# v- `, Y8 q4 U; W- // 步骤8 配置ADC_IER寄存器,配置中断0 ^9 Y* M1 Z6 i
- ADC1->IER = 0x00000000
2 @5 B& X$ G; B q$ W0 t( c - // |ADC_IER_JQOVFIE0 }3 q& w( p) S) R" r6 z4 y
- // |ADC_IER_AWD3IE
: n& g/ Y$ B2 @. I2 R$ ` - // |ADC_IER_AWD2IE6 d( C) L" ?) |0 h( t
- // |ADC_IER_AWD1IE) P( r5 L( P) o. }7 \8 l2 n
- // |ADC_IER_JEOSIE
6 [9 k: f a. _3 Q; T9 s - |ADC_IER_JEOCIE
- K. o) g2 F$ V* C3 l) O; T3 L: A6 o - // |ADC_IER_OVRIE
* e! v7 h2 e* h - // |ADC_IER_EOSIE
+ ~) n! z- i8 c1 ^# k - // |ADC_IER_EOCIE
+ Z h6 X- N* Q9 S( p* B - // |ADC_IER_EOSMPIE
3 b( B% ]' {' y; L* h: w - // |ADC_IER_ADRDYIE
7 h8 j# K/ @, J; V* r3 K - ;6 v' }* i8 O P/ M# Q t
' U0 i1 w1 v3 A& ?- 1 |; I$ w: O( d% t2 h0 s+ v. O
- // 步骤9 使能ADC
% _; N8 z$ u1 l3 r - ADC1->CR |= ADC_CR_ADEN;: V; M* I( g. Y8 \/ [8 d% f
- ADC2->CR |= ADC_CR_ADEN;# V: O1 E' g) h
- //等待ADC 就绪; i( `( K- c! l5 e9 G* E: n
- while(!(ADC1->ISR & ADC_ISR_ADRDY));
% _2 V+ o( a% q6 K. X - while(!(ADC2->ISR & ADC_ISR_ADRDY));0 z9 w. d1 a; }3 r# V4 E1 q% r/ d
-
: Q8 s$ _! b6 x* T: h; X# t4 F - 2 Y0 o. d- O, t
- // 步骤10 允许注入触发
; T, G' W/ y' H1 X3 c - ADC1->CR |= ADC_CR_JADSTART;
9 s0 _" h2 k; s( b/ c) i - ADC2->CR |= ADC_CR_JADSTART;
' w! F9 ]/ x, G q0 M3 L -
( u% I7 d# |- k& p8 H' O8 Q' z9 W
" ]4 V/ e7 G- n8 ?- // 配置注入队列
4 k& H8 T; J$ F' K# B- C - ADC1->JSQR = 0x00000000& j/ G9 O7 E* R9 Z
- |(0 << ADC_JSQR_JSQ4_Pos) // 0~18
/ a2 D1 o2 ]# b) c& i* H" q3 F - |(0 << ADC_JSQR_JSQ3_Pos) // 0~18. [$ O" _! D" h9 o2 B% ]
- |(4 << ADC_JSQR_JSQ2_Pos) // 0~18
2 N3 }/ t7 ^9 W - |(3 << ADC_JSQR_JSQ1_Pos) // 0~18( O# |. @9 t u# d% S7 |
- |(1 << ADC_JSQR_JEXTEN_Pos) // 外部触发极性选择。
5 `4 n3 R8 A3 j7 x+ s - //【0|如果 JQDIS=0 ,禁止硬件和软件触发。如果 JQDIS=1 ,禁止硬件触发】
/ M0 U; M* M6 J0 ` - //【1|上升沿触发】# }1 j1 y, _6 \2 F
- //【2|下降沿触发】6 L( ]8 g9 @( q3 w% C
- //【3|上升和下降沿触发】
4 T& M4 A- b) n- r - |(0x08 << ADC_JSQR_JEXTSEL_Pos) // 外部触发源选择
* c# S# o) F' b4 D7 Z3 y) A! R- J - |(1 << ADC_JSQR_JL_Pos) // 注入通道长度 n-1! k" ]7 a$ A6 \* u! z$ f
- ;
& Q+ y/ m8 y' c( U; M$ a4 _3 _) O' \ - + f# D7 `- X; o2 H* r& V3 R
- ADC2->JSQR = 0x00000000" n: f" g+ K1 O( n1 K
- |(0 << ADC_JSQR_JSQ4_Pos) // 0~18
k6 D7 v! x o% A: l, Y - |(0 << ADC_JSQR_JSQ3_Pos) // 0~189 N3 k, V% T5 x- n2 b+ {4 K
- |(15 << ADC_JSQR_JSQ2_Pos) // 0~18
0 z7 O5 C5 G, _# v - |(2 << ADC_JSQR_JSQ1_Pos) // 0~18# h. V$ c' d$ i2 N$ b O
- |(1 << ADC_JSQR_JEXTEN_Pos) // 外部触发极性选择。7 `% t( [8 U: T/ F3 x
- //【0|如果 JQDIS=0 ,禁止硬件和软件触发。如果 JQDIS=1 ,禁止硬件触发】) ~# G. I' {$ [6 N2 s; j& D5 j& V" p
- //【1|上升沿触发】
1 Z% L; ?0 K- {2 |" j3 l - //【2|下降沿触发】
* s; Y* b" H! i4 I! q# \7 ^ - //【3|上升和下降沿触发】) |" y! {" s8 w& E% X( }
- |(0x08 << ADC_JSQR_JEXTSEL_Pos) // 外部触发源选择
) v" d& j) v. ], x5 o - |(1 << ADC_JSQR_JL_Pos) // 注入通道长度 n-1# ]/ W/ ^% E0 v$ ~) `* y
- ;
' V; q' B: h: J7 K& F! C2 i: G# b - }
/ |" r1 Y' ^4 v2 E1 ?1 E. c4 h) [
复制代码 2 q5 Z7 ]( _' d& ~7 f; ^/ m9 W
下面是触发注入模式,在ADC运行过程中,修改 采样队列 的时序图。
# d( @) P _. Y, I
; H& l$ _9 X" G0 _2 B
Q6 j1 A! n5 p, ]" d! X
" j! x- L8 m s- \5 N$ J) o- h
5.1.2 自动注入模式
( L1 W4 `# R) g( z1 u: v0 T% \! _5.1.3
2 v4 O! ]5 t: ^, B7 r# J* n$ ^( _DMA请求5 q" ?1 V& z: O' n* @
双ADC模式
) I7 I; D1 R$ e( g, U当ADC_CCR_DUAL不等于0的时候,ADC进入双ADC模式,双ADC模式下,从ADC的配置位和主模式的配置位共享(CFGR寄存器),只需在主ADC中配置触发源、触发方式、触发极性、注入触发源、注入触发极性就可以,从ADC不用配置。
" ^! U) a4 K) G6 ?" U$ \" a
1 Q' X( Z7 m1 h" c6 |附录" L3 n2 D9 B, d% J& a8 o
寄存器表
3 U* U; S+ m9 F( o0 D4 X; r) t8 a) A1 K6 g. y+ J- E3 @
- ADC1->CR = (ADC1->CR & 0x2fffffc0)//default:0x2000 0000
- G) ]. \( L6 z. h( q& p% q - // |ADC_CR_ADCAL //bit31: ADC校准6 l8 a. U+ B6 E! q# Y7 N
- // |ADC_CR_ADCALDIF //bit30: 校准模式【0|单端输入模式】【1|差分输入模式】
; r% [6 k: b4 G! u8 d" e9 p8 }$ \ - // |ADC_CR_DEEPPWD //bit29: 深度掉电使能【1|深度掉电模式】
7 ^$ G: f6 x/ r" o( v- n - // |ADC_CR_ADVREGEN //bit28: ADC稳压器使能【1|使能稳压器】0 ^% T* Q: R1 j# p. D$ U
- // |ADC_CR_JADSTP //bit05: 停止注入转换指令 ^& b4 b: a7 i. J; N
- // |ADC_CR_ADSTP //bit04: 停止规则转换指令 M7 l4 N- a; T- B/ M. L* n- _/ b0 F
- // |ADC_CR_JADSTART //bit03: 开始注入转换指令3 q* H) Y/ i, Y9 O) D0 @
- // |ADC_CR_ADSTART //bit02: 开始规则转换指令
: J0 a/ u$ K/ n2 F' j" Q' e c2 R - // |ADC_CR_ADDIS //bit01: ADC停止指令
! Z9 k( a) R6 `8 S - // |ADC_CR_ADEN //bit00: ADC使能
! N' ]8 X2 K1 e+ ^3 I, k - ;
7 J9 b7 n; K, z - ADC1->DIFSEL = (ADC1->DIFSEL & 0xfff80000)//模式选择寄存器
: C1 M& Q+ B) l9 U4 m - // |ADC_DIFSEL_DIFSEL_18 //bit18:【0|单端输入模式】【1|差分输入模式】6 \3 M; b3 O, _) P) r0 f
- // |ADC_DIFSEL_DIFSEL_17
9 Q/ G5 F) S. a& ? - // |ADC_DIFSEL_DIFSEL_16% q L* @1 c' y+ i" f: X
- // |ADC_DIFSEL_DIFSEL_15$ d3 A$ c$ l$ J5 k( @
- // |ADC_DIFSEL_DIFSEL_14: A- f6 m H1 @" K
- // |ADC_DIFSEL_DIFSEL_13" J2 `: y$ I! N U7 b
- // |ADC_DIFSEL_DIFSEL_12
, L3 a0 a" ^, T/ U. k4 l5 u$ s - // |ADC_DIFSEL_DIFSEL_11/ D; p! \5 ^) t f0 l
- // |ADC_DIFSEL_DIFSEL_101 s; K) ?2 }- r# ?
- // |ADC_DIFSEL_DIFSEL_9! {. M5 A2 ?' w$ h! l1 {. k: `1 K
- // |ADC_DIFSEL_DIFSEL_85 l' F4 X0 @, {: v7 O' Z% G) ^! g7 w! |
- // |ADC_DIFSEL_DIFSEL_7
3 l* y9 j: K/ h' B2 K - // |ADC_DIFSEL_DIFSEL_6
5 x- ?5 V }9 v, L2 y6 T - // |ADC_DIFSEL_DIFSEL_5! K& l8 P9 K8 J# |5 ?' }/ h( e
- // |ADC_DIFSEL_DIFSEL_4- Q9 ~7 D0 j! Q: ?- D" `4 W8 o
- // |ADC_DIFSEL_DIFSEL_3. t; ~/ m- ^2 [ ^$ P" Q
- // |ADC_DIFSEL_DIFSEL_2
+ q1 ]" D3 C. g - // |ADC_DIFSEL_DIFSEL_1
; o7 e( H/ H. _% ~9 N2 }8 A2 h - // |ADC_DIFSEL_DIFSEL_0
$ z: ]6 n/ Z3 ~, j - ;9 |( ^ z. k# @- s# b! A
- 8 U! G W, i; I6 L0 c4 F, ]) _1 r
- " K# E, d& F+ y- g! u7 k2 i5 N. \ V) x
- ADC1->SQR1 = (ADC1->SQR1 & 0xe0820830)
! Y; v4 R2 @5 w1 P - // |(0 << ADC_SQR1_SQ4_Pos) //bit[28-24]: 4th 规则队列(5-bit 0~18)
$ C' E; E0 a' \ - // |(0 << ADC_SQR1_SQ3_Pos) //bit[22-18]: 3rd 规则队列(5-bit 0~18)9 J0 [$ S& _& l6 E5 G4 W2 L
- // |(0 << ADC_SQR1_SQ2_Pos) //bit[16-12]: 2nd 规则队列(5-bit 0~18)
% W' f4 ]9 R$ s3 ~5 t& g) ?# d - // |(0 << ADC_SQR1_SQ1_Pos) //bit[10-06]: 1st 规则队列(5-bit 0~18)! H* `, ]+ a) I( I& R# o# ?
- // |(0 << ADC_SQR1_L_Pos) //bit[03-00]: 规则通道队列长度
2 U! D, i3 G+ C% m - ;2 `0 x' N2 S& r5 B K
- ADC1->SQR2 = (ADC1->SQR2 & 0xe0820820)( v3 `+ I5 E- {3 ?& r8 u
- // |(0 << ADC_SQR2_SQ9_Pos) //bit[28-24]: 9th 规则队列(5-bit 0~18)5 Y& k. |. C+ t% s3 }1 T
- // |(0 << ADC_SQR2_SQ8_Pos) //bit[22-18]: 8th 规则队列(5-bit 0~18), O7 e' D+ }# W2 E! f9 a: K4 Y
- // |(0 << ADC_SQR2_SQ7_Pos) //bit[16-12]: 7th 规则队列(5-bit 0~18)4 ]6 d' `8 L4 y9 H) j/ C
- // |(0 << ADC_SQR2_SQ6_Pos) //bit[10-06]: 6th 规则队列(5-bit 0~18)
$ l3 Z" C9 |9 B5 W7 k- \ - // |(0 << ADC_SQR2_SQ5_Pos) //bit[04-00]: 5th 规则队列(5-bit 0~18)& ^8 X* c6 G: ]2 E4 v
- ;# k: U8 ^% e. F7 Y, t' Y
- ADC1->SQR3 = (ADC1->SQR3 & 0xe0820820)
- Q$ X$ l% n( b' T7 `) ? - // |(0 << ADC_SQR3_SQ14_Pos) //bit[28-24]: 14th 规则队列(5-bit 0~18)
3 R& S+ J7 U2 _9 @; K3 F - // |(0 << ADC_SQR3_SQ13_Pos) //bit[22-18]: 13th 规则队列(5-bit 0~18)* B) y2 ]+ M8 s, A& J% a
- // |(0 << ADC_SQR3_SQ12_Pos) //bit[16-12]: 12th 规则队列(5-bit 0~18)5 y) S: q1 D) I" z2 J% @! m4 o& K( \
- // |(0 << ADC_SQR3_SQ11_Pos) //bit[10-06]: 11th 规则队列(5-bit 0~18)
2 [6 z# a4 p( |3 P% Z" J - // |(0 << ADC_SQR3_SQ10_Pos) //bit[04-00]: 10th 规则队列(5-bit 0~18)
) m* O# u. J" v0 e1 T* }9 y - ;
$ R- e% o# k/ ?5 V2 x- p; L% I - ADC1->SQR4 = (ADC1->SQR4 & 0xfffff820)$ Z+ m( u, v* Y( D* `- v
- // |(0 << ADC_SQR4_SQ16_Pos) //bit[10-06]: 16th 规则队列(5-bit 0~18)- O5 K% M6 D# g
- // |(0 << ADC_SQR4_SQ15_Pos) //bit[04-00]: 15th 规则队列(5-bit 0~18)
3 S7 I7 ]8 @5 x, G& m8 A* d, } - ;* |& H, G2 f! p% }" N$ A
-
( R& A0 B2 i- {( `" c - // ADC1->ISR 只读
5 G7 U$ P3 q+ P9 {4 L8 k - // |ADC_ISR_JQOVF //bit10: 注入队列溢出, n$ C" @- `( o1 T
- // |ADC_ISR_AWD3 //bit09: 模拟看门狗3 标志位
7 n3 }; a/ x0 d. f/ w ^ - // |ADC_ISR_AWD2 //bit08: 模拟看门狗2 标志位% h- w7 Y& W9 r- Y E
- // |ADC_ISR_AWD1 //bit07: 模拟看门狗1 标志位8 w; @' j! [1 ?$ F$ W5 h) b
- // |ADC_ISR_JEOS //bit06: 注入通道队列转换结束标志(写1清零)1 o0 N4 T. B" v
- // |ADC_ISR_JEOC //bit05: 注入通道转换结束标志(读取清零)
q7 o9 D+ p1 N1 U5 l6 x - // |ADC_ISR_OVR //bit04: ADC溢出(数据被覆盖), j* Y f* G- m9 N) @
- // |ADC_ISR_EOS //bit03: 规则转换队列结束
0 ^) x8 M! k0 |, w! V) N4 N - // |ADC_ISR_EOC //bit02: 规则转换结束
* K; T" K# o. O y5 L - // |ADC_ISR_EOSMP //bit01: 采样结束标志
/ P9 C6 n1 B0 r5 a4 i: }3 T - // |ADC_ISR_ADRDY //bit00: ADC准备就绪
& h, L( [( ]3 ^( s# y9 M) ? - % b& N N, T7 {0 Q& [1 }. d' z
- ADC1->IER = (ADC1->IER & 0xfffff800)
& }; e% O2 a. g; ]2 R- ?6 `' _ - // |ADC_IER_JQOVFIE //bit10: 注入队列溢出 中断使能! ]' ]" G' ^# a$ b) `) a$ X
- // |ADC_IER_AWD3IE //bit09: 模拟看门狗3 中断使能, t( s7 b' s3 K# I% d# l) V$ G; N
- // |ADC_IER_AWD2IE //bit08: 模拟看门狗2 中断使能0 W1 d$ G, V8 T0 q: p6 }
- // |ADC_IER_AWD1IE //bit07: 模拟看门狗1 中断使能1 L+ a2 f6 L& ]2 [: B2 U
- // |ADC_IER_JEOSIE //bit06: 注入通道队列转换结束 中断使能! V( p X& h- z: ~
- // |ADC_IER_JEOCIE //bit05: 注入通道转换结束 中断使能
" h. S! M" |0 s( t) T7 G# o - // |ADC_IER_OVRIE //bit04: ADC溢出 中断使能# L! O$ h2 N: |0 b' l
- // |ADC_IER_EOSIE //bit03: 规则转换队列结束 中断使能
8 G) e2 H$ ^. T7 h' U, M% ?" e - // |ADC_IER_EOCIE //bit02: 规则转换结束 中断使能+ k" u/ `) D, }1 n
- // |ADC_IER_EOSMPIE //bit01: 采样结束 中断使能
3 D6 b Q6 {8 f$ g+ O - // |ADC_IER_ADRDYIE //bit00: ADC就绪 中断使能' O8 d* f+ U& A; d6 ~
- ;4 `+ O" s, ?$ _
- 0 u" l3 u V2 P$ m7 k* G4 b
- - G& Y8 E- ~% w$ {$ w2 U
- ADC1->CFGR = (ADC1->CFGR & 0x80000000)( k) }1 w% y( B, `6 o
- // |ADC_CFGR_JQDIS //bit31: 注入队列禁止使能【1|禁止注入队列】
6 C* m, k& P D7 |/ s - // |(0 << ADC_CFGR_AWD1CH_Pos) //bit[30-26]: 模拟量看门狗1 通道选择) O; P: R; _* k- H4 Y
- // |ADC_CFGR_JAUTO //bit25: 自动注入通道【1|自动注入组转换使能】. p- Q$ ]' c: h4 {+ Z# e9 ~
- // |ADC_CFGR_JAWD1EN //bit24: 注入通道 模拟量看门狗1 使能
8 {- M- m7 h! u! t4 J- I - // |ADC_CFGR_AWD1EN //bit23: 规则通道 模拟量看门狗1 使能
: R o. J/ E8 }: F - // |ADC_CFGR_AWD1SGL //bit22: 【1|模拟量看门狗1 使能在单独通道上】5 w8 f0 e4 L. x/ r
- // |ADC_CFGR_JQM //bit21: JSQR队列模式5 F% f! ^5 ~- V% ?
- // |ADC_CFGR_JDISCEN //bit20: 注入通道上的不连续模式: L7 e8 l* j# ~" N
- // |(0 << ADC_CFGR_DISCNUM_Pos)//bit[19-17]: 不连续模式通道计数
% Q- m6 c6 S) Z& | I - // |ADC_CFGR_DISCEN //bit16: 规则通道上的不连续模式
8 ^" J* {7 y* g: I+ E! k3 J5 h - // |ADC_CFGR_ALIGN //bit15: 数据左对齐【1|数据左对齐】
; }+ e w; R8 U5 U) u - // |ADC_CFGR_AUTDLY //bit14: 延时转换模式开启
* z. E# ~! x/ n( \0 j3 c9 U" b; o - // |ADC_CFGR_CONT //bit13: 单独/连续 转换模式规则转换【0|单独转换模式】【1|连续转换模式】/ U, o: a% A- s! A
- // |ADC_CFGR_OVRMOD //bit12: 【0|溢出后保留老数据】【1|溢出后覆盖老数据】: z' ]; h+ z% Y* a
- // |ADC_CFGR_EXTEN_1 //bit[11-10]: 外部触发极性选择. |0 x/ K0 `4 b, t1 @- d9 E
- // |ADC_CFGR_EXTEN_0 // 【00|禁止外部触发】【01|上升沿】【10|下降沿】【11|上下都有效】
! {. V/ m; R6 N0 R$ ]5 _3 M - // |(0 << ADC_CFGR_EXTSEL_Pos) //bit[09-05]: 外部触发源选择 l& d4 H3 z) g+ B- E
- // |ADC_CFGR_RES_1 //bit[04-03]: 数据分辨率( ]- h& x w. f5 r2 n) C0 ^0 [
- // |ADC_CFGR_RES_0 // 【00|12-bit】【01|10-bit】【10|8-bit】【11|6-bit】
) ?. X5 B3 g% D5 p( n - // |ADC_CFGR_DMACFG //bit01: 【0|单次模式】【1|循环模式】
' G. l% E$ _; r8 s |7 K - // |ADC_CFGR_DMAEN //bit00: 【0|禁止DMA请求】【1|使能DMA请求】, P$ {$ R+ p% M9 D" E! u
- ;4 o J: c2 q6 h+ m6 d7 y! w: L( a
- ADC1->CFGR2 = (ADC1->CFGR2 & 0xf1fef800): x7 W3 m2 X4 A# u, g1 d
- // |ADC_CFGR2_SMPTRIG //bit27: 采样时间控制触发模式,通过SWTRIG位控制采样时间和转换时间# B3 ~2 P0 [, y9 l; `+ U7 c, {
- // |ADC_CFGR2_BULB //bit26: 【1|两次采样间隔的空闲进行下次采样】
, h, a" x0 i9 O! b& T; J. S2 R( C - // |ADC_CFGR2_SWTRIG //bit25: 采样时间控制触发模式的软件触发位
/ g: o# T Y) g. l - // |ADC_CFGR2_GCOMP //bit16: 增益补偿模式【1|所有通道增益补偿】" [& R8 X) n9 U/ B
- // |ADC_CFGR2_ROVSM //bit10: 规则过采样模式【0|继续采样】【1|整个序列重新从头采样】5 w" G' P2 s9 Q8 m" B
- // |ADC_CFGR2_TROVS //bit09: 触发常规过采样8 O. R2 C1 p- {8 r6 B" ?; T
- // |(0 << ADC_CFGR2_OVSS_Pos) //bit[08-05]: 过采样移位
2 M/ s, H8 {) t J9 U - // |(0 << ADC_CFGR2_OVSR_Pos) //bit[04-02]: 过采样比率+ A1 [( c5 N% D6 {" |- N- {5 ?
- // |ADC_CFGR2_JOVSE //bit01: 注入过采样使能
3 \0 v. M- {7 x. C( s& D - // |ADC_CFGR2_ROVSE //bit00: 规则过采样使能
! A1 d6 l) a; Z! ~ - ;
# X. f6 ~( W# r X# D - 6 q0 e V/ ^# w q8 V# T+ c
- ADC1->SMPR1 = (ADC1->SMPR1 & 0x40000000)+ L* w% x2 T ~3 p% ]) |0 r: q
- // |ADC_SMPR1_SMPPLUS //bit31: 【1|2.5-ADCCLK】【0|3.5-ADCCLK】为了使整个周期成为偶数,方便交错模式
3 H& V4 Q( O! h. {# x, G9 |/ l) W8 _ - // |(0 << ADC_SMPR1_SMP9_Pos) //bit[29-27]: 通道x采样时间选择( }* U N" I1 U* O! Y. U) ~6 o: K
- // |(0 << ADC_SMPR1_SMP8_Pos) //bit[26-24]: 【000|2.5 ADC clock cycles】 0
- s1 I+ C+ w) B( {3 c, x7 O - // |(0 << ADC_SMPR1_SMP7_Pos) //bit[23-21]: 【001|6.5 ADC clock cycles】 1. F& j# q0 |+ v7 ~/ P; ^
- // |(0 << ADC_SMPR1_SMP6_Pos) //bit[20-18]: 【010|12.5 ADC clock cycles】 2
3 F7 Q. ~& F! C- W - // |(0 << ADC_SMPR1_SMP5_Pos) //bit[17-15]: 【011|24.5 ADC clock cycles】 3' r& \/ W# Y9 z4 m' `+ ]2 f# G
- // |(0 << ADC_SMPR1_SMP4_Pos) //bit[14-12]: 【100|47.5 ADC clock cycles】 4
3 S" n1 x9 B% ?# \8 P - // |(0 << ADC_SMPR1_SMP3_Pos) //bit[11-09]: 【101|92.5 ADC clock cycles】 5
# T: M: w* O$ w& i+ S+ H3 e - // |(0 << ADC_SMPR1_SMP2_Pos) //bit[08-06]: 【110|247.5 ADC clock cycles】6
: m' G' N) n4 ^2 I - // |(0 << ADC_SMPR1_SMP1_Pos) //bit[05-03]: 【111|640.5 ADC clock cycles】7
+ ~& Z( t/ O3 {4 ^0 N- y) b - // |(0 << ADC_SMPR1_SMP0_Pos) //bit[02-00]: - L- U/ F) F }, M0 j
- ;
: c1 k: Q0 L: _2 J8 P3 x - ADC1->SMPR2 = (ADC1->SMPR2 & 0xf8000000)9 D8 Q$ U4 y( \; b) {1 ^
- // |(0 << ADC_SMPR2_SMP18_Pos) //bit[26-24]: 通道x采样时间选择* C; j! f/ l3 A( Q7 {& [% Z- m2 k
- // |(0 << ADC_SMPR2_SMP17_Pos) //bit[23-21]: 【000|2.5 ADC clock cycles】 0
' q! a! D0 r! L" \1 c, ~/ L- U C - // |(0 << ADC_SMPR2_SMP16_Pos) //bit[20-18]: 【001|6.5 ADC clock cycles】 1
1 z9 L5 x+ j$ Z) s& S7 | - // |(0 << ADC_SMPR2_SMP15_Pos) //bit[17-15]: 【010|12.5 ADC clock cycles】 21 w9 t3 s1 O6 u. i @2 r
- // |(0 << ADC_SMPR2_SMP14_Pos) //bit[14-12]: 【011|24.5 ADC clock cycles】 39 I; L9 |+ z% {' L
- // |(0 << ADC_SMPR2_SMP13_Pos) //bit[11-09]: 【100|47.5 ADC clock cycles】 4* w w7 W2 ]5 o+ `/ T
- // |(0 << ADC_SMPR2_SMP12_Pos) //bit[08-06]: 【101|92.5 ADC clock cycles】 5
% W$ j* R+ k% F - // |(0 << ADC_SMPR2_SMP11_Pos) //bit[05-03]: 【110|247.5 ADC clock cycles】62 G. E& _7 x# K
- // |(0 << ADC_SMPR2_SMP10_Pos) //bit[02-00]: 【111|640.5 ADC clock cycles】7
; d1 }. g, ~2 ?0 V% i - ;* m9 y; U# }& U: R0 D
- $ \2 E! I/ f+ P1 n( Y
- ADC1->TR1 = (ADC1->TR1 & 0xf0008000)* t" v4 z' v# H8 k& k* v# M) c6 ^
- // |(0x0000 << ADC_TR1_HT1_Pos)//bit[27-16]: 模拟看门狗1 高阈值(12-bit)
$ j* f& @' n7 M - // |(0 << ADC_TR1_AWDFILT_Pos) //bit[14-12]: 模拟看门狗滤波参数 连续出现x+1(x!=0)次越限 才被视为有效【0|无滤波】( _/ X5 c7 k# u( S
- // |(0x0000 << ADC_TR1_LT1_Pos)//bit[11-00]: 模拟看门狗1 低阈值(12-bit)
6 B6 U3 O# y( P' L6 c/ q6 s - ; m6 E( }- l- q& a0 T
- ADC1->TR2 = (ADC1->TR2 & 0xff00ff00)5 E* x& i6 a5 d7 M
- // |(0x0000 << ADC_TR1_HT2_Pos)//bit[23-16]: 模拟看门狗2 高阈值(8-bit)
5 S. Y5 v0 S* n9 e. r5 ~/ q x - // |(0x0000 << ADC_TR1_LT2_Pos)//bit[07-00]: 模拟看门狗2 低阈值(8-bit)
/ K+ ]+ N! a% L* ] - ;, Z/ o$ P9 L- ]- M" a6 \
- ADC1->TR3 = (ADC1->TR3 & 0xff00ff00)
# D; @3 ~* l8 X! j* [ - // |(0x0000 << ADC_TR1_HT3_Pos)//bit[23-16]: 模拟看门狗3 高阈值(8-bit)$ q* a ?1 Q( ^( g0 j, t$ K
- // |(0x0000 << ADC_TR1_LT3_Pos)//bit[07-00]: 模拟看门狗3 低阈值(8-bit)% E) _" i6 P! ~# [* J
- ;
) H; M# j5 }& l V" L+ d7 V - , m ~' j: K+ J9 m& i6 \5 B; L4 n
* L( z6 _- R$ o/ c- // ADC1->DR 只读(共32-bit,16-bit有效) ADC规则数据寄存器
( ^# h* G) ^2 l, f5 b$ g$ L8 A - // ADC1->JSQR = (ADC1->JSQR & 0x04104000);- ]" Z0 ]5 ]0 {3 U' X7 n2 R" o
- // ADC1->OFR1//偏移
# i" v+ N6 C4 L; X1 | - // ADC1->JDR1//注入采样 数据
$ ?( H9 y: z* y; Z6 M3 a - // ADC1->AWD2CR e: v& |! K% P( _
- // ADC1->AWD3CR' Q g( }- D. x' h, q9 X$ z/ y
2 K+ ?- G2 x2 E/ Q7 G
1 v. |( I# y! |- // ADC1->CALFACT = (ADC1->CALFACT & 0xff80ff80)
1 _* u% _/ l- i/ ] - // |(0 << ADC_CALFACT_CALFACT_D_Pos)//bit[22-16]: 差分校准系数3 R( \& Z; m, m9 e* m
- // |(0 << ADC_CALFACT_CALFACT_S_Pos)//bit[06-00]: 单端校准系数
6 Y8 k- q" p/ z0 n - // ;
( L9 a: u6 u# t- y/ V
# \; T ^+ k( A! c" H- // ADC1->GCOMP = (ADC1->GCOMP & 0xffffc000)- B1 ~- g6 x: k5 P4 W
- // |0x0000 //bit[13-00]: 增益(14-bit], E i; u" l2 n, [* y
- // ;+ Y H/ N, I8 k: W
- ! b' \7 |- S5 ^
- // ADC12_COMMON->CSR 只读
2 e; c4 I/ ?' b1 U - // ADC_CSR_JQOVF_SLV //bit26: 从 ADC注入溢出: K" n2 k( k6 m, F/ u5 t, f1 W
- // ADC_CSR_AWD3_SLV //bit25: 从 模拟看门狗3
% g' T3 M, z C' X4 M - // ADC_CSR_AWD2_SLV //bit24: 从 模拟看门狗2 标志位
- c! n6 q4 J6 Y2 P/ Z - // ADC_CSR_AWD1_SLV //bit23: 从 模拟看门狗1 标志位% h/ \) b. u5 E" |* ?/ s
- // ADC_CSR_JEOS_SLV //bit22: 从 注入通道队列转换结束标志(写1清零)
6 l8 T8 r3 n7 H. g9 Q) m8 y - // ADC_CSR_JEOC_SLV //bit21: 从 注入通道转换结束标志(读取清零)9 V3 r+ T' y! u- H9 {+ F3 T
- // ADC_CSR_OVR_SLV //bit20: 从 ADC溢出(数据被覆盖); s- e' d: y# r H, d H. S
- // ADC_CSR_EOS_SLV //bit19: 从 规则转换队列结束
4 G1 Q+ K* h1 ^6 Q3 O/ X, a* T- z6 ^ - // ADC_CSR_EOC_SLV //bit18: 从 规则转换结束
m8 x. y" l* h% R9 M! H, x1 ? - // ADC_CSR_EOSMP_SLV //bit17: 从 采样结束标志4 Q0 A3 s1 n, v( v; d! C- F
- // ADC_CSR_ADRDY_SLV //bit16: 从 ADC准备就绪; f( r) s' ]- _- |; h
- // ADC_CSR_JQOVF_MST //bit10: 主 ADC注入溢出8 |8 c* D# V+ t6 X2 r! S
- // ADC_CSR_AWD3_MST //bit09: 主 模拟看门狗3' m; s \- w6 q) o4 A/ \! }% y
- // ADC_CSR_AWD2_MST //bit08: 主 模拟看门狗2 标志位
5 d7 G- E- L+ ~ T3 p; L - // ADC_CSR_AWD1_MST //bit07: 主 模拟看门狗1 标志位
$ y n2 q7 g3 c1 `% x - // ADC_CSR_JEOS_MST //bit06: 主 注入通道队列转换结束标志(写1清零)
* S: A) H+ o4 |# ?( ~% {. \ - // ADC_CSR_JEOC_MST //bit05: 主 注入通道转换结束标志(读取清零)4 h9 Y9 D: a! f: Q6 B s( T/ B
- // ADC_CSR_OVR_MST //bit04: 主 ADC溢出(数据被覆盖)# V9 H+ _9 u4 [( L
- // ADC_CSR_EOS_MST //bit03: 主 规则转换队列结束
: A1 s9 e1 _4 {- f - // ADC_CSR_EOC_MST //bit02: 主 规则转换结束; {2 d: n% n+ O6 [
- // ADC_CSR_EOSMP_MST //bit01: 主 采样结束标志
! o6 r7 r. o; E5 ~* c2 C - // ADC_CSR_ADRDY_MST //bit00: 主 ADC准备就绪; _% d! X4 e" y0 X( Y0 j/ H
$ k0 ]4 S# |1 G+ G- }- ADC12_COMMON->CCR = (ADC12_COMMON->CCR & 0xfe0010e0)3 l9 [: |% p0 j5 Q
- // |ADC_CCR_VBATSEL //bit24: VBAT选择【0|VBAT禁止】【1|VBAT使能】% f6 a. K9 s Y+ v$ h5 ~
- // |ADC_CCR_VSENSESEL //bit23: VTS选择【0|VTS温度传感器通道禁止】【1|VTS温度传感器通道使能】% v4 @- q/ w& `4 O0 h+ t
- // |(0 << ADC_CCR_PRESC_Pos) //bit[22-18]: ADC 预分频 【0|输入ADC时钟不分频】【1|输入ADC时钟2分频】【2~11|4/6/8/10/12/16/32/64/128/256】
3 p/ G) D$ P1 | - // |(0 << ADC_CCR_CKMODE_Pos) //bit[17-16]: ADC 时钟模式【0|异步模式adc_ker_ck RCC中选择】【1| adc_hclk/1】【2| adc_hclk/2】【3| adc_hclk/4】' \, ?* t' b7 t5 ^ M! K
- // |(0 << ADC_CCR_MDMA_Pos) //bit[15-14]: 双AD模式下的DMA模式【0|禁用DMA】【1|保留】【2|12-bit或者10-bit模式】【3|8-bit或者6-bit模式】
. {, T3 R. F: c3 O" g7 C4 r - // |ADC_CCR_DMACFG //bit13: 双ADC模式下的DMA配置【0|单次模式】【1|循环模式】
* K/ B. X0 @( \5 Q+ V) b6 i+ m - // |(0 << ADC_CCR_DELAY_Pos) //bit[11-08]: 双交错模式下的两次采样间隔' r! G, T; K3 o* s- a7 R
- // |(0 << ADC_CCR_DUAL_Pos) //bit[04-00]: 双ADC模式选择【720page】+ B3 p- P0 S& F5 v# _& b
- ;
) B% n" W$ S- c5 I C `- y - // ADC12_COMMON->CDR 只读
2 p. K: h, T' H- W+ | - // // ADC_CDR_RDATA_SLV4 y; X, L0 Y7 {0 i2 }7 L
- // // ADC_CDR_RDATA_MST- d2 M. D8 C6 g" i( J2 P1 L% Q
复制代码
1 X/ H* n; l% f: ~% L7 G————————————————) [: z1 _. N( `+ B
版权声明:Vice Versa XL# |" ^; o* d( v+ { ]
, _3 @' T _. z3 j, X1 Q$ T: s S5 s& h2 x0 M- ?
6 f7 N( l8 Y: v6 L. n
|