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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下0 J" p" p$ y. Q4 ?) R0 ~
! ?2 x. b/ \3 a7 n4 B
  1. /**
    : ]4 B  K* d/ i4 _
  2.   * @brief  配置ADC1的工作模式! J( G: l8 ^7 v. m
  3.   * @param  无3 X" T3 U# B& g" K* a1 ]
  4.   * @retval 无/ k6 |; N) m( W. N: f: Z( n. d* O
  5.   */
    / A* C/ c  w% T4 t
  6. static void ADC1_Mode_Init(void)
    + Q' G1 s' c. A; m# v' J' x- F2 z3 b
  7. {
    . ~. o- u5 \; @: B% S% I$ D! [
  8.         ADC_InitTypeDef     ADC_InitStructure;9 Y8 t  P# D2 @  E! N2 M8 k7 |
  9. 0 C3 C7 L* A+ _/ _
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
    $ [5 Q3 [- C7 H" ]
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        " J6 d7 w; s! o9 B

  12. " I  ^) N5 i7 T7 Q$ N5 w
  13.         /* ADC1 Periph clock enable */) y+ n" g5 ^# }* u  S! I$ T
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ; O, C# N- X0 F% V6 p
  15. , T" L% t* [& K) g) ?
  16.         /* ADC1 DeInit */  3 M, T+ N5 b! Y9 C* O& `
  17.         ADC_DeInit(ADC1);/ _8 F7 Y; R& o( T5 @8 |
  18.         
    9 N; y. j8 \+ {
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/! m) U. r. K" y/ z) t
  20.         ADC_StructInit(&ADC_InitStructure);                         8 m+ n5 z1 b1 G5 S
  21. 0 t  p3 x& I" J6 V* A. {  C
  22.         /*配置ADC分辨率为12位*/! K: D8 T2 J+ Z2 N. F
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;8 a6 @1 |8 }6 l
  24. 5 Q2 D4 f: A' E4 D# [. X5 X! `
  25.         /*开启连续转换*/6 Y# o1 \  `' m! B6 q* \, B' x3 r
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; / R  I$ u. q  M9 o* p; J  X

  27.   O3 f2 t% Q3 T, M, n+ A# p6 ]
  28.         /*禁止触发检测,使用软件触发*/2 {  x8 M" t( F  o, r3 v
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;" c& M* h2 q3 D5 X) U

  30. / n, n/ u3 e. @
  31.         /*ADC采集数据右对齐*/
    ! s- o) H* Y/ \4 V8 D4 |, g
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    & d3 N  n3 Y4 b5 b0 x4 [

  33. % N4 H0 ]( u7 F
  34.         /*向上扫描*/% X1 s7 @: o  I+ d2 o7 E
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    4 F$ u* A% E0 Z8 a1 A5 ?
  36. ( Q' D. K; @' A! L$ h
  37.         /*ADC初始化*/
    - e/ ^. m5 W4 u0 ]
  38.         ADC_Init(ADC1, &ADC_InitStructure); % S; g" E$ ~- u  }6 H: a
  39.                               
    ( b2 }% Z- Y6 F$ @: Y" ^
  40.         /*配置采样通道及时间*/) v) L' ^9 p7 m8 c! R0 c
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); ' C  h  H, b( x( N

  42. + M  W' z2 W3 [- r
  43.         /* ADC 校准 */  A; _+ `2 m; `* w
  44.         ADC_GetCalibrationFactor(ADC1);
    ) F  b# ?4 c+ s
  45. 8 U! c% t# [( o0 u, S
  46.         /* 循环模式下的 ADC DMA 请求 */4 w9 ^2 l( J9 g6 i/ r2 ^& a  K8 d  g. }, d
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    : w& b5 U& F- H: ^; [: n/ j

  48. ! a: L- J( D$ E- X9 Z2 H
  49.         /* 使能 ADC_DMA */
    # E5 n" o% P4 H- a) i8 q( U
  50.         ADC_DMACmd(ADC1, ENABLE);  9 G# A9 I* }3 _( w0 ~$ D% ~$ m$ ]# E, k

  51. 6 i& _! C, T5 z3 }3 _, v  ~
  52.         /* 使能 ADC1 */* M8 X' N; ]* h1 w% }
  53.         ADC_Cmd(ADC1, ENABLE);     5 H$ K! q3 p. J
  54. / s; f1 E& D7 D9 K' u& P
  55.         /* 等待 ADCEN 标志 */5 P, v( }3 e+ I5 j# @* o& j
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    " s" I8 g- t# p2 T1 \' |0 }

  57. , P5 o7 j, f$ }) L% A6 F% V8 l
  58.         /*  ADC1 常规软件启动转换 */  
    ) h3 J! z# }. G
  59.         ADC_StartOfConversion(ADC1);
    ! g2 {  s1 S: g
  60.         - ]4 b* g$ \# S3 c, T) {8 u
  61. }
复制代码

* {7 l7 V3 o2 |! T! t8 D' b7 \. R: l' X/ Z

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2802

评分

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

查看全部评分

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

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**7 l; |* B) _0 s
  * @brief  Configures the ADC clock (ADCCLK).
2 t7 J4 Y0 N& l# \  * @note   This function is obsolete.4 U5 K6 k  N: Y; M0 B
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver9 \' T' X  W0 F
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
6 p, f9 }) P0 N$ m. w  *         from the HSI14 or APB clock (PCLK).
1 S: f3 s. v7 \  *          This parameter can be one of the following values:
$ ~0 z$ u& _1 x; ]4 A, X" c) c  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)% S4 ]- x# ^3 J8 g% ]8 M: J2 E
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2( r) G6 |1 I8 W$ \3 S" R
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
1 e9 w- m4 I/ s1 x  * @retval None% O8 G/ r2 Y* l: ^/ ?# s+ z! b% I
  */) |# B: h% Z; d; e8 n8 U; t
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
- `, a( e8 `/ ~" a此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

' E7 i* Y" O: _. A- t' ^/ |void ADC1_Mode_Init(void)$ Q0 @- Y$ ^3 F1 L9 `- T9 Y- e
{
1 g4 Q! w1 j! Y+ u7 ^  f9 Z6 v! H    ADC_InitTypeDef     ADC_InitStructure;8 t& S! R$ D' z
1 \- ^- b$ ?/ R
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/( z. H9 C; B( S5 D1 N/ Z3 [
   RCC_ADCCLKConfig(RCC_HCLK_Div4);
% n% d1 t! z, S. g' d    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);! G) X' s8 i0 s6 }% P1 w- _/ J$ t
$ q& G) y& U- R" W( l

$ {7 r8 `- }5 h( E0 V9 T源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
& E& a1 b# g: Q( x5 ~
# o% N& t& F$ @1 M另采集数据全0,还没看那里的问题..6 I, w! F' s( A" K3 E# J
/ R" h# p- H" q' {0 R1 ~+ x4 y
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42; o+ y' G' e" z, k. ?
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
6 t5 P! z3 P* e. l- j  J* N
滤波显然会影响速度的吧?
/ t! \  c# e: A滤波之后还能有多少bit?, u. F# |! M$ l* m
你现在是内基准还是外基准?
: V2 p+ I2 i; \) A1 X& G' Y4 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" T4 Y1 S" \4 M$ J" E- S/ c
谢谢分享
% W" u! W+ C- j; k; \
能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01( i' ]5 X7 N* |* T3 v
多谢 分享
5 e# A* d/ J: h2 z4 f3 q# t5 N
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
( S& n1 s) p/ ^: m* ~, o% k) s( s
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55% [- n% n7 H* g! Z
数据从哪里读取呢?要不要使用中断呢?

8 f! K4 u9 ?# D8 [( X9 Q我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56( b: [& y6 D% v$ H
谢谢

$ _! k1 z/ E0 i# s9 ]1 T多谢版主支持
Tcreat 回答时间:2015-1-13 09:40:48
不错学习学习 支持
kevin0129 回答时间:2015-1-13 09:51:56
楼主这注释写的很详细啊,很适合新手入门!
xuwu_19911119 回答时间:2015-1-13 10:04:14
今天晚上试试看,昨天晚上没有搞定呀。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版