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

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

[复制链接]
sasmike 发布时间:2015-1-8 15:49
本帖最后由 sasmike 于 2015-1-8 16:00 编辑 ' B- W) |" e: \8 S9 E2 x) p

  O0 b) [' t1 @- W+ _+ t最近学习了STM32F0芯片,写了一个DMA控制ADC采样程序,给大家分享一下。还是新手,希望大家多提宝贵意见
; n% S$ _" H- L# n' |, Y; j, E程序在STM32F051上面测试的. I) N8 q* Z; O8 I+ J5 R, U- z
基本内容是:4 s' `2 t/ \; _! n
1、使用ADC1的11通道每1us采集一次ADC数值7 @' E3 u! o1 h- I- W
2、使用DMA1的1通道对采集数据自动存储,共采集1000个数据3 _3 k. m8 e& _0 [
3、每次采集1000次数据后,在主函数中对1000次数据进行求平均值
8 h% f" F! m* a/ e4、由串口1发送到电脑串口上显示% r5 P. G" K7 s9 f1 j/ F* A& t- T- ]
具体程序如下:- l0 b! z' n) I; F' [3 b  x" j
#include "main.h"
: ?* u* C, i8 E: t5 L/ d- |/* Private typedef -----------------------------------------------------------*/
! w- ?; a7 j7 B( f/ l/ l/* Private define ------------------------------------------------------------*/( j- A  T# e: V# y6 u
#define ADC_DR_Address                  0x40012440; G& a' x; p" i% G/ Q) U0 }; Q
#define ADC_BUFFER_SIZE                 1000

0 ^. o# \4 g* N: T; ]% W8 C$ i/* Private macro -------------------------------------------------------------*/
/ q/ l. l  h; |2 D4 v/ q7 _/* Private variables ---------------------------------------------------------*/; c& ^; n. ]* D2 i
__IO uint16_t ADC_Buffer[ADC_BUFFER_SIZE];2 M) Y/ {# E$ ~9 e$ |
__IO uint32_t ADC_ConvertedData_Sum;
  R; |1 v, s+ y2 A: X2 m__IO uint16_t ADC_ConvertedData;
3 |: i) P6 D' [! t__IO uint16_t ADC_ConvertedVoltage;

7 B4 F3 x6 _  A% d! T) c& v9 s. Q$ r. h/* Private functions ---------------------------------------------------------*/
  f9 V2 E# O  T+ R8 G. jvoid Delay(__IO uint32_t nCount);
7 B' c; m3 F; [! Q1 m, B

7 y) D1 p, z, F3 I0 G( A3 P+ L; eint main(void)$ v$ p) ]9 ]; t; i  a6 Z6 ]% d. L+ P
{: c7 z( c, `6 P% {2 \
  L, t" S& H- K. e9 M
  __IO uint16_t index;+ J) I7 P1 B& l. t
  
6 o) w0 ?/ M5 R3 x2 p- J2 ^0 g6 [6 j( r  USART1_GPIO_Init();+ z8 t; a1 d5 x' F; |7 c* v
  
, X0 Y0 s0 ~) O) S  T7 ?0 }  printf("This is a ADC DMA Demo...\n");, y7 U: Q6 S  Y: ]
  
3 L# G5 R# y3 w0 D7 N7 t  ADC_DMA_Config();
9 i3 n' o7 b6 p& Y) j  
5 L$ W$ k% ?# E7 U  /* Infinite loop */
9 u/ `2 a7 K$ N! S6 p+ g  while (1)! |( q9 g2 X+ j0 U6 q; d4 R. q
  {: ^& O3 _4 O% G2 C9 Z" d: [3 J
    ADC_StartOfConversion(ADC1);
! r' B6 _. [& K  K   
7 x+ O+ q" i1 w    while ((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET)
; K3 `: c4 B+ g) P9 F, ^0 ^( w    {, H( Q  y: _* u! w: p) u; a' j% _* ?
    }
: g6 e/ i- a9 q. c  a    : O3 D% x- A2 v, Z; m/ p2 q+ @
    ADC_StopOfConversion(ADC1);
5 ]8 z) V9 h* m   
* p, j; Z- [+ |- F+ b- u    DMA_ClearFlag(DMA1_FLAG_TC1);
3 m. b: f5 h! u# l& Z3 W* R    ' |& P! S7 W# n& w4 h
    ADC_ConvertedData_Sum = 0;
$ T) {# l3 R% ~5 v8 u7 q6 R  S    for (index = 0; index < ADC_BUFFER_SIZE; index ++)
; U1 b8 ~( V' y% Q9 J7 h    {) p5 V- I7 n6 S; w; B
      ADC_ConvertedData_Sum += ADC_Buffer[index];0 J2 h+ K! @8 ~  w5 s
    }
2 I; D6 t9 k# P/ A4 R9 y   
2 q1 [# o/ t/ j4 \1 Y    ADC_ConvertedData = ADC_ConvertedData_Sum / ADC_BUFFER_SIZE;
" }4 h8 e/ C2 b+ X6 J   
+ K7 m+ z5 X) z( I6 t' d8 M3 t    ADC_ConvertedVoltage = (float)(ADC_ConvertedData * 2980) / 0xFFF + 0.5;
9 p% ?/ G6 ]1 V    printf("------------------------------------\n");
0 X5 x$ u6 d6 S2 c8 G) Y* `    printf("ADC_ConvertedData          = %d\n", ADC_ConvertedData);$ M4 @9 {0 M9 {+ b; c- f
    printf("ADC_ConvertedVoltage       = %d\n", ADC_ConvertedVoltage);1 f+ I! I& x/ |- k  Y8 D( S+ O, z( }& ]
  : Y# y5 J8 ?6 H5 Q
  Delay(5000000);
. J& k3 a) O4 f  ^  }
5 p) }) q' J, d+ U* s}

4 M' W% {3 @6 t$ t1 s) P* s$ Z6 b1 i, j; hvoid ADC_DMA_Config(void), W, l( k' V$ `( z
{* x( b0 k; B5 D- U. t( H0 Z
  GPIO_InitTypeDef GPIO_InitStructure;9 E3 {; e( M; v  S" r
  ADC_InitTypeDef ADC_InitStructure;
" L1 g( x2 Z. \0 w  DMA_InitTypeDef DMA_InitStructure;0 Z: A6 E3 J! d* b, h% i: r
  
9 g' c0 Q( _( [  K8 q$ f3 ?  ADC_DeInit(ADC1);" X0 g8 \/ K2 H
  
9 m3 N* [9 P- r. @) ?9 k  s  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);8 M  k) N9 |9 F" e  X
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
1 Y* p) w9 o' N- t: i& I  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
% r+ J" y2 V1 B) u  , C5 o6 |5 t9 f  f+ n0 b) Z
  GPIO_DeInit(GPIOC);
% q) c2 S0 y6 O# B  GPIO_StructInit(&GPIO_InitStructure);2 [' L2 R- l# n) [; N% `  j: |+ ~
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
& r# K/ k! G: X# y8 |1 e  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;7 a+ V- I* z+ j" B. o, D: w
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;" X/ B* k; y9 M2 v) A. V( r
  GPIO_Init(GPIOC, &GPIO_InitStructure);% X8 F8 t8 o5 ?3 T/ O9 v& v0 w, `0 o
  ( _  R0 N6 P# {1 r
  DMA_DeInit(DMA1_Channel1);
% y# H, j$ B. U" C; c  J2 k5 Y  DMA_StructInit(&DMA_InitStructure);
/ ~2 d9 E" J5 @6 E  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
9 I/ x" L; J: H* l/ f/ A2 w  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;, f) y7 Y5 @4 z- I) e6 G/ M
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
3 D! O( h! x/ L2 b' v  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
" k  P' Z% {. H; L" S  F: F3 w  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;( O+ N$ h( j% }7 G  n1 {2 {
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;5 B, W" P5 C" F% e8 B$ n
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
4 ~, V7 g6 r- U4 i/ A8 ]9 P  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;5 J" v8 K6 d# H2 K2 @/ H' v5 Q  m
  DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;9 E  q, V3 J+ q& ]% |5 ?
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
% {9 D" h3 s% F" E- V+ v  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- @; j7 C- H* e0 O9 H2 e! E% H  DMA_Init(DMA1_Channel1, &DMA_InitStructure);  g8 }, V" \: E- ?5 ]! [/ k
  , E6 c# r! D8 |/ U! t5 V4 Y' R$ I
  DMA_Cmd(DMA1_Channel1, ENABLE);& A7 V" ~7 f1 `6 f& l
  " b$ a4 ^: m/ X$ X# \+ U
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
' o; W) R( e9 h, {8 h5 B. B5 q  ( \) i0 k% g+ m( y& p6 D0 u7 B3 Y. U
  ADC_DMACmd(ADC1, ENABLE);
; E# e# `6 f$ }: F7 e. R. U6 p  8 M7 c( B! R! {
  ADC_StructInit(&ADC_InitStructure);5 O9 I" d: S8 B+ r" N) S( l4 E8 A
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;1 g% B3 ]3 A  j: l* g# {$ U
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;  {6 u& c2 J3 s& B5 ~) K8 T
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
: ]$ _2 n& a, N1 r8 t7 ~  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
6 m; `* {3 z, v( D! g  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/ M  Z7 H) b  Z4 y  a
  ADC_Init(ADC1,&ADC_InitStructure);
# W6 B1 X6 \# c2 B4 M  
' ^' \# l, |. {, G  ADC_ChannelConfig(ADC1, ADC_Channel_11, ADC_SampleTime_239_5Cycles);( a1 E" D- f6 n" e. [9 c
  ADC_GetCalibrationFactor(ADC1);) s, ?' ]2 p) v1 L9 g
  4 Z3 y( f: [6 r- g0 Y0 g
  ADC_Cmd(ADC1, ENABLE);: J. A  u3 a9 X
  
2 ^$ T) {. y& ]$ \" n, R3 I  while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN))
8 u. Z( ~4 M6 N. r  {+ l! k2 R/ R- M1 \
  }
$ e# i1 `7 B9 a1 d}
% c) w9 a1 @5 }+ T  h0 S! Y, i
最后附上源程序: STM32F0xx-ADC1000_DMA.rar (2.26 MB, 下载次数: 270)
赞 收藏 2 评论22 发布时间:2015-1-8 15:49

举报

22个回答
mengqiqq 回答时间:2015-1-8 22:15:02
非常好!!
& V7 S' D1 z3 ]# n- M; X楼主能否解释一下DMA配置的部分,刚学,总是整不好。
5 b8 P1 }7 r0 v8 Q  b  DMA_DeInit(DMA1_Channel1);
/ F5 S. ~. O8 h$ W; e  DMA_StructInit(&DMA_InitStructure);
/ x$ J% h6 d9 n" i) E) o+ J  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
; Q# d; x8 C. q3 Z3 n! s: y/ K  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;
$ T- V8 x5 s. Y3 E  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;$ P9 h. x+ v3 l7 G. y& E2 B; s
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;& f6 U2 P, i, S* j1 O! X0 ^
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
: S! F# W7 p* V* t# ?  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+ t/ k7 K9 z% t; Y  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
7 p8 J% x( g% }1 H# Q  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;( I4 }1 U- B0 b7 v7 a+ \
  DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;* D; E7 C2 j( J' U7 a
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;* d9 m2 p! N% k! k. X5 o2 u
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
9 X. h: i6 N7 O1 A" W  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:51
" W- X9 m3 B- P2 Y8 u多谢楼主分享,正要使用DMA控制ADC

  R! Y2 \. i; m9 C  `  S3 R! i能用上就好,多交流啊
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
$ t  s4 O7 f% k& O8 E) c1 ]楼主也不喜欢CUBE库么。

2 l5 Z1 B8 ^% e4 i' ^! q1 t以前用的标准库用多了,这个还没有仔细研究
sasmike 回答时间:2015-1-9 09:38:09
hl1980 发表于 2015-1-8 22:25; F2 r2 \3 w5 Y* ~
学习哈
# y4 V/ K/ c5 p9 B3 X
共同学习
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 手机版