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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下) X3 X: P+ \4 r9 l  }' \8 j' a

- \  x; g7 c+ W0 w, k0 F
  1. /**9 M6 k6 o; l2 J) d2 `, I& N
  2.   * @brief  配置ADC1的工作模式* F# |  o% a  @! \, \7 t# q
  3.   * @param  无
    4 Q+ }3 v  L' r' b
  4.   * @retval 无# @3 ^  I* i* v6 [7 e0 a& x( D
  5.   */& O! D# p( E; z/ I1 q5 z5 r2 _2 U
  6. static void ADC1_Mode_Init(void): V! J) q6 h; {6 p" |6 S
  7. {
      m+ v% G* Y: O' ~
  8.         ADC_InitTypeDef     ADC_InitStructure;9 ~0 c; x. y  o$ q4 @

  9. 7 }: S. w$ r; @3 {6 q
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/- ]/ X$ X* A* S9 V
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    ' D' B) @+ K. z+ ?! A& y4 X6 S
  12. # `' _6 ~- [0 v; Q* t8 i& B
  13.         /* ADC1 Periph clock enable */0 n) E7 E4 M2 ^2 |7 `' M
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    * }7 ]* T! w6 J  B
  15.   S# I) x; x3 S" S8 h% S
  16.         /* ADC1 DeInit */  ( g: S/ ~/ s5 Y
  17.         ADC_DeInit(ADC1);0 W& U9 ?: M, N/ @, |
  18.         
    & d0 o3 M# l/ b4 O( [2 U
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/
    + c4 i7 t# c# h& u% u2 y
  20.         ADC_StructInit(&ADC_InitStructure);                        
    2 q8 ~0 Y& C9 z- r

  21. 6 j7 W# z/ J+ _& Y) m$ k" d
  22.         /*配置ADC分辨率为12位*/
    0 T' n- g: F( o5 e! x
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;: Y- U% v# k, o8 M
  24. 0 a' d+ b, [8 A$ f5 b6 i
  25.         /*开启连续转换*/
    8 ?& S! A2 s% G: @( t1 g' I
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    5 F: I# P: x- r( V4 `9 k
  27. ! L- g( b7 W( ?, S! D
  28.         /*禁止触发检测,使用软件触发*/- w+ U/ A+ U! n) H2 B
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ) C9 e1 z) t6 M1 X$ `8 Z: e8 v

  30.   Z% O) ~' {* P0 d6 h
  31.         /*ADC采集数据右对齐*/5 k) I! y, m$ ~1 P$ z
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/ r1 |, X1 L9 m9 _
  33. - _+ B! R, l) }
  34.         /*向上扫描*/
    , m3 E) F9 m8 d
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;+ D8 Y; Z* |; j: `9 Q0 g7 R
  36.   d; q5 H8 e+ w0 n: J  ~
  37.         /*ADC初始化*/
    * c5 a$ `3 @# q# k5 K+ @' {
  38.         ADC_Init(ADC1, &ADC_InitStructure);
    ; G) U) i" K% G8 @  A7 K
  39.                               
    - Q. b( o) F0 B. _2 I! @/ F8 t, K- G1 L" u
  40.         /*配置采样通道及时间*/
    ! r+ {% @" r6 F8 C
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); * |6 c3 l' j# ^3 Y: q+ A% k" @
  42. - w' J) f+ |8 W/ W
  43.         /* ADC 校准 */+ ~  _. K6 T: L: P: ^1 @8 o
  44.         ADC_GetCalibrationFactor(ADC1);
    6 T1 F6 W1 C1 K

  45. & G& r% }( T0 G( t
  46.         /* 循环模式下的 ADC DMA 请求 */
    4 a# T7 o) C4 u
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);( N$ U" J$ Z3 Z' L" s' v

  48. " ~7 j! `: Q3 X  h$ D6 b1 i/ F
  49.         /* 使能 ADC_DMA */
    ( X! ^' c8 l1 V/ `2 O( V
  50.         ADC_DMACmd(ADC1, ENABLE);  / ?( ?0 H& c" r$ ?. L! f! d# g1 v

  51. , M6 x4 l+ L; h* }7 h+ ]1 X
  52.         /* 使能 ADC1 */
    1 R% ^  M0 Q9 i3 R0 B
  53.         ADC_Cmd(ADC1, ENABLE);     ( ^$ Y( a4 g" N# R8 O  V
  54. $ ~8 a$ e% n  ^7 M) s  k, g
  55.         /* 等待 ADCEN 标志 */" Y: J$ k0 J  Y# a" S
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));  F; J3 ^! J8 L$ |& n: N5 R

  57. ! v+ v. ~  ~* N' s6 @
  58.         /*  ADC1 常规软件启动转换 */  
    ( s  E1 g6 g% q' p# M- Y+ w! ^
  59.         ADC_StartOfConversion(ADC1);8 V8 B! R( y) q: K, n' D
  60.         % _4 C4 r/ D. B6 k3 n6 s
  61. }
复制代码
8 v( g- _# y. y9 H3 y/ b9 E4 f1 q

' \/ ^4 V8 }+ }0 [# `

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
/**
. }4 @! C# ?1 E2 Y' @  * @brief  Configures the ADC clock (ADCCLK).1 ~6 g' j# ]/ b/ y& e& h
  * @note   This function is obsolete./ |4 q0 m3 p! a' H1 ~
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
* J6 y% h. V4 C* z8 Z  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived . M; I9 A9 Y4 ]+ e( p- V/ @' E' ?
  *         from the HSI14 or APB clock (PCLK).
3 F# h* V4 P% C0 K' \4 h  *          This parameter can be one of the following values:; _0 d$ |( f4 r# v4 ~" ^2 e1 T# _" c
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
1 Q2 u# K( ^4 A, |  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
4 J- v# M5 d* D; c, }4 f  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
. s* _* N4 X/ T8 [  * @retval None- h. ^2 l* e( ?
  */# P5 j6 p3 {; V5 M% ~+ b
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
% m; w. b' S2 L) d* Y此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

/ N, v. ?* z/ ?7 g7 Avoid ADC1_Mode_Init(void)3 O  C* \8 c; J# K5 K
{$ O. f1 W; u/ d3 y
    ADC_InitTypeDef     ADC_InitStructure;
2 s1 Y2 W* H9 U; V9 d4 x
3 \" e, r+ K* J. T1 s    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/9 p. S! s4 r1 d7 y7 f4 |% ?
   RCC_ADCCLKConfig(RCC_HCLK_Div4);
: f0 T7 e2 H8 N# [2 {. [. t. @    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
6 O5 U, ~( u( Q
. p% k) c  i( T# W) y4 S" i* L
/ ~- o( {& E( D2 ]" d1 }源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.9 d9 K8 e& m+ e6 G

4 }# L9 ~6 l5 {8 N, g" E7 d7 S另采集数据全0,还没看那里的问题../ V6 s" R4 r  `. m

2 _% i1 f0 q9 {$ B
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42
* [: |7 G7 J8 e% U4 `stm32ADC飘得还是比较严重,不过加了滤波算法后还好

4 W6 b0 \1 ~# t  S+ Z2 M滤波显然会影响速度的吧?) y. H, _, Q3 m& G
滤波之后还能有多少bit?
8 a0 N+ c( M' A8 Z/ R# X/ p你现在是内基准还是外基准?* y& d7 u$ b5 C' w, H# {/ i
内部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$ x! }5 e; w. t+ j) u7 i
谢谢分享
9 }' X: C# R4 z" ]0 l2 M
能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:014 }! Q- U* E# S1 w8 M
多谢 分享
* j/ B) n# J  C2 A
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?: A) C2 r1 w6 B/ L! l% j% b$ X4 t$ w. [
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
8 s' u  j2 {5 l数据从哪里读取呢?要不要使用中断呢?
+ |: e& \9 o: P2 c3 a: N* v) o. c2 T) q$ F- u
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:567 d9 l5 c& w6 m3 I7 C. z8 {& ?
谢谢
/ f4 c% I6 o% e4 ~: ]+ ]
多谢版主支持
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 手机版