你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f405/407的三重 ADC同步触发模式+DMA 配置

[复制链接]
sailor.wu 发布时间:2015-11-2 21:41
本帖最后由 sailor.wu 于 2015-11-2 21:54 编辑 1 b  u( W+ D( k* B  t" \& h) N

- v# n! D5 ~' M  @( z在成功实现stm32f405/407的两重 ADC同步触发 模式+DMA 配置的情况下,想实现stm32f405/407的三重 ADC同步触发模式+DMA 配置,但是怎么改配置都只有ADC1和ADC2有数据出来,纠结了很久,最后决定静下心来看参考手册和数据手册。最后终于发现是ADC3的端口配置错了。

ADC1~ADC3 的引脚与通道对应关系

ADC1~ADC3 的引脚与通道对应关系

0 k6 @: p$ O: L" O) A2 a9 y6 V我用ADC3去采PA4数据,哎。。。浪费生命啊!!!!!!!!
- f2 @5 B) G# t3 d) i. O" r! w
' Q3 R! _+ j+ E: h1 L7 j) B/ S8 l; E6 S
我换成ADC1去采PA4的数据。下面附上我的程序,给大家做参考。
' v- b/ q- M  d【注]. E. e# ~3 T  i
1.用软件触发一下,ADC_SoftwareStartConv(ADC1),就同时完成三路的ADC采集。在ADC都给到最大频率36M时,采样时间设为ADC_SampleTime_3Cycles时,实测需要730ns时间,没有理论的(3+12)/36=0.4166us,不知道是什么原因,有知道的小伙伴告诉我一下。7 C6 F8 C9 e1 a8 L
2.实测ADC给到最大频率36M,采样时间配置为ADC_SampleTime_3Cycles的数据并不是很稳定,改成ADC_SampleTime_15Cycles后,有很大改善。$ [- E. T9 x9 l# |: M6 j2 n) P+ g
+ k2 c4 V6 j" I2 v# }
#define ADC_CDR_ADDRESS    ((uint32_t)0x40012308) //适用于双重和三重模式的 ADC 通用规则数据寄存器( ADC_CDR); n! Y1 l2 J4 T) e" A

  M0 l, {) b3 |inline void Init_ADC123(void)
; n& ~+ [. \& z+ V* C( p/ M0 v) V{
7 g# m( k& X0 R% c5 T+ w8 T7 U" \    5 o: P- O. s% C( a9 ^: {+ C
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
, p8 E! a$ T9 T+ S7 Z7 T) Z0 C  0 \* s6 O2 R, Z" m6 [+ w9 I& ~
  
+ w" X2 }1 G. N1 h! w' f  GPIO_InitTypeDef  GPIO_InitStructure;
; ~% V7 s" z( ]1 X" O. T3 u* H  //先初始化ADC1通道 IO口" a3 Z! G% `% Q
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;;
( M$ Q. E2 @- X# G2 z  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入" A4 b( E2 `; ~" d$ O
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉$ n; H0 Z7 D* {1 Y; K# a
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
# N: l% C( I5 c3 N4 n$ |  ) p& L, s1 L) ^* f6 M
  : j. U7 u  D- K; x+ ~+ |
  
" |8 ^6 e7 X% i  /*****************************************************************
% o- D, q0 J5 B  *************************** DMA Configuration  ******************8 t+ J! R2 {( Z, I
  *******************************************************************/9 f( z: q# S. S6 y
  5 C' E, ?( M  Q7 k9 Y: d  E
  - D, L: ?0 C$ a* N
  : o9 {+ b7 `7 P0 M# B( J
    DMA_InitTypeDef DMA_InitStructure;7 a8 E0 W# ]* O5 Q1 j
    /*首先开DMA2时钟,由407参考手册-RM0090-Reference manual" a5 ^+ `& ^5 |# x3 s% X4 a3 d
     *165页可知,ADC与DMA2映射,而且DMA2挂载在AHB1时钟总线上*/
# \+ y# `* a$ X) ~7 p3 R8 w! H    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
8 I: r- f2 Q# a; w1 d5 H   
0 K/ H- b, D+ o  z0 W    DMA_DeInit(DMA2_Stream0);- R8 S, ^1 G5 A( z/ K
    DMA_StructInit( &DMA_InitStructure);8 F9 f3 O3 e0 o/ Q/ ^3 C
    DMA_InitStructure.DMA_Channel = DMA_Channel_0;                     //选择Channel_0, [$ T. y3 y4 h: e1 J
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CDR_ADDRESS; //数据传输的外设首地址,详解见上
5 B& v7 S! m# b3 h# k& z    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adc_result;   //自己定义待发送数组的首地址,要强制转换为32位
* _5 y  c4 P0 _8 m, g* }                                                                                                        //记得改成你需要DMA放置数据的地址
% e5 U5 p- C' Z- @! V6 x2 ?    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;       //数据传输方向选择为内存->外设
7 q0 {8 B2 A* D6 x% v. U, a    DMA_InitStructure.DMA_BufferSize = 3;                      //传输数据大小为16,单位由以下确定,大小要配合定义的数组类型和外设数据类型; @9 N6 ~- g3 _2 J
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器自动增加禁止,因为这里只用到了DR数据寄存器
7 @2 x! }. ?; ~1 Q    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;         //内存地址自增不允许,因为只存取一个数1 ^" w; s+ z: W% j
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设的数据大小, G4 n( B( V, M: g' [7 t
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;     //这里也选Byte: s1 C& p* m7 _, ]
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;       //DMA传输模式为Normal,如果为Circular,将会循环传输
: ?( j2 F3 \! v0 ~* U" r    DMA_InitStructure.DMA_Priority = DMA_Priority_High;   //优先级为VeryHigh  k3 Y% ~+ m2 g/ Z  ?1 v2 a
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;/ I' _3 q% Z' @6 }; p. t
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
/ x. ^- T. Y8 U( E" D- e" Z: x    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
& V( p$ T$ Y. G" x    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;$ s8 t* N8 S+ O, p
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);
$ p4 _" `+ d" s, p8 [   
; z7 S, D8 H- B2 Q6 X8 _) o8 L- u. _
( N' `) U: J  L9 ~1 {//    NVIC_InitTypeDef NVIC_InitStructure;, J" \# D0 a# C' q" \+ P& y' p
//    /* DMA中断配置 */
& ?. |2 v, n. [: n* N! P9 ?//    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;      //嵌套通道为DMA2_Stream0_IRQn
% |$ O6 o4 E4 p/ O& Q/ X//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为 1* `2 x4 e( P( g6 H% p% }+ _( d
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          //响应优先级为 0  {, C/ e% i' p6 X# l2 O( ~* `
//    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //通道中断使能
5 t+ f  c* Y$ E) a" m: N//    NVIC_Init(&NVIC_InitStructure);9 O: L9 \* u; S8 m6 n9 T
   
4 e" g# K/ q1 ~( [   
% Y+ s+ ~& V. H* |! t" }   
6 T8 ~; i8 \4 Y) R% J7 V    //使能DMA2_Stream0通道% i) n! G# P. p5 q9 \
    DMA_Cmd(DMA2_Stream0, ENABLE);& I# O8 @' \: F# p8 b! e
   
9 |: Y' E, D! }7 ^
9 n8 t4 V0 i8 d3 k//    /* DMA中断开 */& m% Q9 ]% Z3 E1 ]" W! a" \" V1 q+ F
//    DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);7 {5 W; N" a, N% N/ s
   
, \5 C# ]. l( v9 F    " s* `3 w- o7 `$ i. b4 @! H2 h8 D: V
  /*****************************************************************+ V$ r# q/ |5 L% z7 a8 k. z
  *************************** ADC Configuration  ******************1 ?4 X' @# j: ?2 K" V
  *******************************************************************/) E0 S3 T/ E" z! k( e1 ]1 ]: _
  
6 C6 ~* R% i/ E# K  
9 n0 y( G8 u& G0 F; q. P  D  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2|RCC_APB2Periph_ADC3, ENABLE); //使能ADC123时钟' o! ?0 }' C/ N

$ p1 C' m/ z, e7 N; Z3 k  y4 y  J( A1 x
  ADC_DeInit();# e9 }& a, p3 [/ u" J  {
  //初始化ADC Common
; B. u7 Z* o+ w$ P  ADC_CommonInitTypeDef ADC_CommonInitStructure;2 P* T8 E8 ?6 L( b* j  \
  ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult;4 O# I  G$ u6 E4 K2 p; w' B. u
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
6 ?& |  `/ `- e  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; //DMA使能
* ~4 `' q) R/ D7 E0 z" J3 _0 ?% D$ R  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;//预分频2分频。ADCCLK=PCLK2/2=72/2=36Mhz,ADC时钟最好不要超过36Mhz $ F3 ~# c8 t8 T4 }* R: K
  ADC_CommonInit(&ADC_CommonInitStructure);//初始化
7 B1 K1 h& U2 B+ P   
5 ?5 z; R2 |& ?6 p  w1 [4 O  ADC_InitTypeDef       ADC_InitStructure;! H0 R6 q# R+ j) h: Y9 G
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
7 A- q4 \% z2 y+ {+ T7 t. _  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式   
! s" |+ j" j# i" g6 `  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换6 b- `) o" J" k
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发1 W2 i1 h& v7 z& v$ i. G: h
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐   
( \; e8 l* C, g. w* v6 o  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1
7 _6 c1 a! n% i; Y# s  ' C5 A. Z! S" u8 g* m) a2 C# q. F
  ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
3 ~3 ^; p$ q  b5 s  ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 1, ADC_SampleTime_3Cycles);   7 J' H3 V# w4 T8 Q% q7 X
  
% W- Z  R: X$ H5 V  M, _) \. x# q  2 r+ o8 U( |+ M( f# a- N  c$ a( s
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式. T, l+ `# W7 X+ j6 q5 W- R
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式    7 X2 f- |# [, R* m) g! R( K
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换7 r( E3 M! o' ^" U" f0 M: |% B& X/ W
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
5 ]0 t9 l0 w$ Y- c! m9 M) I! d  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐    8 M) I' Z/ U& y& H( x5 {$ U
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 + s6 }* f& z4 |9 o3 {  q' y
  + G; |7 P8 y$ H
  ADC_Init(ADC2, &ADC_InitStructure);//ADC初始化
; E" p& ?6 S5 B( @8 l" d/ J* w  ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
7 p. g; v; b5 E- \  
5 z) Y# U) A# [* b' F# G8 E  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
2 Y$ X3 b1 o; Y) i; T% b  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式   
0 s! E- i. d1 V# E. E1 R1 [  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换, N' K! l" J- K# Q
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发2 D9 q0 T7 F3 l1 J( u) S) t* s4 [
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐    - p, G" A2 }9 M
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 - i. f. e, v& s# {: @6 d- q8 U3 w
  8 y, Y4 Q. W3 X3 i! W
  ADC_Init(ADC3, &ADC_InitStructure);//ADC初始化
$ v0 L8 i1 A; u5 g  ADC_RegularChannelConfig(ADC3,ADC_Channel_1 , 1, ADC_SampleTime_3Cycles);# t7 Q. [+ V$ {. y: s

; r* x% S" S# v1 f$ j  /* Enable ADC1 DMA */
5 F9 V- [& V1 B/ _7 U/ W8 p  ADC_DMACmd(ADC1, ENABLE);
7 L% Z  y" E0 u$ j; U
/ e( c; p: k7 n& g, q1 @5 ^8 w    . K0 y) M; O1 }% Q' m
      /* Enable DMA request after last transfer (Multi-ADC mode)  */
/ P1 @# R. Q0 a* e  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
$ Y/ R# i- |1 j% w1 ]    . z  S% f2 V4 @9 r% U7 q
  /*可通过将 ADC_CR2 寄存器中的 ADON 位置 1 来为 ADC 供电。首次将 ADON 位置 1 时, 会将 ADC 从掉电模式中唤醒。*/' ]( H  A; s# ~  i) F
  ADC_Cmd(ADC1, ENABLE);//开启AD1转换器   
7 x- ^/ X  A, Q  d; x% i/ p  ADC_Cmd(ADC2, ENABLE);//开启AD2转换器    & s' E5 j$ d# i: H. a5 C) {
  ADC_Cmd(ADC3, ENABLE);//开启AD3转换器7 n  ?9 h* q# V* c/ U# q
    4 m& L1 i( C# m/ d0 S, T* ^- {* W
}
- [  {) G3 L1 `1 Y% r; B1 P2 W. y, `
: M' r  C: \4 }. i6 u3 Y) ~  S
赞 收藏 5 评论16 发布时间:2015-11-2 21:41

举报

16个回答
dz6666 回答时间:2020-5-30 17:19:59
三重adc都存在adc_cdr寄存器中吗,adc的分辨率是12,三个需要36位,adc_cdr寄存器不够啊
CarverZhang 回答时间:2018-8-31 22:38:36
假定 ADC为 3个通道,ADC2为 3个通道,而ADC3 为4个或5个通道,能采用同时模式采集吗?
webberz 回答时间:2016-12-15 21:48:18
楼主大大,请问只要开启ADC1的DMA就可以吗?ADC2和ADC3的是不是也需要开启?
sailor.wu 回答时间:2015-11-2 21:52:10
自己顶一个,哈哈哈!!!!!!
钊钊 回答时间:2015-11-3 00:25:16
多看手册必定有用·哈哈
沐紫 回答时间:2015-11-3 08:38:41
谢谢楼主
me浩 回答时间:2015-11-3 09:03:39
心下大喜
我是你的e 回答时间:2015-11-3 09:06:28
学习ing.............
dear祝子 回答时间:2015-11-3 09:11:35
给你32个赞!!!
niexiaohui 回答时间:2015-11-3 22:39:33
wz002 回答时间:2015-12-11 17:06:42
五哥1 回答时间:2016-12-29 02:50:22
辛苦了,学习了
zbber 回答时间:2016-12-29 09:11:39
楼主加油,我们都看好你哦4 V7 t# F5 t, p: [( v. b
5265325 回答时间:2016-12-29 09:50:01
黑皮男 回答时间:2016-12-29 12:28:08
赞一个
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版