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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下, [( q: ~/ h7 ^

) y4 h4 N' [) ~  M
  1. /**
    5 W" N+ K) G' T" E: F5 S2 S
  2.   * @brief  配置ADC1的工作模式1 ~- s8 R' L% h. ^
  3.   * @param  无
    ) Z' L3 p) H3 r4 O; ~" I
  4.   * @retval 无
    " d3 @+ B7 Q+ b) m" Z
  5.   */
    2 R, R% g9 K  ?8 n
  6. static void ADC1_Mode_Init(void)
    1 ?- J& o2 M( |9 j$ u0 J+ \' d
  7. {
    ) O7 ^  E, {! o
  8.         ADC_InitTypeDef     ADC_InitStructure;. s, J& Q( b& ?  {3 M/ {$ {% z

  9. ' N2 g# I& m% T( l! {6 Q# p. a! L! U
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/3 b# ~' a. Y  d: V# L+ \' _) Y
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    2 p6 f2 b! [2 Y) G, o- G

  12.   n* D; Q6 z" V2 h4 {+ n, k
  13.         /* ADC1 Periph clock enable */
    & K4 W3 h; O$ B6 L: `
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);7 l2 \4 Z5 B4 j+ `4 ], g8 B
  15. ) l9 v) [. ^# e9 F9 }3 L! [
  16.         /* ADC1 DeInit */  * A% u! {$ `5 [  z6 B
  17.         ADC_DeInit(ADC1);
    - a2 [2 e1 r1 ~7 J) \& s
  18.         6 F8 s% S# V/ N! P0 X3 v3 Q
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/
    . T: l0 }, K) B& f# ?
  20.         ADC_StructInit(&ADC_InitStructure);                        
    & Z# q! U5 e) b& J7 q/ j
  21. 7 \4 |+ J% J( u- F( ^2 j
  22.         /*配置ADC分辨率为12位*/3 U$ q) i$ `( j; u
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    , F0 s6 k5 R/ S2 D0 {  K" c
  24. - m4 d& }: g7 S* {) @
  25.         /*开启连续转换*/" C1 a! T8 [" l+ m" S$ e  K& W
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    1 Z7 m  j& T& d2 s1 \8 ~

  27. 2 r5 |. O# |2 C) V7 v) e& e
  28.         /*禁止触发检测,使用软件触发*/5 y8 Z. S  `4 A
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    1 c# n$ f" j' {$ q- F

  30. - j# j5 @0 @( i/ n8 E! X' M& X
  31.         /*ADC采集数据右对齐*/! n' M! Y* f  u" f
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;* d' M5 {& V9 D( u, C# K- u4 u
  33. 9 [% V. e' u' d4 ^% G7 U4 k
  34.         /*向上扫描*/
    & f8 ~$ M0 O1 T+ k4 A9 @
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
      u6 H" }9 Y6 Y- P9 Q

  36. 9 x- x0 {4 n" g% p9 g
  37.         /*ADC初始化*/: i5 _! B! |( s+ Z
  38.         ADC_Init(ADC1, &ADC_InitStructure); 1 G" d0 L  d! l
  39.                               
    7 r" B+ v' d' Z# q" ]2 [
  40.         /*配置采样通道及时间*/* p* t+ D; I" O
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    ( l7 X& q9 e7 f8 u
  42. 1 l" [1 d3 ~' E. o
  43.         /* ADC 校准 */' m- z  A5 e: ^" K& _
  44.         ADC_GetCalibrationFactor(ADC1);8 D! n$ i! }% R
  45. ' D+ M; P& B- ^9 V- l( H
  46.         /* 循环模式下的 ADC DMA 请求 */
    ) k8 X4 f  C5 @+ j
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    # w4 s) V( o* O+ \# Z/ o

  48. : `  m* H. ~, s1 v: o
  49.         /* 使能 ADC_DMA */: R' V' t( b1 I% O! Z
  50.         ADC_DMACmd(ADC1, ENABLE);  
    3 }# V' m3 ]" k# b: |2 _

  51. # {9 g  w1 ]8 k# Y  b
  52.         /* 使能 ADC1 */* a2 k4 N4 M; F8 P& y6 Z9 [
  53.         ADC_Cmd(ADC1, ENABLE);     
    6 z" ~3 k0 Z0 I, T% r( c% \" t
  54. " P9 S# V, m8 }( c0 O' `0 g
  55.         /* 等待 ADCEN 标志 */
    . g+ n) L# m) M! k/ k
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    2 A# q7 c' k5 @; ?% o
  57. - o  {9 d2 t% |( o, H  b
  58.         /*  ADC1 常规软件启动转换 */  ) J8 q/ l) k  \8 c
  59.         ADC_StartOfConversion(ADC1);
    ; J) }4 z& W- R% @( h" B+ L
  60.         
    % B1 \, W( A( |8 \5 c7 T3 g1 o/ L  V3 J5 s
  61. }
复制代码

, C; ]$ y. w  D  |3 n) X, @
5 N! @& E" o: i( 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
/**
; V' `7 z! t# k2 r9 s, g) M/ D  * @brief  Configures the ADC clock (ADCCLK).3 H$ G# L: ~% g. {' x% y" m' R2 C
  * @note   This function is obsolete.
0 V7 j. I+ [0 _, y0 f  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver7 O3 C. v" g1 E) ^" Q7 J' Z  r/ d8 z
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived 1 m, G# R0 x% x4 C1 }( \! E
  *         from the HSI14 or APB clock (PCLK).
$ S' M9 ]2 w4 G0 b  *          This parameter can be one of the following values:0 @$ b- N5 \, f) ]
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)- L+ |) a/ [  i( s. d$ G
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
5 C( d" E3 h" M  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
7 E5 t4 m4 ?6 c. A8 j  * @retval None
$ e& Q' Z1 P' Q& C( K5 H9 A  */
( d3 E9 ~6 v5 @6 J+ p" ~void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
" g4 a) k3 E# ~0 ^4 {# V此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49
, L  a( e; [, r" d8 T6 T
void ADC1_Mode_Init(void)
! d) _6 m# }! Y{
0 g+ M0 l. K; o/ B7 |5 c    ADC_InitTypeDef     ADC_InitStructure;# _9 k# T2 D- X$ |) A1 {" F& g

7 W9 b5 l% ^5 q6 l& t    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
# {; L7 b0 W# T; l    RCC_ADCCLKConfig(RCC_HCLK_Div4);
3 d# P" V" r! {6 c. z/ A    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
/ @, H6 X% A! L3 ?: F3 L$ O, ?0 \# p3 q- v: ~+ R

9 Y$ u2 C( A" B源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.0 k9 q3 E8 G# T, o" |2 {7 h
! J  D! l9 ?. e# _) X
另采集数据全0,还没看那里的问题..
( b, }; X7 n5 Q- ?2 h
4 n7 v% p  o3 O3 Z7 N9 h- m
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:422 H" V# ~* H5 w2 K
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
! J! c3 \0 T( U+ w+ r, b; A
滤波显然会影响速度的吧?7 i# M! l% l' M" Y0 P* p
滤波之后还能有多少bit?) L# n2 U( n, {; s
你现在是内基准还是外基准?
& _* r3 @# V8 t% O* L内部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
+ n. J2 S0 M# Y2 |* h谢谢分享
5 K" s& T! m/ Z3 s& O3 I. H: C! R/ v
能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01+ C4 X5 L0 b! p- p5 M6 |
多谢 分享
6 ?, q) E: {; }4 \) n
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
7 @9 F) d2 o( M7 |+ K' Y3 V$ z8 y8 M- Q
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:553 L; z6 }' N% |) t6 \9 I; |
数据从哪里读取呢?要不要使用中断呢?

6 ?' x6 H% `" g2 C6 K# A我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56& U% u3 h$ L: L* z5 ?& m+ M  H5 V
谢谢
6 B* ~, @" @0 y
多谢版主支持
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 手机版