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

STM32F030C8T6多通道ADC采集DMA程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。$ _4 J1 S. o* d/ v: @
* r! v1 N) t2 |1 y

5 }3 a: [2 H4 V, g; d8 I  j4 [#include "bsp_cpu_adc.h"/ a& i; c) |$ p! A- y  s
#include "usart.h"
% b* C( R; b" O" j* q) W
- b7 b* T; ?7 ^6 \% o  j5 c/*
6 r, ]6 R# A& I4 X% bPA0 --10脚6 }! l/ G$ Q4 T2 x/ ^1 ?" M/ ?
PA4 --14脚
: [: \) m- X' Q- SPA5 --15脚5 e' k, p2 g% @" @8 b
PA6 --16脚+ i1 t7 D/ H5 R( t" N+ K9 U* B1 A
AN16-----内部温度传感器
3 [5 P+ N5 G1 o+ J' l0 }* qAN17----内部参考电压  I" W: `' l' e4 Y4 R& ~/ E) b" c5 ^6 j

4 ?( R1 _5 u/ Z' a% D- r) _* L3 d( j9 [' j. V" W3 @
*/# e: F# I3 k# U8 U4 v( L; K' w

3 a9 t, q  D. i# i__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};* S. D# m, P1 }1 N5 O4 t) h
+ R0 Q7 Q6 w  p8 N1 v, E+ X
DMA_HandleTypeDef  hdma_adcx;+ ^6 D! J( a6 ^8 `. \7 f) }2 \
ADC_HandleTypeDef  ADC_Handle;
4 E. j& x. ?. W3 D+ ?ADC_ChannelConfTypeDef  ADC_Config;
- {8 z9 f0 n( M7 W! b9 M* _
$ C: z/ f- Y( |0 q
* N; L4 |9 k, e: ^static void Rheostat_ADC_GPIO_Config(void)7 V7 Y* W- {" ]. c; w* ]4 b1 t& M
{/ a' [# ^; k4 u6 p8 k& N) N' e
         GPIO_InitTypeDef GPIO_InitStructure;+ R$ ^" Z9 r' E2 L
         // 使能 GPIO 时钟
6 d. h% A+ S5 Z/ Z4 P) C& B        __HAL_RCC_GPIOA_CLK_ENABLE();
. c1 @- M9 `$ V& X6 u1 h2 R         __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟
0 _8 C, R; A! m1 p5 x1 i, C        // 配置 IO
. d; l; C; o+ z, J! I1 j        GPIO_InitStructure.Pin  = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
, [( P: T/ Y5 I2 _& Q        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;  //配置为模拟模式; H) L9 I; K# P
        GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉: Q! G4 Q6 g- F5 q$ H. Y
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);        * U+ ?6 E0 l8 ~9 R7 u1 H) |
}
3 v4 ~$ ~, C# h! {$ U" P% M2 @5 F0 o# u- `5 K3 @! o8 T

) i8 C; O' ]) ^0 J0 k) K& p! f
* K8 A3 ?3 q! r3 R
& ~5 {& [. y9 D6 p( c. y* o+ \* X! e  Gstatic void Rheostat_ADC_Mode_Config(void)6 ?& E+ i5 T  T( [$ H+ @% X
{: s$ k; V- t9 C5 @, m
        
) b- O* B' \/ ~+ |) E        // ------------------DMA Init 结构体参数 初始化--------------------------
) B/ R4 [7 Z+ J4 P& m# c        //DMA_HandleTypeDef hdma_adcx;, r9 P* h& P. L4 J( D
        // 开启DMA时钟. z/ s  m. ]* I- \7 p
        __HAL_RCC_DMA1_CLK_ENABLE();9 e/ f5 t# A9 a  Q
        // 数据传输通道
2 Z/ z3 O5 }: ~& H        hdma_adcx.Instance = DMA1_Channel1;  //通道1) L+ g& `% e: D# O0 ?/ y% ^* P3 G4 `
        
. ~/ L8 D; e$ H# r/ {7 ]         hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY;            //存储器到外设( L0 I. N9 S, f6 R- W8 ^/ \
     hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
0 r/ I2 ]% K6 q% k     hdma_adcx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
$ W0 I3 E! w7 G* I8 _+ h, Y     hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位: t7 f& X$ T" I* d; @" \
     hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //存储器数据长度:16位" q1 f, L2 [3 ^7 j: D7 |4 P
     hdma_adcx.Init.Mode= DMA_CIRCULAR;                         //外设普通模式& j1 J! \, J* p  |% ]
     hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级% r5 `5 n4 U7 k' @' Q+ V9 a$ N( u
        " A+ f8 I, N; n  n2 u9 A
        HAL_DMA_Init(&hdma_adcx);                                   //根据指定的参数初始化DMA+ S) E8 t7 v1 p9 r
5 y) J0 T# Z' P# j0 h8 [! n  W
    __HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx);          //DMA句柄关联到+ `! r5 L( d, e
        //---------------------------------------------------------------------------' }2 j/ u' q& l+ @: P9 F3 c: ]  R
    // 开启ADC时钟
. b0 |! x: z% R- B         // __HAL_RCC_ADC1_CLK_ENABLE();" o# A4 N- t4 t, s2 I
          ADC_Handle.Instance          = ADC1;1 T, O& i0 a  r
  if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK), t8 b8 w5 W( s" p) f2 ^
  {
0 X9 ^; j  n% Y. P$ f; `    /* ADC de-initialization Error */7 P) J  s3 C( t
   // Error_Handler();! r7 U1 j/ f" |: }4 Z; n1 V
  }, e4 l  s/ R& O. h4 D; j
      ADC_Handle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV2;      /* 同步时钟模式,带prscaler 2的输入ADC时钟 */1 v9 O& o& i3 r6 P# B2 \/ a
          ADC_Handle.Init.Resolution            = ADC_RESOLUTION_12B;            /* //12位精度 */" P+ e. ^% k; ]1 [+ C! c. o9 a0 J
          ADC_Handle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* //右对齐 */
4 p' }2 ~# K) U! w6 a1 E          ADC_Handle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;    /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */# v3 @/ I* @0 G3 `9 O1 c
          ADC_Handle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */- O4 q  ?. K& W1 G+ u& W0 n
          ADC_Handle.Init.LowPowerAutoPowerOff  = DISABLE;
( p& r' C7 D) W, r3 j) {) v7 U          ADC_Handle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */7 t7 K/ T: j2 l9 P; E
          ADC_Handle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */
( n0 a# B* V- A- K          ADC_Handle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */. [, f) Z8 M( S, J) S
          ADC_Handle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* 软件触发 */( i( Z* ^4 U0 I% z- S
          ADC_Handle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
; \+ t6 Z. p4 Z- H          ADC_Handle.Init.DMAContinuousRequests = ENABLE;                        /* ADC DMA continuous request to match with DMA circular mode */! x8 N" A' h4 {" E+ [
          ADC_Handle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */# `5 C- _/ ?6 z6 ]- m- i6 L
          ADC_Handle.Init.SamplingTimeCommon    = ADC_SAMPLETIME_55CYCLES_5;5 q. x  B; s- ?1 b& A
        
7 T7 D+ v7 C& A. a% |* J( c! U                 /* Initialize ADC peripheral according to the passed parameters */
- T5 i( U0 O5 R          if (HAL_ADC_Init(&ADC_Handle) != HAL_OK)  //初始化8 Y1 z: Q! ?/ s1 r* _# ^6 L9 y
          {
0 ^* o8 [% r3 g) v. e2 |! g( s2 S                //Error_Handler();
9 F$ N" N0 M1 W$ M                  printf("初始化失A\r\n");
2 [2 }$ e3 M  A" f          }
* a; C$ T' K! M2 d, X! u5 N         1 T! }* l& W1 j2 d+ o# Y3 Y
//         
% j' r! v+ c6 q4 X; z//          /*  ADC 校准 ################### */8 d6 h8 t# c2 Y. a8 n# h
          if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)6 ~" {, O% ^: m1 `$ a  g9 z8 K
          {5 l. Y7 a5 h) n' o+ m
                //Error_Handler();5 f0 F; t( b7 L" P
                  printf("校准失败\r\n");2 O& S5 I0 C/ M) f
          }) H( e+ e6 Z4 U. r9 j! S# x6 I
  //---------------------------------------------------------------------------6 _9 o, t, n: k+ y6 ^8 F# y
          ADC_Config.Channel      =  ADC_CHANNEL_0;# r" Z1 W" @! R/ q
         ADC_Config.Rank         = ADC_RANK_CHANNEL_NUMBER;
; d) F2 ]0 S' Y, {3 @) C% q, f9 Z    // 采样时间间隔        7 C$ e  \9 i* o3 F" ?& g
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
# M$ C0 O" _# z         
! k& ?$ ^/ `/ c$ ~: d  K
) e( D2 |. y! ^          if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)
3 ?& I$ {/ i4 F5 Z0 e" d          {) q8 g0 H6 G4 @& y
                //Error_Handler();
2 p* E; p8 N- f, p0 X, p          }
- z6 ^* y5 h+ i          //---------------------------------------------------------------------------0 h  h+ K5 e. q! N" `( W# }
          ADC_Config.Channel      =  ADC_CHANNEL_4;
/ c- h5 d  V) z. Y# p( G) l1 J6 g         // ADC_Config.Rank         = 1;/ K- [' P# e; H2 Z: E- E2 K
    // 采样时间间隔        & [0 X/ C4 Q- @- l' R
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
" S) s% U- a6 W1 c         
" z  S1 q1 w& [    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);' r. o6 C9 W3 v& g
         - A$ k3 H9 p% m4 j
          //---------------------------------------------------------------------------
* _* s8 p1 p! E$ ~5 O  u          ADC_Config.Channel      =  ADC_CHANNEL_5;
. l8 x9 Q0 g3 ^3 X9 |# j# G" Y3 T! H        
, e; v! b& y; Y! D    // 采样时间间隔        
' ]" @0 T& d( q5 h+ K" Q    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
0 T# l1 k. f% w. w         
; x  E: e  ~# z3 O    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
0 h- u; o% D/ ^  h        
( M6 W) z: r) S& W; I, E        //---------------------------------------------------------------------------: _4 _$ B8 {5 _' U. |  D
          ADC_Config.Channel      =  ADC_CHANNEL_6;9 ^0 o+ _8 F8 ?3 @5 }# n' I
        7 a. U& j' M' v
    // 采样时间间隔        4 V1 h: r0 K. L0 x# ?( h% s
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
5 m3 w+ W! z% @* q         ! i) O# I1 A0 l$ n
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
3 Z! W6 Z1 }. h( M$ ]        / \5 S! O4 j1 W4 r+ |  s
        //---------------------------------------------------------------------------* I* A; `) I% p0 n6 j/ \4 z5 d
          ADC_Config.Channel      =  ADC_CHANNEL_16;3 L4 }; X5 O; C0 y% S  q% @5 \
        5 G1 ?7 O* c) L2 A" I# a% M- A
    // 采样时间间隔        4 w' R' D- T  {" P3 W( v% _& s; K) r
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
* `1 H" `# z6 Q, w" \, I         
/ y. H! {, i1 W* `/ ~% ^  e9 K! R    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
' x' u" c* D/ V& Q1 n. b! P/ b        
. |/ F1 r" b0 r% n$ h( |        //---------------------------------------------------------------------------% s1 x; w5 l6 A8 ~% }, n) `& `
          ADC_Config.Channel      =  ADC_CHANNEL_17;3 _9 T, b) `! ]  Y* R" s2 t
         
9 L+ R& [$ l5 L    // 采样时间间隔        8 |$ }" O' f, g2 B2 s8 ~
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
- a, s1 z" R: h, J$ H. M: q: i        
8 \, I8 g' F* U) d    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);0 {! k! b+ X3 J" e/ C2 l! p- u0 s
        
! M% O$ x2 A( T) Q- E4 d9 S        
! t7 S( A2 I% |2 k3 i: u       /* ### - 4 - Start conversion in DMA mode ################################# */8 o% a9 \! L' V+ g# h$ e2 K
  if (HAL_ADC_Start_DMA(&ADC_Handle,
, ?3 N$ x& s. Z, \: ^! }                        (uint32_t *)ADC_ConvertedValue,& e- c' v8 l. ]
                        NOFCHANEL0 o6 k+ K; ~5 y* V
                       ) != HAL_OK): n. ^8 }3 d" R8 Z% |
  {: {" x. t, U" Y$ S
     while(1);. t" A+ `7 D- m. R; M
         
' A9 h9 g6 @! G/ }/ k# F) @' w  }
: q3 s" n/ J) \4 I" }+ K) S' r        " \: i! \5 g: Z' {) s: v
代码下载:4 S- u8 H0 W  o6 R! ]7 k% C7 A
FreeRTOS_多通道ADC-DMA _HAL.rar (1.14 MB, 下载次数: 0) " T. E, }7 Q" v2 d- `2 d- N2 l
) \( _: h4 d  P' x
; d% u9 c1 I& P" R1 l5 {8 J' {# B

该用户从未签到

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-6 05:32 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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