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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
5 [$ D6 L: G: d2 o! b. y! Q! I! _4 \7 D8 |
  1. /**
    % O* |% D9 x# y0 ?; R: o% S1 \- x; Z6 r( a
  2.   * @brief  配置ADC1的工作模式7 b' z* `; j+ t# Y2 U
  3.   * @param  无& w& w# c3 X6 m6 m
  4.   * @retval 无
    0 d! }' k. I& Q5 E5 b9 o
  5.   */
    ) u: Q4 _) f$ S1 T9 w4 z" Q; t
  6. static void ADC1_Mode_Init(void)
      Z3 _: B' `8 d5 V* v( R' \- a- B
  7. {* X4 `5 J- N5 f6 S9 [
  8.         ADC_InitTypeDef     ADC_InitStructure;
    2 {' \, k3 G: _( ]0 e
  9. 1 p. S" e& ?& R) A: V# J3 n
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/3 C0 D: a' W  D  j# e
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    ' q& h+ F/ D9 u( n, p2 s

  12. 4 ^* Y; s( X' I; q2 i. l: T
  13.         /* ADC1 Periph clock enable */
    8 l% x/ E2 `3 |( q+ b& w
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);% _' A  n- G: d

  15. / I8 K. x4 o' F' m& n
  16.         /* ADC1 DeInit */  
    1 ?; J- B6 G$ _  X4 l: u
  17.         ADC_DeInit(ADC1);0 x- N9 y$ C2 W) ]3 K. ?$ u% e2 A. W
  18.         
    5 I% B' Z  u. @: `! u
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/) e; Z! [4 [& ?( d( d
  20.         ADC_StructInit(&ADC_InitStructure);                        
    ; f, s- s) i  r  [; W
  21. 3 w( R+ I$ S4 D/ M+ ^( f
  22.         /*配置ADC分辨率为12位*/9 H1 C1 M. P) w2 |
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;; K4 J2 @5 i+ D* [5 L

  24. 8 f0 |2 n9 K, Y1 B! [# Q( p4 M
  25.         /*开启连续转换*/
    1 P2 R' W7 h  |, o9 O1 F6 e
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    / a) x: R' L5 m" [/ L
  27. 4 Z% w0 P" g/ ?; h8 S1 ^3 ^
  28.         /*禁止触发检测,使用软件触发*/
    - v! ?" ^5 d( Z: F- W1 D
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    $ }& `. y$ J: f% T
  30. 5 |  l2 r& }5 j& d- p! c  y
  31.         /*ADC采集数据右对齐*/
    7 l: U& c# e% |6 Z- C! c% m
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ) f( z+ N7 t& ~

  33. 1 i4 C) h0 `9 U" {' A) j
  34.         /*向上扫描*/8 \1 Y* O% b1 F, c- N( B
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    ( I8 E) a) y9 }  t

  36. 9 |+ v' r6 w% K! |7 }# m9 V" D
  37.         /*ADC初始化*/
      j& A; E8 o/ E. C' A6 K$ U; ]
  38.         ADC_Init(ADC1, &ADC_InitStructure);
    $ S; N/ ?# M3 l
  39.                               
    5 m# c7 Q8 ~$ @/ s- |6 C
  40.         /*配置采样通道及时间*/# b! Q( L2 i/ k1 C1 u1 h* E" y
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    % T+ g" A' j* W7 h
  42. ; V8 N" I3 ?8 V! P
  43.         /* ADC 校准 */
    , I* M, b" r: M1 ]! {! a1 C, `7 g
  44.         ADC_GetCalibrationFactor(ADC1);
    : i, O5 y$ h! c3 g& I  A/ K
  45. ' p. U. w% x  W% I, T- T1 X
  46.         /* 循环模式下的 ADC DMA 请求 */
    " n7 f& \$ q; W% y, D5 G& {
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);; b: ^/ ]- V! B  j- C

  48. & Z5 A7 l# i' A& w
  49.         /* 使能 ADC_DMA */8 {- }6 Z  _- G
  50.         ADC_DMACmd(ADC1, ENABLE);  / l$ ?* L5 A8 L2 e$ _7 I/ S1 q/ @
  51. + P( e2 e" ~- K2 b* g
  52.         /* 使能 ADC1 */
    - l& F, z! D, P; C" c: M
  53.         ADC_Cmd(ADC1, ENABLE);     3 J' I- r" W* }3 l, |

  54. 8 @4 X3 E8 H* a8 D+ A
  55.         /* 等待 ADCEN 标志 */# z+ a9 M0 e5 X" H
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    5 V( w2 I7 T4 @
  57. . {% ]. u9 R: o9 e5 t3 w5 K2 H" `% L" Z
  58.         /*  ADC1 常规软件启动转换 */  4 \' v: J# p3 u; d
  59.         ADC_StartOfConversion(ADC1);2 |- \9 Q" w* b! W6 Y
  60.         3 ]  \2 {0 `2 Y' ~- d
  61. }
复制代码

' t" ]; J: g" }- ?8 Q  U7 ~% \$ ^5 E  i7 f4 ^1 P

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2810

评分

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

查看全部评分

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

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**
6 T7 k. u% s# Y! \. }" p$ k6 [9 L  * @brief  Configures the ADC clock (ADCCLK).7 @; p* Z2 _& b; X: c4 I# u
  * @note   This function is obsolete., k1 G% j; Y8 y
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver& X/ d3 ~# c  {
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
( N  n0 @0 t3 P2 c4 ^, |# g, o* G  *         from the HSI14 or APB clock (PCLK).
" z( B1 e" h& P$ ^% F, g( w  *          This parameter can be one of the following values:
7 v; k0 k2 B: Y: `) M  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
3 c1 ]( }$ |5 O4 d9 k& p  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
9 T* i$ Y3 n6 i' [$ h9 P& ^, B  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
5 R4 J! l* j- E  * @retval None
& z" \8 ~# P0 ~0 x  */; Y. @1 L( ~  o2 W+ p3 F4 _
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)$ A, j9 E' W7 m- q9 E4 Y
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

1 l% A8 I+ x; b2 v5 z  W; P  F  }void ADC1_Mode_Init(void)0 O+ `, h' S5 f& B; [
{& V+ P& I, o- j1 c0 J5 C4 ]
    ADC_InitTypeDef     ADC_InitStructure;
! Z  O' o& U- v  J, P; B* W' M( d0 R% K; v+ S# K4 D% r
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
2 t# |( d+ z- C) o' r8 _. e1 ^    RCC_ADCCLKConfig(RCC_HCLK_Div4);$ d1 x& o& _* ^" r" k
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
5 Q- u5 M, a, _5 x* [+ Y
( o+ F9 a. b5 s
1 p/ \( a! H6 Y! {; b' [0 N$ p源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
* l, a, M* w9 g* D0 ~* u! d& v/ A2 ^% \1 \/ T
另采集数据全0,还没看那里的问题..; x4 [. @7 j% H  x# B3 H/ v5 i' X9 O
; N  m' D) Y7 I* R7 {) z( x
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42  W2 K& u! E* U0 y. E
stm32ADC飘得还是比较严重,不过加了滤波算法后还好

, N1 w$ q& l1 i/ ?; Z3 D- P滤波显然会影响速度的吧?
. j/ F) F, g5 c1 x; Q% h  X滤波之后还能有多少bit?
# s% N2 ^0 m5 n, j- s& M6 N" |; \你现在是内基准还是外基准?
6 V6 R) g0 ^" x7 X内部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
+ N4 \6 Z* g7 g7 r' z1 T! b谢谢分享

' L5 n* |/ p. m1 u$ ~能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:015 w& F" X3 M" ]- {; W& X
多谢 分享

( [* Q2 ^) Z% _3 T0 D4 C- Q) y能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?! ^; q' F3 Y/ T+ c
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
" h/ C- [1 z1 B3 I5 |! B/ o: k数据从哪里读取呢?要不要使用中断呢?

( G" A$ L8 G* _5 D6 R我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
' H/ u3 m6 E4 j5 U) c+ _谢谢
' y- E+ {; r: R/ b5 n
多谢版主支持
Tcreat 回答时间:2015-1-13 09:40:48
不错学习学习 支持
kevin0129 回答时间:2015-1-13 09:51:56
楼主这注释写的很详细啊,很适合新手入门!
xuwu_19911119 回答时间:2015-1-13 10:04:14
今天晚上试试看,昨天晚上没有搞定呀。

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版