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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
% f" a; @' d3 ~' x/ }
& X; d2 k. Z# Z7 c) m0 o  M4 J" t
  1. /**7 S/ `+ s- c9 b  |, H0 u; P4 @. _
  2.   * @brief  配置ADC1的工作模式# C, v- {, c3 X# ?
  3.   * @param  无
    2 Z7 |2 Z( e3 \3 z7 [4 N
  4.   * @retval 无
    * J' y2 b5 O( r* W) }8 Z
  5.   */
    % z# h7 c( h( a; P( j" i- @7 N! e: d0 T
  6. static void ADC1_Mode_Init(void)  r& e" I/ }- k8 E4 |) k1 J. r7 @" x
  7. {" |# @! t8 h( O
  8.         ADC_InitTypeDef     ADC_InitStructure;6 h/ a% ~2 L; H% S+ v0 n! I  P0 c

  9. & [: Y# N1 N$ _" y
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/! j$ F: [  b5 e/ X0 T3 \
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    - i( G% J0 T- o' e$ y# l

  12. - h2 f5 U! s. B( j' b
  13.         /* ADC1 Periph clock enable */! ?! A  ~9 c: }; R8 e
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ) \* U9 R8 `% R  S1 x
  15. % g* e; G9 w; ?( B( o4 P% B
  16.         /* ADC1 DeInit */  $ e  y8 e5 }! J" L
  17.         ADC_DeInit(ADC1);
    ' t8 q0 Z5 z! e$ E, ?. G3 ~
  18.         
    % W" |5 C2 S$ J
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*// Q( d) j* ?9 Z" d
  20.         ADC_StructInit(&ADC_InitStructure);                        
    1 Q  t7 p: T8 a" u+ Z
  21. $ x9 n5 Y, q% B" j. C% ^# Q
  22.         /*配置ADC分辨率为12位*/" x! V: z3 u. M1 k1 F+ k
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ! J$ J2 R, ?3 X2 \  w0 e4 j* d
  24. . E* Q, A. {) l. b9 u0 ~
  25.         /*开启连续转换*/1 q1 k' S: y) ?2 j7 z0 z: x
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    7 k! W6 _+ D& e3 E5 G

  27. ) O& r8 e% }$ n& f7 r& r( ]
  28.         /*禁止触发检测,使用软件触发*/
    2 u- u' h2 N! L) O/ C& C2 o
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    8 F/ M5 M- C8 x( u9 H8 S

  30. 7 |, A% }4 r: O8 J+ V3 {6 j; P
  31.         /*ADC采集数据右对齐*/
    ! h' ]. f& A3 b
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;7 a2 ~6 M" g8 x) B# {% b5 u

  33. / F- q! o4 Y! \4 a6 `/ \+ e
  34.         /*向上扫描*/
    - t* J2 b* z# E
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    - P1 z$ @' H' M) v+ t2 c$ l; h" P/ c
  36. # q. `( i  ?2 n& {) H4 {
  37.         /*ADC初始化*/
    6 ~/ u2 f- M6 k& r3 u
  38.         ADC_Init(ADC1, &ADC_InitStructure); + k" X' ?5 b% j$ w
  39.                               ) c2 U5 s) p- ?2 `
  40.         /*配置采样通道及时间*/
    ( I6 V! x+ w; G  A# U* w
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    / c2 e/ }. C$ a: `1 l$ w. d

  42. + y: g5 W$ G3 M+ E7 B
  43.         /* ADC 校准 */
    # B* o; O/ `0 ^2 w; B3 H- E
  44.         ADC_GetCalibrationFactor(ADC1);
    3 z) k% `( L$ q% _1 W
  45. ; D+ J! ]! o) H, }0 b- o& G: Z
  46.         /* 循环模式下的 ADC DMA 请求 */. n6 y8 n' m. P1 {/ S$ ?
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);3 v$ O- \; W$ n  y
  48. 2 s' x& W: {4 m; u6 B* b( t
  49.         /* 使能 ADC_DMA */
    * G' Q- y: f  s: m: X
  50.         ADC_DMACmd(ADC1, ENABLE);    ?; F; K1 I- a5 ^* p

  51. $ Q: B/ p% {- _/ m
  52.         /* 使能 ADC1 */3 S( T5 ]% D. Y- ?5 B2 v
  53.         ADC_Cmd(ADC1, ENABLE);     4 a, p& W4 ~7 z! q' E
  54. * k  A: A% J5 [3 w0 }
  55.         /* 等待 ADCEN 标志 */5 c$ f& r, B6 N/ g0 s3 m
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));9 ^+ k8 E1 }" Q& M  y% i& a
  57. 0 x  P! W: ]2 V' H$ I
  58.         /*  ADC1 常规软件启动转换 */  4 S4 C/ L" m/ h8 C
  59.         ADC_StartOfConversion(ADC1);; d) |+ L) ?( }9 o7 W0 c- ~; r
  60.         ' v; @6 y# k( B2 j- s" E" I& Q
  61. }
复制代码

8 y7 q; X7 f8 l* ]  B; w% r% ~7 x: o  b- L

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
/**% g5 A/ k3 P; A- ?( H7 m
  * @brief  Configures the ADC clock (ADCCLK).
1 m6 Z1 d: I$ v* b3 b$ d  S  * @note   This function is obsolete.! g5 B9 @" R) M0 x
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
  p' q0 U7 R" G$ f  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived 2 _% q8 l) T, ~2 O/ i2 d# y
  *         from the HSI14 or APB clock (PCLK).6 ~4 C4 {: k5 O$ m
  *          This parameter can be one of the following values:
$ ~$ S, Q- ~! I  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)7 ~8 y3 M0 y) h0 D
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/25 Y8 j/ u0 j' _; |/ U
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
" s3 V* x8 s( g$ S$ ~; a  * @retval None
2 h. w) z/ F6 P& H  */
- L, s8 ~, T1 P/ [void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
3 N( A, V& n" g3 M( c8 ?2 m此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49
) l2 U5 a& s1 S! |7 k
void ADC1_Mode_Init(void)
: m& R5 U% T! S{
7 e% a1 v; b1 x    ADC_InitTypeDef     ADC_InitStructure;
8 s5 O+ v' T" T. f4 q1 G$ p0 P9 V  _5 h
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/# \8 x) b! E$ Z9 p+ O+ o& M5 R7 E
   RCC_ADCCLKConfig(RCC_HCLK_Div4);
$ K* v3 D7 X3 q* l, j+ q0 z: j    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
# ^) E# y- X) `# o9 V- C" H( Z! d- |4 P' L, s6 Y

5 {$ x9 l7 a( k* y. h2 n源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.5 n$ h: |5 E5 o- i
. }& Q) r# {3 ]; w
另采集数据全0,还没看那里的问题.., ]- k1 E5 O/ X! K

! G; T1 v% A; M' f! S+ X0 H  j
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:424 A( N) a  F5 j
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
$ ^* [: i/ _" X1 B% L! N
滤波显然会影响速度的吧?
0 }1 A% b  C! t; Y! ]. m% c& i. X滤波之后还能有多少bit?) m& \7 c- D& b; p$ ~
你现在是内基准还是外基准?
7 ], ?) z) S9 ]9 {. Q内部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
) h2 d. C+ C: I+ N9 k& e& a8 `, S谢谢分享

& P9 n2 O7 O, Y% e4 f' r% u( u能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01
7 y* @4 J( V4 S3 ]  p$ e多谢 分享
! y3 d$ p, s: w
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?; v) ~' m2 v! `% N0 {
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
& S0 ^0 s# _- c' |0 R5 i" p数据从哪里读取呢?要不要使用中断呢?

/ {4 s+ b$ S: T% w我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
2 H; r* F0 ]3 e( s* L谢谢
% O6 F8 R3 ]; ?
多谢版主支持
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 手机版