找回密码
 注册
关于网站域名变更的通知
查看: 195|回复: 3
打印 上一主题 下一主题

STM32F030C8T6多通道ADC采集DMA程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-12-3 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。
0 z5 E2 S- O% d* i6 f# Q* M
$ U9 d7 |- b* p% p" W9 ]! ?6 Z8 o7 C; o! C0 ]$ K! r( }# U: P
#include "bsp_cpu_adc.h": j% ~( B( r) c$ D3 i6 V0 R9 B% h% b
#include "usart.h"
( Q0 W/ H* @' J& H8 e& m4 [* p; e6 }( P
/*! I$ y) f( `5 s9 Z( X
PA0 --10脚" D( E4 d% O$ s- r3 \& S; R
PA4 --14脚: L" z; V2 ]: \% _) p2 g  y
PA5 --15脚
  x, e7 b5 j( @4 N2 Q$ lPA6 --16脚
$ w2 ?' k% m/ E- z* X& JAN16-----内部温度传感器
- l, s/ F/ L% M( R& c& CAN17----内部参考电压
1 Y9 H7 A( ~- f: n9 k/ Z3 e5 ^8 Q! Y" u5 T3 N) w
* @+ ^# `) e4 W2 h0 a
*/" c) P; {4 M1 j/ G; U. K4 P  X
  G. ]1 ]) m( u* I$ L2 i7 T+ }0 D
__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};! I. [5 W9 s: J6 l! d" G0 `
1 H1 [  T5 L/ ~1 @/ \
DMA_HandleTypeDef  hdma_adcx;7 H' h& Q8 g0 }* h7 M( I( }' C% a
ADC_HandleTypeDef  ADC_Handle;
* R8 w2 d" N) Z- o8 ^5 |ADC_ChannelConfTypeDef  ADC_Config;0 n# _, f: e9 [' _4 m
7 r6 n# `# |4 _- U7 d, m% v

  ?$ t' b: U; l+ i; Rstatic void Rheostat_ADC_GPIO_Config(void)
3 I& R, R1 g$ R7 G2 |; J{
7 E8 s/ ^, I4 k' G" F' Q' U$ ]         GPIO_InitTypeDef GPIO_InitStructure;
1 Y' c* n1 X  i6 @1 r1 {         // 使能 GPIO 时钟/ u& j' G9 J0 O
        __HAL_RCC_GPIOA_CLK_ENABLE();
. Z6 u+ T- L3 {! ]: H         __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟
7 M3 F8 ~, \  [2 D$ Y        // 配置 IO( T7 z: h! Z5 a* f
        GPIO_InitStructure.Pin  = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
3 u0 O' L/ H- a" j        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;  //配置为模拟模式1 [  o7 }2 }8 S# Z1 |
        GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉, f$ n9 }+ l! W
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);        ; M+ n5 |8 ^& q4 |, B
}
; [& t5 P6 ?% Q; b% G6 U$ `1 F
+ G) h3 N/ d! \
' B3 D6 u; W! d: V/ w/ e6 c  I' }2 }0 ?1 [4 |. f, f0 _6 p; ~* W

) H, z  p" m2 vstatic void Rheostat_ADC_Mode_Config(void): F: I6 b( D( g
{
7 U9 R" t9 I9 n* R# |        
/ ~. `' v6 P& S/ G" k( Z( ^        // ------------------DMA Init 结构体参数 初始化--------------------------2 F0 W$ O  L$ i4 ?: }% N' M
        //DMA_HandleTypeDef hdma_adcx;
- ~) ]( W$ P0 X" m, |, ^        // 开启DMA时钟
+ M" H4 Q, l7 J2 O        __HAL_RCC_DMA1_CLK_ENABLE();! t9 E1 j- w4 |
        // 数据传输通道
! I) t$ P! ?$ X; u2 }        hdma_adcx.Instance = DMA1_Channel1;  //通道15 t) ]$ }" q2 Q, h3 g* h7 I4 v: \0 d
        
( N1 q( c' R  v         hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY;            //存储器到外设
1 N6 @! o' H( B' C2 k     hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
! x5 o! t' B; N     hdma_adcx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式) w: d4 U, T) p6 K6 @
     hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位9 X8 w9 p6 t9 A: Q5 f+ \8 v
     hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //存储器数据长度:16位
9 Q1 v& t  m/ V8 J  t' z  A+ h0 T     hdma_adcx.Init.Mode= DMA_CIRCULAR;                         //外设普通模式2 ]/ {, [8 _8 z
     hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
) `5 @0 P( f. T4 z7 M        
* N4 j7 I7 t( Y( _        HAL_DMA_Init(&hdma_adcx);                                   //根据指定的参数初始化DMA
- l( X& B7 ?2 ]5 a0 U
- I3 z! p, C: H; R8 E1 B0 {) [2 v    __HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx);          //DMA句柄关联到
; W; Q' s$ [! N( m        //---------------------------------------------------------------------------
4 c; F$ S. h. D7 G    // 开启ADC时钟5 E. d3 v, Z* ^5 @( ~6 E- J
         // __HAL_RCC_ADC1_CLK_ENABLE();
5 q3 y* e! u& H7 m0 b4 t0 [          ADC_Handle.Instance          = ADC1;
) Y* i2 u- R2 |1 N6 K- @3 d  if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK)
& \9 i9 e/ U, p6 b+ f+ d$ ]  {5 @$ ?1 D8 C7 G$ G# l1 \* J
    /* ADC de-initialization Error */* F2 l9 m+ ?, N' C7 K+ v! d
   // Error_Handler();' @: ]8 H" f1 T# g2 M
  }
0 c; x; {; ~) i6 \      ADC_Handle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV2;      /* 同步时钟模式,带prscaler 2的输入ADC时钟 */' b# q" g7 j* m/ U; X
          ADC_Handle.Init.Resolution            = ADC_RESOLUTION_12B;            /* //12位精度 */
2 _  Z9 @. _% z          ADC_Handle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* //右对齐 */
- K2 E+ D. C" p' w6 p          ADC_Handle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;    /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */% O( a9 C: u5 K: s: C/ H9 \: G
          ADC_Handle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */; ^& [. V" P" ?2 [
          ADC_Handle.Init.LowPowerAutoPowerOff  = DISABLE;6 F( o6 x, o0 U: B* K5 ?9 G8 y
          ADC_Handle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */
2 E5 d0 J: m8 q! F& p          ADC_Handle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */
! {  S" K- C; v! C) _$ o          ADC_Handle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */( a3 q. |! m0 x2 X- q7 ]& M/ ]  s* b
          ADC_Handle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* 软件触发 */( V5 T& Z& L2 \6 X
          ADC_Handle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */. r3 A2 H7 ~+ m; b+ c$ s; N+ Z
          ADC_Handle.Init.DMAContinuousRequests = ENABLE;                        /* ADC DMA continuous request to match with DMA circular mode */
& [; p5 y- f; A* `          ADC_Handle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */3 Z: r$ n% b' W  R% Y  C2 {
          ADC_Handle.Init.SamplingTimeCommon    = ADC_SAMPLETIME_55CYCLES_5;0 ]' u4 t7 u! X4 ?. R
        : k) ^3 f* N# s  w* @2 s2 }
                 /* Initialize ADC peripheral according to the passed parameters */
; m8 t  h7 {1 D5 l! c          if (HAL_ADC_Init(&ADC_Handle) != HAL_OK)  //初始化
" D4 U5 Q1 x  Y          {% a. K" J" L/ }- J
                //Error_Handler();
  c- Z, y. T( q, ]* D1 [8 o: n                  printf("初始化失A\r\n");- y# [' W7 E3 j' g/ a
          }
& _% R6 n+ j6 _: ^         
3 T$ z4 F! m; T; r0 E//         . [, Z: X% T, f8 ~& D. \, y$ {
//          /*  ADC 校准 ################### */9 P# C' f7 n. L1 f$ z$ ?
          if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)
! [+ z! Z" D. @& ?" i          {+ S, k, A( @# l- H1 w
                //Error_Handler();
0 G" ~$ g  A1 t# I                  printf("校准失败\r\n");
0 k. g8 K/ {5 ^          }. _+ p0 H% J/ B: _* I
  //---------------------------------------------------------------------------
0 {# o( c; c3 j. l          ADC_Config.Channel      =  ADC_CHANNEL_0;! |8 e% H9 l7 L4 S  ?2 E% e6 j
         ADC_Config.Rank         = ADC_RANK_CHANNEL_NUMBER;7 z* q1 j0 r# V% t0 u8 }0 F4 J) l
    // 采样时间间隔        
5 x" Q& j2 z+ j+ P    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
( [) S. {5 T; A( [$ \         
1 r, e1 R, {" d2 U
3 N6 b$ N/ |$ E. D6 n4 Z          if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)- b  R- `/ o% _* r
          {% e, l1 @+ j. d& w0 s
                //Error_Handler();% [: Q: m' K( I4 t! W! J: p
          }: c2 E7 l7 R3 P1 @' N& ?
          //---------------------------------------------------------------------------
6 d4 h; k: Q4 t, I% ]3 |9 s% V          ADC_Config.Channel      =  ADC_CHANNEL_4;
! }$ O% u6 Q1 H* p, ~         // ADC_Config.Rank         = 1;
/ s' x" R' [. o( [3 R, W7 Y    // 采样时间间隔          Q: q3 {: @$ V# H) x, c6 B5 }! @
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;; z& F6 x( h8 z4 t* v2 H5 \
         
% B2 P, w! p/ r    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
8 w. w$ z3 D+ g/ E         
1 W6 Z& g# v! M          //---------------------------------------------------------------------------
! D" i; ~. h8 n; h          ADC_Config.Channel      =  ADC_CHANNEL_5;! W7 U$ k- k% p( o1 U$ k
        
" a, }' W1 B7 K    // 采样时间间隔        
$ G8 s/ G1 S5 h. B% @    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
! ], V0 F& a- Q+ X# ]         5 M3 k! V. w3 _$ P: S1 g
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);; `+ l0 {6 u( S# e) N2 }: U
        5 C" l( J2 @2 Q2 ~
        //---------------------------------------------------------------------------
: A5 R2 T! L$ x  ?8 B+ J8 L          ADC_Config.Channel      =  ADC_CHANNEL_6;
& ]  p( p, Q4 o% T0 R        3 Y" x& j7 c- B- Z
    // 采样时间间隔        
7 ?1 s! s3 n5 q  v) D0 }    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
# h( H. |% V2 X  |         : j; K2 H% z4 D' e% m3 E
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
6 Z9 A! i$ {5 a- M# T" J8 R        
# O2 ?3 x9 ?8 i8 o9 U9 b/ `6 L        //---------------------------------------------------------------------------9 L7 N5 w1 ^7 Y( u
          ADC_Config.Channel      =  ADC_CHANNEL_16;7 |! @& M8 \+ d: ?
        
# @6 f/ J# Q; x4 t# J% |0 {+ |    // 采样时间间隔        $ N; [5 `7 N; Z9 V6 n: q
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;. L  A: g; u3 w% }# q6 Q
         
& h- G+ G6 ?2 L$ F! H& v    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);  _+ Q  T! Z0 b
        : N1 v8 A$ E# F$ t* d1 s! y6 x
        //---------------------------------------------------------------------------
# P. I2 b( l. }          ADC_Config.Channel      =  ADC_CHANNEL_17;. B5 c( z" @4 U; e
         3 u, Z9 Z: X8 \$ q
    // 采样时间间隔        2 \8 |! B1 P, Z# x
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
8 @! x8 ~: ~% b* `" A3 z; t        & g: ?' z. Z  Z. @. S
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);- ~! F! _9 H, \( l* {6 W& g
        
, a7 N: ]. b7 S* P        
! L7 W& W; s3 B       /* ### - 4 - Start conversion in DMA mode ################################# */$ W9 V4 A. B. M& Y$ O, J
  if (HAL_ADC_Start_DMA(&ADC_Handle,9 Q, P: G- |! ?) {
                        (uint32_t *)ADC_ConvertedValue,6 J+ D3 u: m4 O3 n
                        NOFCHANEL1 t1 L2 W$ i2 A* `. C4 q) d5 S
                       ) != HAL_OK); n- Y8 A- h) S+ y, X0 Y
  {- X. m1 M4 F9 C& ^
     while(1);5 m9 g1 N" y# w& B
         9 B8 m" e, }) X6 }2 r1 C1 `( Y
  }: @4 j! q( M# j
        
+ G2 b% H, _0 J8 U; v5 s# j代码下载:! {* l  b3 G% A( p
FreeRTOS_多通道ADC-DMA _HAL.rar (1.14 MB, 下载次数: 0) ; D" `; S3 m. e0 `% q3 ]* A7 O4 F

% c' u) v/ X9 b& M- C/ J: r
4 S2 g+ |1 F7 J" v* Y- ~$ H

该用户从未签到

2#
发表于 2021-12-3 11:17 | 只看该作者
温度传感器怎么用啊

该用户从未签到

3#
发表于 2021-12-3 11:17 | 只看该作者
DMA怎么初始化

该用户从未签到

4#
发表于 2021-12-3 18:05 | 只看该作者
__HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-5 07:32 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表