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

STM32F030C8T6多通道ADC采集DMA程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。* W7 p+ Y& @6 C' G
7 \. p0 \3 o0 ^1 u* D% c3 Q
/ b+ A/ l: [& R$ W/ w! ~% J7 B
#include "bsp_cpu_adc.h"
9 f/ h6 d& A/ p#include "usart.h": G, [$ T, W: V3 e
* ~" V  \3 F# @! K/ S3 z8 f
/*
7 b& o) R; y. j7 A( [- \/ CPA0 --10脚  s+ [# C9 y  q6 i
PA4 --14脚
) y+ g* D' C; f+ G& m- n, l8 r: tPA5 --15脚
) m4 s: s' [* s5 Q( GPA6 --16脚
6 X: k! w" \4 ^AN16-----内部温度传感器
" Z4 v+ P  {0 D( K3 ~4 kAN17----内部参考电压+ q# X& h. U- T' L- c3 r6 w
/ i3 H( w0 p7 U1 A6 T

# G0 ]" Z2 u9 ?. f*/
$ J- Z$ G( f2 ]3 R$ O
% y& K, J% ]$ q# a9 F/ E* ~! X# {__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};' j4 O# b6 x& K  }
; s+ u( f5 i+ \8 w" J
DMA_HandleTypeDef  hdma_adcx;
% D, s' w; Z9 C; x# [/ s' i, uADC_HandleTypeDef  ADC_Handle;, |$ K. ?- ]8 o) m9 m1 O) @6 d
ADC_ChannelConfTypeDef  ADC_Config;6 a! W; Y' H7 \  L; Y1 M

0 l% R4 C. j5 L# H2 l
" M: U3 R" ?; O2 q$ F( a9 f+ Y; sstatic void Rheostat_ADC_GPIO_Config(void)/ N& H2 j3 a# l. s8 _
{
& J/ N! v8 T2 B: q: |. W         GPIO_InitTypeDef GPIO_InitStructure;
+ ], s& X' T; r         // 使能 GPIO 时钟' q+ X2 D# C9 Y! P7 K' z
        __HAL_RCC_GPIOA_CLK_ENABLE();
+ y* |$ Y4 s3 Z/ W2 T( m( X$ p% l5 O         __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟5 b. n  n8 N# p+ l  N( x
        // 配置 IO6 Z5 Z7 ]: u' ^% }
        GPIO_InitStructure.Pin  = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
- ^9 l% m! D; X# A0 E7 f: \. n        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;  //配置为模拟模式5 i4 S; ]. W& L# x) V. W! R
        GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉. _# x2 Q/ I6 A5 w1 t. ^
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);        
& }, U* T# a7 A& Y' L}
& Y* \7 e$ b* m3 Q2 J& _% @  g9 g: D, }1 O1 O# v
- [9 x. y1 s0 m& ]/ |8 q
6 ^/ \9 }7 l4 P, h: d

( {1 z/ Y3 m/ V: F  }+ P4 \static void Rheostat_ADC_Mode_Config(void)- {7 R2 O) w" {* ?
{
: u( m: i4 K) s, k, S  x& C        
$ i' B- q/ f* u        // ------------------DMA Init 结构体参数 初始化--------------------------
! f1 ]( Z+ v0 k; s$ z; D0 v        //DMA_HandleTypeDef hdma_adcx;
+ ^; h  V$ Z) p& O        // 开启DMA时钟
7 o$ v5 [$ G& y8 d# J        __HAL_RCC_DMA1_CLK_ENABLE();% ?9 W$ T4 B6 I' w8 V, l$ f; z
        // 数据传输通道4 l* H5 D" Y/ ^% f+ V2 F
        hdma_adcx.Instance = DMA1_Channel1;  //通道1
/ s0 K- v4 ?, r7 A! L        " F  ^' h; i- w
         hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY;            //存储器到外设
2 }& V: w* }3 Q- [     hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式; U- Y2 {6 y  l* O* S4 z
     hdma_adcx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
- M) `4 T0 {7 A  k. n% w     hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位" I  L+ T9 Y! T1 [
     hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //存储器数据长度:16位
# `" ~/ }% C( M$ W     hdma_adcx.Init.Mode= DMA_CIRCULAR;                         //外设普通模式
3 R* o; j+ {& p! i     hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
, i& H, f  s6 w/ M        
$ w; J- F0 t# R  b# }        HAL_DMA_Init(&hdma_adcx);                                   //根据指定的参数初始化DMA+ ?' o/ |) L9 A1 E

. `* e8 @0 ?+ y5 P7 \1 P" E' p    __HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx);          //DMA句柄关联到0 J& A+ C( q: I7 q9 c! D
        //---------------------------------------------------------------------------
, b+ A$ X. A8 u3 k% [* f    // 开启ADC时钟
  [% _. L& P- [5 @  l  H  D         // __HAL_RCC_ADC1_CLK_ENABLE();
3 X3 `/ C6 o# ?& o( P) m5 U          ADC_Handle.Instance          = ADC1;
- ~. S' _2 T+ Y8 i  if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK)
+ N0 _- O3 u) `; r& k  {
2 H. K' p" |0 ^; `    /* ADC de-initialization Error */
4 ]7 L# M- O; x+ ]   // Error_Handler();. A* p8 p8 T3 \! v, G* N+ i
  }0 p' v, T3 @5 `( ?( I  D0 c% j/ @
      ADC_Handle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV2;      /* 同步时钟模式,带prscaler 2的输入ADC时钟 */
& w( Q+ X1 f& M( r. z9 M+ l( {/ b          ADC_Handle.Init.Resolution            = ADC_RESOLUTION_12B;            /* //12位精度 */8 R( V. |2 d/ h4 \8 {
          ADC_Handle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* //右对齐 */! X. `0 |- D" N! N
          ADC_Handle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;    /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
. S5 f( Z. Z& [# D! k          ADC_Handle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */3 F4 B3 Q& s: S+ }* Q  w  L
          ADC_Handle.Init.LowPowerAutoPowerOff  = DISABLE;
5 U* E( M$ m1 `$ E          ADC_Handle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */
$ \( ]% l: ~  C+ F* s( u7 V          ADC_Handle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */
$ Y* @1 q4 T& h9 _- p% M' q1 @          ADC_Handle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
) r! c. ~- V4 V) m          ADC_Handle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* 软件触发 */
/ P# V4 e' c5 \1 j# A* b  g          ADC_Handle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
0 d5 \4 a9 Y% X( R& s% e2 C          ADC_Handle.Init.DMAContinuousRequests = ENABLE;                        /* ADC DMA continuous request to match with DMA circular mode */
! J" c. V( L* B          ADC_Handle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */
& O. K5 I6 |9 G. [. {5 y          ADC_Handle.Init.SamplingTimeCommon    = ADC_SAMPLETIME_55CYCLES_5;
- G& Q6 a4 c8 N! _5 T/ ^        $ n: Y+ `7 j6 ^. K% A
                 /* Initialize ADC peripheral according to the passed parameters */6 T4 |0 n7 R( n) \
          if (HAL_ADC_Init(&ADC_Handle) != HAL_OK)  //初始化
( p' }; p- f6 M/ k( d          {1 u+ N( B8 |! o$ C( S& S4 o+ g! p
                //Error_Handler();
5 ?; z+ E5 x9 f  e  U3 v6 N                  printf("初始化失A\r\n");
" K0 a$ n4 H" N2 \8 Z; V' v4 T          }* A4 J+ q$ h" M2 F6 ?: x; [
         $ A, }8 m+ V- Y5 c/ P( Q3 r
//         9 X$ U3 C% }: a! M- E, I: ]
//          /*  ADC 校准 ################### */
4 j; {# A' n0 [; c) {4 q: ?          if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)
1 ^; X4 [5 r( ^0 a          {
5 f' R5 o6 K' u( y+ P                //Error_Handler();
4 o( c9 A7 p" N8 t4 M                  printf("校准失败\r\n");
, @7 Z& c% [4 r' m* [- I2 a7 m          }
% H3 y. X3 X/ [* f, a4 L8 x  //---------------------------------------------------------------------------/ Y8 }/ U, S3 \( W* a
          ADC_Config.Channel      =  ADC_CHANNEL_0;; x" O+ t, X5 N1 Z1 V
         ADC_Config.Rank         = ADC_RANK_CHANNEL_NUMBER;
8 D7 s. J' }! A    // 采样时间间隔        / v9 e4 K8 t1 a: G8 r
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;4 O7 v% C) N5 Z6 t
           G9 ^, K, ]+ R1 b. b7 B
* t$ L6 G3 g; h+ L
          if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)
; Z+ B/ l, r, _# j: r' F          {
" Y% D% _- x7 e1 T. V                //Error_Handler();* V; I3 e8 \0 W2 m- n- [9 y; D& u
          }* V2 T+ p: V0 J  Q$ O
          //---------------------------------------------------------------------------
6 o8 b6 I2 ^! H' [! C          ADC_Config.Channel      =  ADC_CHANNEL_4;3 X5 D. M# M% N' R! y' q0 O
         // ADC_Config.Rank         = 1;
7 i2 u% q$ `2 F8 Y/ Z6 @& M    // 采样时间间隔        4 ]+ D" r) g5 T$ b: J5 ^* d! V: H
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;, H. @9 I, p" W, B
         
& ?) ^& }, d' ?% {7 S0 z' L- J  n8 l    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
5 L* V. A3 R7 R9 q& y6 Z         
7 L/ N8 @4 \2 l' i$ l/ I2 I9 ^          //---------------------------------------------------------------------------
9 m  q+ |' J. \1 }          ADC_Config.Channel      =  ADC_CHANNEL_5;1 E1 \4 t) E; t) I& M6 H0 {% i
        & t" P( v/ m! C8 ~& @4 U" ^- h" [7 k
    // 采样时间间隔        $ W7 @" `& E* G$ P2 e4 o2 l
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
1 p4 s; d. c  l6 i) x  r/ _8 [% G         6 _# h' f! d1 D* j4 C$ E
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);; C8 {+ x7 N$ B0 ^( ~
        7 J3 I) V+ O2 Z% @9 G$ `) z, h! R
        //---------------------------------------------------------------------------
2 V4 V( m) y) P. {, f+ H. r9 n4 L          ADC_Config.Channel      =  ADC_CHANNEL_6;( n1 Z3 T8 W5 o9 n
        # j- T4 [2 l& d4 h
    // 采样时间间隔        
: P/ M% i9 {3 n: Q0 e2 X; m    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
0 ]- B2 n- ~  s, Z# u) N# ?7 R         + |/ \  @. b( j# I, K
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);0 ]- y9 R' R  b. P$ T
        
5 T' E3 T* m1 T4 c$ q  j        //---------------------------------------------------------------------------# P+ y1 P) u  _7 `/ U' }
          ADC_Config.Channel      =  ADC_CHANNEL_16;+ Z3 q2 N8 o$ t& A5 t) B' p
        . p5 S1 N/ o7 ?! u# |, B* b
    // 采样时间间隔        
' x1 _; H6 U) \2 w. q    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;$ W: |, n6 d2 I  _
         ) B8 L' P. j. p6 S/ }
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);8 S9 d4 ?* ?- m& I( v8 U' d# r
        * b/ j9 i8 R; H6 g- j
        //---------------------------------------------------------------------------8 d7 q4 T2 }) B: w5 Y2 c
          ADC_Config.Channel      =  ADC_CHANNEL_17;# `; K/ X$ o: m; h- n( F3 s: a9 t
         
2 W7 ^/ k2 R2 z( v5 D' z    // 采样时间间隔        
3 }# r- I7 A9 {  e    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;- S5 ?$ g/ ]. S* ~1 u' F
        
3 m3 W/ h# A# \1 Z( [    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);7 ?8 ]; e# A* `' l
        0 S' Q- \3 D6 o; a' [/ R" p
        
5 [8 G/ ]8 s* f4 B! f6 }4 _       /* ### - 4 - Start conversion in DMA mode ################################# */
, Y4 O, J9 ]8 Z  if (HAL_ADC_Start_DMA(&ADC_Handle,; {0 X9 h5 r( q! t9 x
                        (uint32_t *)ADC_ConvertedValue,
. |# b: R% M# U3 z" z                        NOFCHANEL" E/ B6 J) b+ d4 k) G
                       ) != HAL_OK)) Q. J8 h7 F" c2 c# N( W. F
  {8 d& n0 b/ i% r& m, ]" W  J+ l
     while(1);/ m; J8 t- w) p3 f5 A" R: `
         9 U3 q+ }9 i. q! C: I  G
  }+ z7 N9 h/ J& o, _; |' b/ s
        
/ H8 n8 W% Y  \. U% ?% X代码下载:
, ~7 l6 N3 F5 B5 L3 ^/ C FreeRTOS_多通道ADC-DMA _HAL.rar (1.14 MB, 下载次数: 0) - P4 }& m- }* _" v
$ Y3 c  ]/ G) b9 k/ ?! v+ z! _
! {, ?% e' u; ?$ V7 I

该用户从未签到

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-10-12 13:14 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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