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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
& E" z% q; j5 i+ _, {. S  J; G+ n9 E0 H
  1. /*** @7 S- b; f, H0 q/ G
  2.   * @brief  配置ADC1的工作模式
    5 D! z& B( |* f8 v# M, o) |: ~5 z
  3.   * @param  无) M% _- n* O8 W  ^
  4.   * @retval 无
    ! L- X, [: v& G) k6 w$ H/ n
  5.   */
    + S  \& P$ b' r( D
  6. static void ADC1_Mode_Init(void)
    ) ?0 X! _# P2 n& M1 Q4 U6 ^9 z6 S: y
  7. {" z  \' G; x/ a
  8.         ADC_InitTypeDef     ADC_InitStructure;
    $ W0 I, Q/ m4 Y- t* p

  9. - z. J) @1 r0 r8 ?
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/, t/ K6 ^& P% B: f" e  G4 E
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        6 {. [. S- [5 R$ @% u; \& l
  12. : g1 g6 W: K' p/ C" K1 n
  13.         /* ADC1 Periph clock enable */8 n( W# a5 `6 Y# w/ W# {* B+ f
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    / B- |# ]: ^7 |
  15. 9 I  H6 W6 F4 [1 ~9 i8 p
  16.         /* ADC1 DeInit */  
    8 l: m" W& U7 O+ J7 v* Z* I7 F: H
  17.         ADC_DeInit(ADC1);
    1 ], D  |6 q2 j) \) V
  18.         1 i; [0 z* A! @7 O9 p! T5 Q
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/# p% H  O' F- h* ?( h" k# R
  20.         ADC_StructInit(&ADC_InitStructure);                        
    & g" u% l, U% a
  21. + N  q4 d, r0 R
  22.         /*配置ADC分辨率为12位*/' \6 p7 d+ F& B  J4 N; r# I- ]
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
      c; _4 }3 _$ L) q

  24. 4 S: r' r9 I7 g1 w
  25.         /*开启连续转换*/6 q3 F% B3 G. l4 l8 m! x5 ]2 Y
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 8 h& l1 t9 @! p, ?

  27. * z, U; e5 Q7 B/ x- R1 l0 y
  28.         /*禁止触发检测,使用软件触发*/
      I2 `! ?" Y% G  E' c. F7 I3 q4 o$ Q
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    1 q) R( t+ f$ o& y3 q
  30. 5 k0 O$ {9 Y* V8 h
  31.         /*ADC采集数据右对齐*/: X- b1 {, v+ ^( L$ z
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;" }% L/ Y( H9 r
  33. , H, N) x; G$ Z2 w
  34.         /*向上扫描*/
    % u$ U5 I9 G% e4 i
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;, R& G  N! q  ^) S* i
  36. # o: O6 o" Q5 j+ F5 p
  37.         /*ADC初始化*/5 v, r8 s( G- _
  38.         ADC_Init(ADC1, &ADC_InitStructure); ( F' y: N/ n# p+ t% E& O5 \
  39.                               
    8 k7 W& w8 e2 s. w7 u
  40.         /*配置采样通道及时间*/- {/ |' s) Q: y
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    ' i' c7 d2 }/ q6 G0 Q$ D

  42. " ?1 g4 S% J, c+ ~& S
  43.         /* ADC 校准 */, s. R2 p! T! [# e& p/ t
  44.         ADC_GetCalibrationFactor(ADC1);& |/ q, f! Q% H# C) I" n
  45. 2 c/ o8 r3 A1 n( t* h% i
  46.         /* 循环模式下的 ADC DMA 请求 */1 S; L- f0 W9 ]# k: b1 P
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);$ p. I% K/ \4 N+ j3 @% l) G; c% S

  48. & `/ t. l! K. o& u4 j
  49.         /* 使能 ADC_DMA */. g! A0 @/ J( _" O1 @5 R' U( X
  50.         ADC_DMACmd(ADC1, ENABLE);  
    3 g+ t1 z8 `% I) T8 H! X0 f

  51. 1 |  x- R/ P' r. k- F1 y& {' N+ r
  52.         /* 使能 ADC1 */8 p5 s+ i* \' f. {, g  C8 ^0 t/ N
  53.         ADC_Cmd(ADC1, ENABLE);     ' Y+ R$ v2 _  D4 ]% I9 e3 v
  54. * `: i$ j) s- F2 x
  55.         /* 等待 ADCEN 标志 */: I- b' |$ s1 U! F' `
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    $ ]$ r) \7 A: @/ {
  57.   d  {3 \' e4 \$ i  E, b8 n2 K
  58.         /*  ADC1 常规软件启动转换 */  + @# l) p' D/ j
  59.         ADC_StartOfConversion(ADC1);9 X* e  Y% E4 Z! _* h
  60.         
    ( o9 O4 A8 q* M+ P: q( g6 f) J& G+ x
  61. }
复制代码

( Y% ~+ k5 @# r
  Q4 ?3 x6 L  S( C* n8 h

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2782

评分

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

查看全部评分

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

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**
8 {1 @! d/ _, q) @4 S8 ~7 f/ f  * @brief  Configures the ADC clock (ADCCLK).( z4 f# S- I7 g3 z
  * @note   This function is obsolete.
* C! @0 }8 G+ N- h8 J  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
+ `# w4 i" N( \8 S$ @: o# p5 R  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived 7 Y! q: v: t9 @! _: \
  *         from the HSI14 or APB clock (PCLK).+ `$ i3 ^0 X& u8 Q7 n% b
  *          This parameter can be one of the following values:
0 i$ V+ r4 ?; j1 V, M  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
7 @- z% n; [, s- C  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2  |6 j' I( p/ I. |
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
+ ^8 Y, {, W% @  * @retval None
4 ^: k4 T. ~- ~3 J: m  */& m0 C) H0 i3 X! }
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)/ E4 X- }7 q6 F3 b' @% Q
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

' X% z+ ~! d* {6 S/ H, [void ADC1_Mode_Init(void)
" x& I. x- K7 H. P4 A{
, W1 F  v* O3 g8 w" y; U    ADC_InitTypeDef     ADC_InitStructure;
- h7 i9 A; |+ I5 T" S1 B! d& ^  E+ @- S5 R
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
' d+ j8 ^/ J7 v  t& Y8 J5 f1 ^  Z    RCC_ADCCLKConfig(RCC_HCLK_Div4);  e% L( D' k3 g# Y$ S& i* @6 Z
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
5 m& e$ U, s; v# y, W3 H7 ~8 u( C; m# Z) p/ f5 ^$ t# P
9 i% l6 F" v0 r# J* y5 F
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.' R* R9 d- a, ]7 s7 d  {
" \4 T" }7 s3 S1 e% P
另采集数据全0,还没看那里的问题..
1 T& H+ v$ y7 u( t& Z0 y! l  `% g. c. J4 _2 Z* Z
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42* A+ Q5 W: H3 X: C2 K8 R
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
# o3 q) d7 Z+ z  w3 H
滤波显然会影响速度的吧?
# z( V" u" S$ \5 }& G4 P滤波之后还能有多少bit?
1 x/ o2 Z7 F9 f5 v4 m你现在是内基准还是外基准?
& j  ~# j4 z1 s( M* ?内部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: T  W5 S9 h4 v6 X/ m9 n+ q  F& O* ?' K
谢谢分享

9 D" z1 ]3 g. [- l! C0 {+ C4 m* @0 T3 g能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01# p0 x1 e7 H! `; B% Z, U) _
多谢 分享

2 T1 Z  ^# Y* j$ @6 |# z能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
# u, x! N& g, q5 m* X
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:554 Y# E4 y  G5 N6 T( w
数据从哪里读取呢?要不要使用中断呢?

; G" ]6 w1 F. G. [我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
# h( z# H2 m& V, P: t, `$ H# L谢谢
$ A' F& R' Q8 ~- l8 g8 p8 J
多谢版主支持
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 手机版