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

发一个STM32的MDA控制ADC采样程序

[复制链接]
sasmike 发布时间:2015-1-8 15:49
本帖最后由 sasmike 于 2015-1-8 16:00 编辑
2 F2 o% j5 L1 l! ?, V2 U+ B- R8 R  k4 Z
最近学习了STM32F0芯片,写了一个DMA控制ADC采样程序,给大家分享一下。还是新手,希望大家多提宝贵意见
8 `' d7 U: S$ z- s" v8 t# ?程序在STM32F051上面测试的7 h- z1 o1 i* H6 U6 I. {
基本内容是:* k- }, g3 c* Z6 C
1、使用ADC1的11通道每1us采集一次ADC数值* `& g6 }' k. Z0 B6 B6 [4 _* N
2、使用DMA1的1通道对采集数据自动存储,共采集1000个数据# \) X& @, t* u' G
3、每次采集1000次数据后,在主函数中对1000次数据进行求平均值
( P7 |8 b- {# @( K' ~. Z! O- h+ W4、由串口1发送到电脑串口上显示
0 O1 p5 c$ P( D% i# n具体程序如下:
6 w6 O; K( _6 x# m: Z3 e4 d+ C#include "main.h"
+ X: u1 }2 T4 P+ I$ n6 t/* Private typedef -----------------------------------------------------------*/2 r8 ~7 }# z2 a- J9 `
/* Private define ------------------------------------------------------------*/" B7 M2 q, ?, P. A% h, n- K
#define ADC_DR_Address                  0x40012440
( {' ]; U9 a& f#define ADC_BUFFER_SIZE                 1000
. K+ I9 K, x: T& R" u# ?# e
/* Private macro -------------------------------------------------------------*/
+ B, a6 s$ N- V9 D) l/* Private variables ---------------------------------------------------------*/
0 f6 `7 K: {3 p, {: w__IO uint16_t ADC_Buffer[ADC_BUFFER_SIZE];
4 Q" T# j1 e3 t* W* y# T* j__IO uint32_t ADC_ConvertedData_Sum;
6 {# l3 i, s) L9 {2 @__IO uint16_t ADC_ConvertedData;* {" M$ `  E4 f, U$ L
__IO uint16_t ADC_ConvertedVoltage;
, g1 n# v# t4 X* c( s
/* Private functions ---------------------------------------------------------*/; Y) W+ U$ e1 D
void Delay(__IO uint32_t nCount);

+ p$ A" `$ U9 b2 _% ~# Y5 U) L$ D* H8 v0 f% f
int main(void), _# z- d8 H; K6 K, f
{
* ?, D5 ]1 Y7 O( ]
& K! l& F" i9 \( C9 S: U* @
  __IO uint16_t index;/ ?/ ^7 n+ }& d, U& l* o6 u
  & O. T; D; k/ [" _# s5 b8 d% L
  USART1_GPIO_Init();, O; c0 v* I& Z8 U
  0 k" `% w9 J( k) `3 ?! ^1 G1 q5 \
  printf("This is a ADC DMA Demo...\n");, ^# S' D# {8 x* \7 p" l8 M
  # {+ `0 A0 n9 `/ ]! a( C
  ADC_DMA_Config();
, k0 U5 K$ Z8 V1 k: K0 K5 n  ) C- y) O0 ]+ w/ T3 b2 u
  /* Infinite loop */+ [! w# m6 r1 p6 `% y: H
  while (1)
% x+ X  P2 A. R7 x  {5 w) Z$ t  U( P7 f6 H+ a' ~
    ADC_StartOfConversion(ADC1);
1 o/ J( k, G+ C! U# a: c% A   
. C$ }9 \8 a& T- s. ^1 B    while ((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET)
/ G( n3 L$ F' R* M( r( l7 w/ r    {
, L; y2 h* Y0 K. E" d- p7 v    }0 G# O! u5 Z1 w4 \0 w
    " e9 P! |2 B- q8 ~4 g7 ]
    ADC_StopOfConversion(ADC1);8 q  J0 W1 R; x5 E! o
    : E0 k1 `" K$ R/ @
    DMA_ClearFlag(DMA1_FLAG_TC1);
% ~8 Z* z; }5 Y% N2 y0 J" r$ i7 Q* S9 {    % ~$ y3 a7 ~+ Z8 p3 H
    ADC_ConvertedData_Sum = 0;
5 O: R5 _8 n" [* x: y) L    for (index = 0; index < ADC_BUFFER_SIZE; index ++)
+ \" [5 D9 o' C9 E8 g( Q6 X: d3 x    {5 C) Z0 Z  H9 N8 ]
      ADC_ConvertedData_Sum += ADC_Buffer[index];
' b5 S9 M0 ^. H1 k1 z" d8 F    }& D; e+ u$ S% G) @5 L) e! W! m9 C
   
' n9 {' A- @8 l8 E( i- U    ADC_ConvertedData = ADC_ConvertedData_Sum / ADC_BUFFER_SIZE;2 ?. k- [' C. c1 Q) ^0 T$ J: e, D
    5 T! \6 z. \6 m3 S# l& b% P
    ADC_ConvertedVoltage = (float)(ADC_ConvertedData * 2980) / 0xFFF + 0.5;
9 w8 [- J7 c) @8 ?    printf("------------------------------------\n");
  J: _( D6 c( b; P    printf("ADC_ConvertedData          = %d\n", ADC_ConvertedData);
  }5 A4 g, [6 ]6 h2 M( a, @8 h" E/ B    printf("ADC_ConvertedVoltage       = %d\n", ADC_ConvertedVoltage);* _& z) U5 A( d3 _. D8 M. b+ t( S
  ( r4 O# d- X/ V9 J* i
  Delay(5000000);
. M8 N* P0 Y7 H+ I* X8 i+ ]5 R  }$ P0 ]5 s" R( e  m0 ]9 @5 ~/ l  N8 t
}
% \2 g( q7 R8 n, e/ P' f5 V
void ADC_DMA_Config(void)3 w- w# p2 _+ c4 `, c
{
5 N3 z! q/ [6 c* t  Q  GPIO_InitTypeDef GPIO_InitStructure;+ z+ `  z, ?( [7 @6 x" k9 c9 Y
  ADC_InitTypeDef ADC_InitStructure;# v; c" ^* x8 T5 X* \. j
  DMA_InitTypeDef DMA_InitStructure;
0 F. b* m- }% I  X' f* U  
7 k) }1 g3 o' U. |2 F  ADC_DeInit(ADC1);6 ^; J- b8 o: _% {) W$ Q* e
  5 W7 k, B2 H! S) E) m- d8 Q
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);( r& c/ p* V) G7 o( F% b
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
! u. X6 H& ]( c# |  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);3 d) U% b) x( b; P* i" A
  4 H1 u, u  X+ \6 P3 m  A, [$ Y% l
  GPIO_DeInit(GPIOC);0 V0 `+ W. S0 t+ @( y5 U
  GPIO_StructInit(&GPIO_InitStructure);5 I) q  R/ [3 F. U( r6 k- ~6 z' s( A
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;" \7 V# Y  V1 ~
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;5 e" X9 z( U% W7 l
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
8 o4 s3 u! _& o  GPIO_Init(GPIOC, &GPIO_InitStructure);
( e) y! r3 v$ ^  
7 z& f5 H# k/ y  U$ ?  DMA_DeInit(DMA1_Channel1);# _. o; q+ R- F6 \' [  E
  DMA_StructInit(&DMA_InitStructure);" n1 H' j3 l2 z3 p/ T4 V# |' E
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;) H- I& C- \% w9 ~4 ^' u
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;+ ~# {# Q* t0 E% k
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
( B$ t' C. v) S4 |9 f0 Q) D  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
9 w+ G# A9 s, n8 u  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
. t  S! `2 P% W. X1 e7 Z" }* F3 b; \  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;' X- o, H. Q  T# i. i! c1 Y1 g* P
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
7 B, z; t. G3 }, s+ ~$ V. D- R  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
8 w3 |( m/ \* m7 d2 }  DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;
9 O# T4 ?% f1 k- f+ ?  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
: q, w( P8 G; z$ }$ R. I2 }+ E+ O7 }  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- H' X4 s9 F3 p, U% B  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
: T- o3 g5 \8 ~0 g$ p$ z  
' f; t, [! i; j/ [( _* _: d- f  DMA_Cmd(DMA1_Channel1, ENABLE);
7 y; N+ x. s( }! h' j  
. ^7 \6 n, M  A1 a3 m7 R$ J% u! |  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
% g+ F( }; D0 U' G! D; r$ H  O1 r  - @  x! _( z& y7 Q) ^$ U
  ADC_DMACmd(ADC1, ENABLE);8 P5 t) `) ^$ G' x5 D
  
& M2 {( F6 J+ e0 a$ `% O  ADC_StructInit(&ADC_InitStructure);7 }+ i$ u; r" _7 D( M3 Q1 l
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  c" P5 E; K) b9 Z' e
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
9 j! R7 K" @9 W. g8 Z  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;/ z/ j, r) @! @+ o% o0 k3 w
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;" e$ _. i: i1 l7 L# Y6 k
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
4 H" _* V! c6 J" |' U5 X: m  ADC_Init(ADC1,&ADC_InitStructure);5 y0 O1 t8 e' s1 a
  ! W9 w2 a* B  i. p8 b8 C* P; E, ?: v0 V
  ADC_ChannelConfig(ADC1, ADC_Channel_11, ADC_SampleTime_239_5Cycles);
, ~; K- H6 p3 t9 n  ADC_GetCalibrationFactor(ADC1);
- x$ B" N8 i8 x! o) j# s* o  
+ _5 H' @: W' K) G; u2 N3 A  ADC_Cmd(ADC1, ENABLE);+ L! u( z' X( @+ m# p' }4 ~+ {4 g1 x
  
) q" M9 s+ q* s3 s2 a3 C. m8 J  while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)). @8 Y: t* H2 S
  {
. T0 l3 _8 M; |  }
3 b0 ?5 |: G7 l5 z}
: ~2 z4 E! E% f7 p% w0 B, t/ L8 c
最后附上源程序: STM32F0xx-ADC1000_DMA.rar (2.26 MB, 下载次数: 270)
赞 收藏 2 评论22 发布时间:2015-1-8 15:49

举报

22个回答
mengqiqq 回答时间:2015-1-8 22:15:02
非常好!!
5 u8 t4 a) u9 U8 X楼主能否解释一下DMA配置的部分,刚学,总是整不好。
! J+ W5 v( w4 i4 ~4 H  DMA_DeInit(DMA1_Channel1);
9 s0 A, _5 y1 C7 ~  DMA_StructInit(&DMA_InitStructure);% \; q) D* ~/ p' u
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
7 w! l( f- N% j# {& v7 T1 F  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;4 z& o- p3 S6 h. `$ {5 V7 r
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;+ q$ `5 g4 f/ k3 G/ g
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
1 e" S, r1 W, W( y4 E3 I  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;% J7 ~* A! q# }! K
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
; @: w8 h! q# D  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;4 X" p  Q% G2 L5 k8 j9 v* @
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;# h- t  D. n0 t' E9 x/ V& T
  DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;
0 W, U8 {+ A3 Y8 p! l  DMA_InitStructure.DMA_Priority = DMA_Priority_High;( T5 O) d& ~0 V: U3 W4 e6 v% v" u
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;: U5 P; M6 o1 f8 J- n  u8 L$ F
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
nmgbtzyf 回答时间:2019-2-20 04:16:09
ADC_SampleTime_239_5Cycles,这个地方看不明白,不是应该这样吗?239.5Cycles,还有这样设置,怎么弄实现1us的速度
nmgbtzyf 回答时间:2019-2-20 04:15:41
ADC_SampleTime_239_5Cycles,这个地方看不明白,不是应该这样吗?239.5Cycles,还有这样设置,怎么弄实现1us的速度
mmo 回答时间:2015-1-8 15:54:12
学习了,谢谢分享
安雪尽 回答时间:2015-1-8 17:09:09
收藏了,谢谢楼主
dongqingchen196 回答时间:2015-1-8 20:51:01
多谢楼主分享,正要使用DMA控制ADC
STM32LEARN 回答时间:2015-1-8 21:18:29
楼主的程序很清楚啊,多谢!
sasmike 回答时间:2015-1-8 21:59:35
dongqingchen196 发表于 2015-1-8 20:511 a+ _( {% {: h" k7 B; {- m
多谢楼主分享,正要使用DMA控制ADC

1 n: C: t5 H" g' N; U' V! `$ U能用上就好,多交流啊
aderson 回答时间:2015-1-8 22:09:36
楼主也不喜欢CUBE库么。
hl1980 回答时间:2015-1-8 22:25:47
学习哈
sasmike 回答时间:2015-1-8 23:31:17
adersonl 发表于 2015-1-8 22:09
) Z6 ]) `8 a" c: `, [/ g楼主也不喜欢CUBE库么。
9 K; R2 `; J9 ?0 P; c& o& O7 O
以前用的标准库用多了,这个还没有仔细研究
sasmike 回答时间:2015-1-9 09:38:09
hl1980 发表于 2015-1-8 22:25
; f7 H0 z" V) f6 O2 k学习哈
& J% M* J5 d9 n" v) k. Q  y% U
共同学习
stmike 回答时间:2015-1-9 09:56:02
有点意思,对于mda不太熟悉,谢了!
naruto945 回答时间:2015-1-9 10:07:12
这个采样感觉精度不是太高啊!
nomoreheracles 回答时间:2015-1-9 10:19:41
学习了,希望代码代码更完善一些!
lkl0305 回答时间:2015-1-9 11:25:28
不错,不知精度如何?
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版