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

STM32F0 ADC(DMA中断)多通道,注释超详细  

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下' C0 Q' e( {  }  @

3 O1 d3 r- {8 I; ]
  1. /**& ^) Z, a5 y6 r. }5 K0 K/ l
  2.   * @brief  配置ADC1的工作模式4 O; k  T+ E4 M. P0 E
  3.   * @param  无1 A4 O; c5 b6 b5 ^( x. [* \
  4.   * @retval 无
    : B/ I' H) G  m  o. H$ l4 u) q
  5.   */6 L& B+ A* |- ]9 c  R" a
  6. static void ADC1_Mode_Init(void)
    9 F" s& w+ m/ ]2 B  ^+ I
  7. {( ]' ^" z. P' R  M6 f; J
  8.         ADC_InitTypeDef     ADC_InitStructure;
    & R( a: ?/ ?4 a/ l/ `  B

  9. 7 [+ J' X! Z: \3 b
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/4 L; y: U- Q" E; P' T% [1 j
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        7 F4 G1 |; P$ W3 m2 j
  12. * [3 f7 A, V. F+ X+ Q
  13.         /* ADC1 Periph clock enable */- N# a, y2 n1 y0 k8 O
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    1 y0 B; P4 ?; ?

  15. : z$ }) D+ {8 u9 x  }) \  _
  16.         /* ADC1 DeInit */  7 ^. B9 Z1 W; d+ }2 L: |
  17.         ADC_DeInit(ADC1);
    : X4 h1 ?5 W+ s* @. c; ^
  18.         
    0 P# B1 A$ ]2 K& v& X
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/2 t6 W) ^, T2 g4 z7 }8 p1 N
  20.         ADC_StructInit(&ADC_InitStructure);                         3 ^; M( W/ m& @: i+ E

  21. * }* n$ c: {* x# p1 _3 f
  22.         /*配置ADC分辨率为12位*/
    , k( x, E3 W7 J! d9 P: `+ E
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
      T2 R& g  w; }

  24. ) L! g. F' n1 a  L) O! W# S
  25.         /*开启连续转换*/
    " r6 \& {, R' O
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    # w1 U5 Q: g4 [: h
  27. : T4 P" T) f7 l+ H
  28.         /*禁止触发检测,使用软件触发*/
    5 w6 ]2 N2 J8 H9 c( S; F
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;; g) J, v# U8 @1 I9 |
  30. 7 \% v  l; ~  G+ ]: n
  31.         /*ADC采集数据右对齐*/, S; ^) @% p+ k4 h" t% F
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    5 k- a9 e) J) V( Q* S9 O: |
  33. 2 _7 q: l) @8 T0 r
  34.         /*向上扫描*/- O* I4 e4 }* E+ ?
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;8 ^% E, @7 I6 r9 @
  36. - m! {  f! o) w$ ~3 ~
  37.         /*ADC初始化*/
    ' F* Y! s; U( g8 }" C# q. h0 B- L
  38.         ADC_Init(ADC1, &ADC_InitStructure); : |: _& m6 }# q+ Q/ N* ~' P
  39.                               
    4 S0 v- |* p" n2 r  }
  40.         /*配置采样通道及时间*// f1 i9 y2 @' g, i
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    7 |. z" ]5 s% Q0 [" H7 i/ D
  42.   h  ]0 U3 N' M: w/ v" s
  43.         /* ADC 校准 */
    % U$ M  T0 U* [' c6 B
  44.         ADC_GetCalibrationFactor(ADC1);' T2 v% i8 L' i. Q" n: R' i

  45. . l% ^) C* l' |% _
  46.         /* 循环模式下的 ADC DMA 请求 */6 g  Q( l' D7 L1 M& J+ I/ ]
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    ! m1 m; n" J4 F& b/ }; Z

  48. . u* g& I2 I6 z) j7 R$ G" l' A1 F. D
  49.         /* 使能 ADC_DMA */
    & j; V% R- J) G- E
  50.         ADC_DMACmd(ADC1, ENABLE);  9 G" w. o2 h% z9 O* ]

  51. 1 g1 `$ R" G  j4 A7 v; o1 L
  52.         /* 使能 ADC1 */
    9 l; a3 N% h7 _9 d: V/ k
  53.         ADC_Cmd(ADC1, ENABLE);     : x6 i! E  W- w1 n" z  F" U4 N
  54. 1 b% e0 Y1 N6 l* k: `
  55.         /* 等待 ADCEN 标志 */- V' T, s5 |, Q/ [" z, X; k2 T
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));! f3 t  v, P2 w
  57. ! Z; p: I# m! a% [2 r3 P
  58.         /*  ADC1 常规软件启动转换 */  8 g1 v& h0 H/ R" O! |4 _
  59.         ADC_StartOfConversion(ADC1);
    ! p& a& l- H, x$ K$ Z
  60.         : v; W) {3 ^& M0 b: T) a8 y- V0 a7 N
  61. }
复制代码
6 [# g% v; a+ `; E* G
% E; k+ ^' m) B4 I2 \. t/ Z/ x) @

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2796

评分

参与人数 1 ST金币 +1 收起 理由
wbaojang + 1 淡定

查看全部评分

收藏 13 评论95 发布时间:2015-1-8 09:33

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**
- j4 J2 W5 K0 c4 Z/ Q5 U/ O  * @brief  Configures the ADC clock (ADCCLK).3 `& R5 |4 g$ H- ?5 L
  * @note   This function is obsolete.( u5 ^* l/ {, G  j
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver: M1 q( @3 h3 j% J( M
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
% Q+ s, S; C) M6 m: ]  *         from the HSI14 or APB clock (PCLK).
) ~5 j/ N2 d/ T$ u$ \, J  *          This parameter can be one of the following values:5 _( t) J6 S4 k  k2 k  u% m
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)' g) U6 o; j  B6 x0 Y2 b- A
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2( v) g) C% K: J7 P8 H9 U0 t
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
( L3 e: h& z; u) V$ n. ^  * @retval None! v9 G1 U. w6 Y( k- O3 G! s$ E
  */0 e, L+ P4 i7 @' ]4 n* X9 C
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)4 }8 ~* t& o6 c
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

* y6 D# b$ w- U: T$ r  Wvoid ADC1_Mode_Init(void)9 Q$ C1 K8 S. I
{) D2 |8 o. N& z
    ADC_InitTypeDef     ADC_InitStructure;- A0 T0 T+ Q; {3 x

8 Y" s! B3 \" B; f: b' \    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/; P4 L$ ]6 w" m% Q* t
   RCC_ADCCLKConfig(RCC_HCLK_Div4);$ g& B+ h4 L2 J. X- ?1 U: g
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);3 z3 ~9 n1 c* T+ u* m2 c

7 y4 a; D0 j: H+ w' M" ~9 V+ T2 C, u; m' v4 K8 D% z
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
* _: V% U1 S* F7 m/ `5 _* Q! _, _5 D% D2 O; S7 M( ^  w
另采集数据全0,还没看那里的问题..
6 s( {& E3 M# W/ b) \2 c5 X& g, f4 [4 v, W. g
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42% q$ a& p9 c5 g
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
; ~* s1 |  X, z8 e1 V; T- b
滤波显然会影响速度的吧?) d/ G2 T) e: g' }7 v. F, D0 S
滤波之后还能有多少bit?# _/ z. w/ F, w- Y8 r
你现在是内基准还是外基准?/ e, Q2 s) _/ D' D' j  X
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了  呵呵。
dajin123 回答时间:2015-1-8 09:33:36
沙发自己坐
埃斯提爱慕 回答时间:2015-1-8 11:42:01
提示: 作者被禁止或删除 内容自动屏蔽
lovewyufeng 回答时间:2015-1-8 13:01:36
多谢 分享
dajin123 回答时间:2015-1-9 08:32:43
dsjsjf 发表于 2015-1-8 11:42$ F4 o; b5 S2 p9 q: r* q" i) c
谢谢分享

4 u4 f# ]1 j: B) W' S- d* ]' D" s能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:013 \/ Z2 B$ m7 x
多谢 分享

4 m% C) L2 Q9 T$ M# n  w2 t能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?  b% f; v* N# }4 @' |7 r* W
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
) U4 Y- p. u; R/ J数据从哪里读取呢?要不要使用中断呢?
# i8 L1 @* P3 K- y# k  ?* L: X) T. P
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
7 r) a% |/ U- M/ ]谢谢

* @7 H5 m4 S4 Q1 @多谢版主支持
Tcreat 回答时间:2015-1-13 09:40:48
不错学习学习 支持
kevin0129 回答时间:2015-1-13 09:51:56
楼主这注释写的很详细啊,很适合新手入门!
xuwu_19911119 回答时间:2015-1-13 10:04:14
今天晚上试试看,昨天晚上没有搞定呀。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版