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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下: Z. t/ R0 D* ^9 j. ~3 Z

. C+ U; A8 b( b% l6 g8 h( k' O
  1. /**
    6 t- ^6 x2 N: K2 {4 Q9 X- a, C
  2.   * @brief  配置ADC1的工作模式
    , `4 d% n: `% a" ~3 a6 Q
  3.   * @param  无
    ! s! I( o" l, z$ l, u/ \9 [' ~
  4.   * @retval 无
    * v7 h7 y& m& g  ?1 j5 V
  5.   */
    , T' z4 [, T6 Q8 j
  6. static void ADC1_Mode_Init(void)6 d) l- x$ Q" C7 q7 I) d. M
  7. {
    7 K. m/ e4 Y: R; N
  8.         ADC_InitTypeDef     ADC_InitStructure;
    " _. I) M& x) Z

  9. / T2 x4 _7 p' P
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/1 d7 g; X1 x# g+ u* c* P: W
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        % }2 p2 }) M) Q; ^3 B, w* d
  12. ' l4 v# D  ^0 }
  13.         /* ADC1 Periph clock enable */
    . \6 @, H5 S$ L) n
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    5 c! `0 x+ n$ h/ G' b

  15. # ~/ L" @/ Q( k
  16.         /* ADC1 DeInit */  
    - S$ s! t/ l' \0 U, V1 _
  17.         ADC_DeInit(ADC1);8 x6 v0 j: z2 J: n* o/ K
  18.         
    & p& B/ ^  Z0 v: |8 n4 g3 d
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/( F% a2 ?. Z1 F: \% ~2 a. J
  20.         ADC_StructInit(&ADC_InitStructure);                         / A3 a+ a  Z+ N' N1 V
  21. / u5 U( y  X% u$ a. N" _' n
  22.         /*配置ADC分辨率为12位*/
    4 F& b/ _8 s/ R8 ?
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    7 W# Z3 Z' \- ]' t3 b
  24. ) J- j  F1 V  @. ~3 K
  25.         /*开启连续转换*/
    . S6 \7 `6 c3 u5 ~* J+ o' O0 c
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   z- }; E1 T, B) k6 Z5 P

  27. 7 p( ]) a" w" k" i5 _. ^
  28.         /*禁止触发检测,使用软件触发*/
    + ^5 ^7 @+ E- y8 z* |" e! S
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    2 l5 ?8 @, D  P  r2 b+ m
  30. # p' y- k  Q, i& X. w' v' [& |
  31.         /*ADC采集数据右对齐*/4 |( V5 a2 H+ \* R# N! T) f1 T5 g6 J
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  \: U  {# f! d' V

  33. + q! [& ?  h+ m
  34.         /*向上扫描*/3 t) D( I0 s3 G* ^3 C1 @) C8 z; U
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;  Z: L" R8 @2 E* z3 M
  36. 4 b# }4 p/ Z' O( @+ R; w! t4 h
  37.         /*ADC初始化*/
    2 R2 M8 r! v, o7 C5 n8 f' b: }
  38.         ADC_Init(ADC1, &ADC_InitStructure); ' W& |- B2 q1 k% A
  39.                               
    3 _3 Q" h1 u, |8 ~9 a
  40.         /*配置采样通道及时间*/+ z  l2 l$ o$ P5 y% e# n
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    & W4 e# O; \7 z- J& g
  42. 5 T) Q  ~7 b. w1 [  N
  43.         /* ADC 校准 */
    2 Z; q( J* y  |" z: |( Z/ _
  44.         ADC_GetCalibrationFactor(ADC1);
    9 C, m, W, @9 ^  H2 Q5 s

  45. 4 ^- c- @. d2 [( G0 [* ?: U
  46.         /* 循环模式下的 ADC DMA 请求 */) x, u* t9 {( ~
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    4 Y; I' Z5 C! w" Q+ s# d* }) w
  48. 1 Y8 `: K3 S9 P  D: n. j
  49.         /* 使能 ADC_DMA */
    ) F! Z7 p9 H( E' a
  50.         ADC_DMACmd(ADC1, ENABLE);  
    $ e9 }7 w- p3 r  ?" n" L- h/ c

  51. " c3 N7 [3 J$ Y; H
  52.         /* 使能 ADC1 */
    0 r9 p: R" y: P, Y4 t
  53.         ADC_Cmd(ADC1, ENABLE);     
    % s' p( _" h! U8 ]

  54. , z) ?3 ]6 N4 S! H( K: p
  55.         /* 等待 ADCEN 标志 */) r* w- u2 F% H9 o! f
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));' e- m# K) u: k0 S- |
  57. ) J) c; K4 C1 }( f8 G9 E; D$ ^
  58.         /*  ADC1 常规软件启动转换 */  ) Z% u7 I. j( Z, k* b
  59.         ADC_StartOfConversion(ADC1);
    % ~  O# b  |# d# W5 _/ }/ h
  60.         8 l: W9 z& r2 N5 D; t6 j  A; H) G+ Q
  61. }
复制代码

2 t( S+ o7 t. l$ i# w9 ~$ _$ Z# Q+ \5 {2 Z

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
/**+ |6 y! N, V, G7 q" f
  * @brief  Configures the ADC clock (ADCCLK).
6 m, J: r- U; G6 E' U+ P$ E  * @note   This function is obsolete.- d: d3 p6 `  N7 l# n7 M' I
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
& Q7 L" ?9 Y7 p# j" Q. n% }  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived 6 a' O4 @( e  `. p; s1 n" K
  *         from the HSI14 or APB clock (PCLK).3 ?1 D& y, r9 e3 |
  *          This parameter can be one of the following values:
! J' N( s+ U+ ^2 Q% I( l& F; g  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz); i$ l/ Z  F5 C( ?0 T5 o: m
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2( Y5 F: W& q7 \( \# r  B/ C, {
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
  U7 T6 U( g$ c  |6 a  * @retval None* x$ ^: {0 l8 g% Z0 k' ]
  */2 f# c$ t$ m& _! j$ m0 w
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
. K3 C/ O6 Q9 R  [7 m3 Z6 [此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

6 O/ ], C) T# z& s! I- q. Z: r* wvoid ADC1_Mode_Init(void)
, ^! l+ a& a- Y  _2 w! m{& `, T$ r1 p- i) Y- s7 n
    ADC_InitTypeDef     ADC_InitStructure;
, i9 o/ x& f* i. T4 D$ A% T
) ~: h' P6 ?# ]9 y" L    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
) w" o. u6 K" `; v2 k3 Y, d% Y    RCC_ADCCLKConfig(RCC_HCLK_Div4);
7 h. x/ P1 o1 d: c/ g* g0 M    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);# X; J) P0 U0 \, _. A% q

( Z3 `- `) r* ?# Q0 P: [: v! t% M  k
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
) I- N: I& l1 ^0 g! ^; W$ P8 J7 }7 U5 J" i) J! ^) v8 |4 d# k
另采集数据全0,还没看那里的问题..
  M  j; p# {) {, L, v- ]. P4 Z9 v
. y' [. g, N. K3 P3 q
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42$ ^! R8 v3 t: O  |
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
4 y& i+ B" q) F. s/ L3 Q/ T
滤波显然会影响速度的吧?  j% f7 |8 F. V
滤波之后还能有多少bit?3 Q) U( D# C+ P
你现在是内基准还是外基准?! \2 O4 b5 W1 ^
内部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+ a5 T" D6 d* }4 [+ b
谢谢分享

# G6 I" ?! Z1 Q' j" D/ X能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01+ J0 e4 V4 d, ~9 }5 {1 g3 }& N3 f
多谢 分享
* \, A; a2 J, `9 v
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?$ b0 _% ]2 \  m% N7 [4 @  ]
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55$ i/ J; Y  U6 V
数据从哪里读取呢?要不要使用中断呢?
+ F, _. V3 e5 a+ T8 q, F
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:562 ~1 H0 E, m* A
谢谢
! o4 z3 k' t# T8 P" {; M
多谢版主支持
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 手机版