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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
( f! Y+ k- h: b5 W8 g9 j/ M& i: }$ _6 G% W* F8 t/ q
  1. /**
    : }, ^4 Y1 p8 \
  2.   * @brief  配置ADC1的工作模式
    2 u. }, u$ [- O( H
  3.   * @param  无3 i7 \4 Y( i6 e5 ~/ g" @
  4.   * @retval 无
    , [7 @' i6 J, v- ?: a, j
  5.   */( U- T! ^+ @, ?; `
  6. static void ADC1_Mode_Init(void)
    + n) m3 K! {/ T/ b- r2 z) A
  7. {7 P" q  p( O* B% V1 a! I
  8.         ADC_InitTypeDef     ADC_InitStructure;* y3 s, l  h4 q; N

  9. $ I# x: W* O0 ]" d! w
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/* `4 _5 I% Q/ G. Z' q0 r1 o
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    ; P6 c2 c4 q# n: o2 V4 w- C& Z) c

  12. . N4 e/ w, y: c0 @
  13.         /* ADC1 Periph clock enable */
    # N. Z4 C' J" O+ o
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    8 Q8 G3 t: X  c. y- l6 q2 K9 N8 d

  15. 7 [# q9 `" C8 _$ f
  16.         /* ADC1 DeInit */  . }+ y8 K8 n1 q+ Y  _1 \. J0 J
  17.         ADC_DeInit(ADC1);
    ! {, B6 T) G3 K! r" k
  18.         
    ' R6 i" e9 \0 h* X
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/  ~' b6 A# [/ l! T1 q8 e# B
  20.         ADC_StructInit(&ADC_InitStructure);                        
    # |% G7 a4 a( ^; w- U$ v

  21. 2 s- s8 ?( Z: ]4 N  K
  22.         /*配置ADC分辨率为12位*/
    & B( R6 H) [9 k
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;, K* \$ r: }5 ^: `

  24. ! E6 N5 X2 n; U, W& f0 H* b
  25.         /*开启连续转换*/9 |  G( c) t' E( O$ ~+ l
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; * k6 ^. n$ u  O
  27. ; O5 L+ e) y. p' T" U/ R/ L
  28.         /*禁止触发检测,使用软件触发*/
    9 Q- t. `+ x' B6 v
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    " W! u/ x7 j3 \0 I# u: `6 @

  30. 7 e' [2 k; Z3 a0 D
  31.         /*ADC采集数据右对齐*/9 p  H- Q" [0 B3 G5 _) M6 C& A. q) D
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    1 a0 d9 ]# {% r8 d
  33. ' J1 {0 x+ I% v, Y, B9 @
  34.         /*向上扫描*/
    1 M- R& h  `3 L5 U8 h$ k1 A- O+ C
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;/ L1 R6 h4 u" I- r' l

  36. $ M! u; `: l& ~+ C, j% |
  37.         /*ADC初始化*/9 H; l8 v- n4 g/ @) P
  38.         ADC_Init(ADC1, &ADC_InitStructure); 3 [$ D! @9 U, m' \/ n
  39.                               $ ?# F5 J2 S# R1 ^6 Q6 D! ~5 n
  40.         /*配置采样通道及时间*/
    1 B: |4 t3 \# L# p) \: n5 R+ o
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    - ~1 Z* C' L) z

  42. , Q! E& t3 I* C* {& Q
  43.         /* ADC 校准 */1 B. |# R9 d/ f; K5 u# }: U* Q
  44.         ADC_GetCalibrationFactor(ADC1);
    ) \, G, g1 d, n6 G; ^6 z
  45. ' _+ M# `6 ~- T  ~) C9 o
  46.         /* 循环模式下的 ADC DMA 请求 */
    % W; [. K5 @9 s8 O
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    " Y: y7 ^+ ^$ ?5 e

  48.   q9 v3 x2 T6 G) v5 K
  49.         /* 使能 ADC_DMA */
    1 R$ W- ]' S1 y8 h
  50.         ADC_DMACmd(ADC1, ENABLE);  
    2 v. d* D: b% y% `* Z( V! |

  51. , y$ D5 X4 a9 v% d9 V
  52.         /* 使能 ADC1 */
    5 \% b. v9 `5 X8 p$ n
  53.         ADC_Cmd(ADC1, ENABLE);     
    / g$ b9 y  b! L" m3 K7 b

  54. 4 T6 s9 ~6 p# H8 ^5 ?
  55.         /* 等待 ADCEN 标志 */: \: M! h- p# U/ N
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));9 y5 c; L* c; S! l6 I
  57. 0 w6 K9 ~0 y+ u7 Z2 s
  58.         /*  ADC1 常规软件启动转换 */  
    - K& E! N. S; |0 M) V) c' C: A
  59.         ADC_StartOfConversion(ADC1);7 ~- S8 `8 @6 B
  60.         ' b; }" I! L  n
  61. }
复制代码
3 e5 ^, k; J8 k

0 O; d1 |9 u5 z" d2 r

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
/**
# i0 D" q8 ]: ]% }4 |& @  * @brief  Configures the ADC clock (ADCCLK)./ R2 e6 E, O+ x+ N3 X% s! R0 d: I
  * @note   This function is obsolete.
- D4 i3 P) E: V# S4 U  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
% t% I' T4 H, ]  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
0 y/ W- t  d6 H$ M; X# _3 j  *         from the HSI14 or APB clock (PCLK).
- M" k$ q: j! \# y  *          This parameter can be one of the following values:
+ d- g' h4 m; g) L7 Q9 G  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)( n; C" Q3 ~4 {2 n
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2, C# {5 r( F1 b4 P! T: F
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
8 D8 [+ E: F4 ~0 P( ~  * @retval None
, |! y9 @. G3 y# l  */
+ G. D6 m. e7 r# Q2 @: mvoid RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
/ X; Z4 l  ~# S5 o' Y( O! C/ @此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49
9 Y, x0 P: j: }4 C
void ADC1_Mode_Init(void)4 x4 ]5 P) @/ B
{; m$ o, x# W! a6 S: o
    ADC_InitTypeDef     ADC_InitStructure;
0 C1 g3 j# u, v/ l6 r! a/ N! G' H
) l* q3 S, b; g$ U  O+ z    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
3 S* y! l3 V* P% Q2 }    RCC_ADCCLKConfig(RCC_HCLK_Div4);
/ ~+ S9 U  N4 b2 s- q& t8 C' l$ L    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);. q; j: l4 |. h$ \1 T3 `4 `0 P

- \4 X4 F( c" Q" }% {+ U6 a0 q% _; y2 L. ?5 k* u
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.1 y. f6 S" A: I- T

; f' B  s5 ?9 _5 [! G" p1 z另采集数据全0,还没看那里的问题..& W9 L4 n# u  J: c) l& Z5 Z

/ O, Q  S* K8 Z% p$ w5 C# F/ C
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42) h4 Y2 a+ F1 q1 e
stm32ADC飘得还是比较严重,不过加了滤波算法后还好

- I' U7 G# b7 j, m' k滤波显然会影响速度的吧?6 E5 W2 p% T0 L! a# y. N( R
滤波之后还能有多少bit?4 P" q, x  y' j* S; A6 N
你现在是内基准还是外基准?: b, Z9 x* \3 ?
内部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
8 g  z6 S& e( F) B! x/ {谢谢分享

5 O; G4 t# ~6 @; k5 A* [4 _; b能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01
# S  n. F: x9 X# [  _9 o2 ~+ V8 c多谢 分享

; P1 e0 n4 q" ^* M& x! ~能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
9 v* i. A$ W! C' O  h
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
, e, }; J( U( e* W$ e数据从哪里读取呢?要不要使用中断呢?

& E/ ?$ s0 W" r, P2 g- W我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
& G: a/ m+ l3 U5 Y0 ~' L谢谢
- f' J) a1 D# }8 g
多谢版主支持
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 手机版