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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
% B" s7 {$ E( y* j: o6 H8 p6 W+ k* |' R* L0 j5 ^1 P
  1. /**
    + ^) j9 H7 u/ p' K- E, y
  2.   * @brief  配置ADC1的工作模式
    / A0 C0 k' x4 q! T: ^  ?
  3.   * @param  无, e3 I5 {: X% H
  4.   * @retval 无
    : w+ H" ~# h& D1 q
  5.   */
    9 X1 y9 c. u8 t% E+ t+ f0 h* R$ H
  6. static void ADC1_Mode_Init(void)
    - u, s$ M* R; F  m5 I% `
  7. {. L& L% J. z* ~6 Z
  8.         ADC_InitTypeDef     ADC_InitStructure;9 p0 D. z; j9 h1 ~3 u

  9. . x0 v7 l' x# K7 t5 m
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/3 u( c- q: U+ q" r8 g- p
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
      F' W8 A( G* [4 j' `0 p4 T

  12. , _) Z9 V5 N" ]5 i4 n) d# i3 j
  13.         /* ADC1 Periph clock enable */8 U; S2 T& H- C$ E$ P9 U5 B+ C
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);; X" A4 @% J/ c0 ]: k5 q
  15. + g3 s1 X: h1 {9 {' ]9 b
  16.         /* ADC1 DeInit */  ) K8 X* ]6 \6 Y* {, T
  17.         ADC_DeInit(ADC1);: J  R  O6 y7 o% L  R3 V1 n
  18.         
    , }3 Q% c  O1 A( ~
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/$ e* b4 s$ r; }. i% a+ D/ f3 D
  20.         ADC_StructInit(&ADC_InitStructure);                        
    & v$ @9 h# a9 b  g3 ^6 _

  21. 0 Q+ ?" f. Q: x+ P3 r( Z. R
  22.         /*配置ADC分辨率为12位*/% \/ Z* C* o& S/ w
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    7 Q! k/ G3 J# r, a5 f% u
  24. # @' W/ T( K- [4 T; u
  25.         /*开启连续转换*/
    " \4 D  `; y* @' T* N1 |
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; # j; K$ ^$ [+ T8 C) ]

  27. * r6 Q2 Y- }- B" {0 f+ a
  28.         /*禁止触发检测,使用软件触发*/6 j% h% z6 z7 b+ t  _# x/ r" u9 @
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;/ j( A, _8 ~5 T1 _3 Y

  30. + p3 r/ \. C! Q6 E/ m$ _+ g
  31.         /*ADC采集数据右对齐*/
    $ H4 M& D/ o( v( V0 e
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;8 {! c7 |0 z! l5 t0 X, I; U

  33. 1 H2 i9 ^2 r4 Y
  34.         /*向上扫描*/
    4 D( u- [% q4 m) }! d# |7 q5 a9 d
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;3 N8 c- o4 `3 v8 G7 l
  36. ' W, A) S$ T% L: f+ B) P4 R' ^
  37.         /*ADC初始化*/
    3 D: H: B2 B. r
  38.         ADC_Init(ADC1, &ADC_InitStructure); 4 h' x( x0 W6 D2 m9 R. J
  39.                               
    ; C* |1 k2 w2 t
  40.         /*配置采样通道及时间*/
    % G4 _+ D" O0 O0 x
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); 2 D& l+ ?8 Q& M! P
  42. ' z  y( U' U/ w8 p* b
  43.         /* ADC 校准 */2 b9 a( }. y- J
  44.         ADC_GetCalibrationFactor(ADC1);
    % q# S& j9 n+ `! M6 _
  45. & S) ^" p- i! [! H& B
  46.         /* 循环模式下的 ADC DMA 请求 */' D! c; K0 j8 }
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    , v9 s5 Q5 }6 G; s3 z( w, E
  48. 3 y, `+ s, T$ X, u/ X
  49.         /* 使能 ADC_DMA */
    2 x1 v' ^2 k/ M3 H* J( W
  50.         ADC_DMACmd(ADC1, ENABLE);  / `% S2 }8 K" I

  51. " R/ [( p* |+ ^
  52.         /* 使能 ADC1 */
    / C0 x; T  @! B* j2 t, _
  53.         ADC_Cmd(ADC1, ENABLE);     9 [- ?% T3 C! n! u: ?

  54. $ H8 [) ]! w% _' h( g% ?% u
  55.         /* 等待 ADCEN 标志 */
      o9 V' D$ @7 T: U# l6 v: G$ w
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));  d+ T7 x- O: T6 h
  57. 6 ]+ B* B7 {) |9 }
  58.         /*  ADC1 常规软件启动转换 */  
    6 W- L+ i5 v3 Z+ \; o# K8 z) z
  59.         ADC_StartOfConversion(ADC1);, h% t/ `8 _' j8 X) m* k: S% ~: o
  60.         
    ' D4 n; F, b: J" N4 Q
  61. }
复制代码
2 ]% w" j" P) Q. n9 y4 m# @
8 P+ M  p, L( ~

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2798

评分

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

查看全部评分

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

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**
8 Z+ @$ n& O; b0 R6 R' |" W  * @brief  Configures the ADC clock (ADCCLK)." f! D3 [+ B7 ~$ _9 T' V' u
  * @note   This function is obsolete.
  u1 E6 I/ n* n4 L7 |3 P  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver1 I3 o% C2 \! q7 x9 H% w0 Q
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived / W6 j3 v5 h7 q) a
  *         from the HSI14 or APB clock (PCLK).
7 _( F  w& q! p/ d4 B: n$ X: }+ W  *          This parameter can be one of the following values:
4 }: _# {2 d  {9 n/ I6 _7 `4 f  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
2 A( g& F* {0 \  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2. U1 s# q  z/ f* j% u% ]' l
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
8 `' a8 |' U7 Y& Y: u, i  * @retval None( S9 q9 l( O$ E* N9 M/ F; T& {1 k
  */
  B& J/ \1 Z8 v3 I4 K0 fvoid RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
% f" [% O0 S; Z7 `3 h此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49
5 Q: O; S" P  u
void ADC1_Mode_Init(void)
1 G" K# [6 T/ y2 l1 X) ]{5 Q; f( d" b" J8 }1 G
    ADC_InitTypeDef     ADC_InitStructure;
( J1 A( H  T7 f+ }  T" M2 b& o3 p! f2 W4 x  I- [# X) I
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
$ _! G. ~( X- ]4 I8 P    RCC_ADCCLKConfig(RCC_HCLK_Div4);
% W: A% k4 ?2 i7 R1 |    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);7 L, |2 X+ e8 s& n$ s" m0 |7 r

4 f6 n6 Q0 _, U% A
7 O: k! g) _4 j; j源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.0 S! C4 ]' i/ [2 e, U! X9 l
# [' K) n' C( t" @  g; H
另采集数据全0,还没看那里的问题..
8 L. b6 G: ?9 l8 c* i$ F. k' Q- M2 N" U
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:427 [9 f0 N" X2 K% C9 d
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
" \' o3 G" }- D$ [1 ?
滤波显然会影响速度的吧?
8 z6 \$ s4 Z! Z7 t( _9 a/ m2 l3 c滤波之后还能有多少bit?
- G& u4 ?+ Q( E2 Q你现在是内基准还是外基准?0 K$ ?. Q& y/ [4 D8 G
内部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:422 I/ o% n/ q. S' N
谢谢分享
4 k' {0 ]- s. x1 {6 \/ L
能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01$ L: U9 ]' u$ k( @2 ]2 E6 x
多谢 分享
, h2 ?4 |# N% `* i( K7 Z& B& w
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?8 q  v% D0 Z7 e* P; i1 }& D. v! P
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
* x# ^3 G0 I0 ^" A数据从哪里读取呢?要不要使用中断呢?

9 V1 h; \/ \  I0 d5 i: E我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
* k9 ?- {+ v& o" t谢谢

6 D  O8 H+ e6 s9 X: C多谢版主支持
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 手机版