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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下, K2 r9 a6 P( V& S9 B  p5 y
+ ^: n& z, m. F9 g8 _( r6 Y8 R5 ]
  1. /**
    ! K9 m# h) A1 u+ ^2 t
  2.   * @brief  配置ADC1的工作模式. u3 C$ [  Y: G
  3.   * @param  无
    7 U3 H- \, t" H; J" r3 n
  4.   * @retval 无' J! E: W: r+ V& j- f
  5.   */& s& K8 y: O# Y" _" |6 e3 `0 u. w
  6. static void ADC1_Mode_Init(void)
    % R7 G. g& S* m! F) a
  7. {
    9 f. X; L4 T, U: F+ w
  8.         ADC_InitTypeDef     ADC_InitStructure;* {1 M/ _$ h! y+ X& L/ E4 F9 X

  9. / ~. L" A2 F0 A) U2 `
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/( T0 x+ d  K( h2 U; {
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    1 O0 H+ U. Y( a# v7 u1 l: D3 B
  12. 5 ~9 l  B  l2 c- F
  13.         /* ADC1 Periph clock enable */( R$ S4 m0 L9 j7 S" Z6 Y4 _
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ; |7 z7 D1 I* u+ k

  15. 8 `! F4 i$ s1 ~5 e" [. ~$ n  O( L1 f) H
  16.         /* ADC1 DeInit */  + |1 }; W/ X& ]1 h% X6 G
  17.         ADC_DeInit(ADC1);
    ! V/ ~6 e' @( O( M& E7 ^6 l* k9 @
  18.         ' l- p1 J, G6 r, [: h
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/4 d8 Q, v  j0 F: r, o5 y9 v
  20.         ADC_StructInit(&ADC_InitStructure);                        
    8 g: O" _! p" l- J+ R) i
  21. 0 j1 Z. ]6 ~2 ^7 Q
  22.         /*配置ADC分辨率为12位*/
    ! V" O/ w5 e# m7 _4 b/ c3 x
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;7 a. S1 E# y+ Z' e

  24. 5 F. w! U' q) ~5 [
  25.         /*开启连续转换*/
    * [4 ?) S  u, k6 @$ }
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ) s. O) C! f) `9 T4 P5 [

  27. 5 I. n( S/ D3 H, H
  28.         /*禁止触发检测,使用软件触发*/
    1 ?& N/ J' O. x1 e
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ; P7 N. q/ E; S! \6 ?: l" {

  30. 3 j/ A) j/ O$ H& `
  31.         /*ADC采集数据右对齐*/
    2 A* r4 P+ \' ~
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    3 N, v* ~! {+ G7 ]% X; p9 H6 m/ L# g4 Y
  33. ( N6 Z; C( C+ |+ L
  34.         /*向上扫描*/
    ' v! D! X8 l8 D/ V- P: y% o1 v; T
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;2 f, j+ z0 Q# \. L1 j

  36.   E/ k% J0 y- z! J, d, x& u- n
  37.         /*ADC初始化*/4 ?% G& m- F( w+ ~. A9 L0 }
  38.         ADC_Init(ADC1, &ADC_InitStructure); 0 |  m" e% Z$ ^( F* v
  39.                               
    8 v0 E0 H- p( ^. T5 T
  40.         /*配置采样通道及时间*/
    " _, c  q+ q5 v' Z$ {
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    ! _* M  X  S& V! y2 _

  42. 6 g' |" ^9 R) B# m
  43.         /* ADC 校准 */8 ]  s* F9 e  A
  44.         ADC_GetCalibrationFactor(ADC1);
    ' x. s% N. W, d2 H6 N+ f% o

  45. / N  A, W" j2 e; f  W' A. S
  46.         /* 循环模式下的 ADC DMA 请求 */" w8 _" v7 {. c  ]5 g* h* S
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    ) P  f, u8 F/ ^: q; y

  48. * D/ s, [( Z% k( j5 R3 n$ v
  49.         /* 使能 ADC_DMA */
    $ t# `+ P; \& o" D7 E2 P
  50.         ADC_DMACmd(ADC1, ENABLE);  * s4 `$ H; z8 H

  51. $ Q2 e, U% M% j+ w0 @4 B
  52.         /* 使能 ADC1 */3 F! E7 D+ |6 `& X
  53.         ADC_Cmd(ADC1, ENABLE);     5 m) ]9 Y2 Y5 b3 j8 x' O: v* I* j& n
  54. , e! x8 y; q2 F
  55.         /* 等待 ADCEN 标志 */' t9 D& k2 U2 q) f: j+ k, c8 |
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    ; L7 j0 e) f. t- t
  57. ) a$ \+ w2 g" N7 p( {
  58.         /*  ADC1 常规软件启动转换 */  , J/ E+ l9 Q& l# n1 e$ b" v7 y
  59.         ADC_StartOfConversion(ADC1);0 c5 n- W# h4 c  ?. a
  60.         
    9 n$ J8 O- E  U& c$ t
  61. }
复制代码

& [2 d0 E" M' L4 F- m7 l8 I8 S/ n( O& b* |# J; [

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
/**) J- |( l; ]: _3 v, E
  * @brief  Configures the ADC clock (ADCCLK).
8 V6 J; P1 ?6 B& A7 h  * @note   This function is obsolete.4 V6 Z8 r/ ]$ p( W7 y5 F* K
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver. m# M% d# J" W, F' {6 p
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
+ x9 Y, F5 `$ ^, Z  *         from the HSI14 or APB clock (PCLK).
7 ?) y. G( E" r' w/ i  *          This parameter can be one of the following values:1 d0 W- w$ J" M9 i8 {! c* w
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz): K* a) @& [: j6 |) b" N
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
0 w6 S4 ]* j6 G/ w$ o9 l  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
& F$ @" I  F/ {2 K- q2 l; D0 |  * @retval None7 y7 B, P- E0 f9 |" B6 ?
  *// ^# a* L1 Q/ q' y8 L8 [; R
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
0 f6 f& I+ T1 Q6 \: T7 q此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49
% S! R5 M# F: o; j# Y- V9 j- M
void ADC1_Mode_Init(void)3 `; Q; D( n1 ?0 |# g3 U) N$ b
{
" `$ v2 ?" l' h. q9 z4 E4 z6 z6 f    ADC_InitTypeDef     ADC_InitStructure;
* O& P9 d* E. J, z# c
5 ^" |$ j: Z+ _0 q# F    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
/ g6 e; j0 w) {: [+ j0 c6 j    RCC_ADCCLKConfig(RCC_HCLK_Div4);
: E1 v) S7 ~' q0 B) |9 @' Q. `6 `    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);% d8 U8 g! ~; C' D

& R1 C0 V1 D! |: O6 Z9 m
* i# g6 ^: u  i; w7 H9 r' r源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.# `1 n& Y# `5 P# ~. j7 V

  o/ K) Y1 }" {+ {/ Y另采集数据全0,还没看那里的问题..$ K6 O6 S0 [# k9 `' p' H/ ]3 M
2 v" Q) E% x/ `1 V2 F# ?& d
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42
  I/ \9 T" L, Q! Bstm32ADC飘得还是比较严重,不过加了滤波算法后还好

8 T  r! y3 ]- p- j3 H* m滤波显然会影响速度的吧?
5 B) U( m% _4 Y5 C, g+ l; B, o滤波之后还能有多少bit?5 L2 G$ u/ W! i. I
你现在是内基准还是外基准?) p6 \+ ^( D# ^" J, T
内部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
7 @% Z  K, i5 H谢谢分享

/ `1 T9 J& i$ Q2 Z& E能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:011 X. x- d+ \4 A" S6 A
多谢 分享

. K( m2 J; v6 f; |能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
/ X+ Q9 i9 @" K- E
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
4 E0 G7 U% A4 v$ G. k数据从哪里读取呢?要不要使用中断呢?

  L4 ~  T4 y1 M8 S我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56" Q3 c8 a! G3 q4 x) i
谢谢

# {/ j, f/ U- o3 m- C- x多谢版主支持
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 手机版