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

STM32F030C8T6多通道ADC采集DMA程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。8 s% d* L4 n6 |
) k2 P6 ~0 x+ |3 _
. }/ F2 @' \) G* b
#include "bsp_cpu_adc.h"  I% V( u, h0 E+ {
#include "usart.h"5 o& ]# g( s8 Y% v

3 {$ R7 G. I3 J# {" W) ?/*4 X7 X! K4 k  Z- L2 F
PA0 --10脚
* Z) w/ V0 j0 h) XPA4 --14脚
8 M5 g# L8 _) i3 g, RPA5 --15脚& V; f7 t" y+ X1 @( m/ Z  l
PA6 --16脚
1 L6 x; g4 M$ z: W8 w5 \6 VAN16-----内部温度传感器
! G0 h) L; j  q3 ]AN17----内部参考电压. R. _( [# @" L

$ R/ U. E. z# b: C6 b6 U
, n, U! j1 l8 k6 H*/  S$ f/ e3 E% q! I

# |( E& f: Q% U3 D, q__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};8 Y- {  C% n2 Y6 }6 S' z" {, i

$ U2 s4 c4 ?, g$ I- f% D+ J6 cDMA_HandleTypeDef  hdma_adcx;
$ v, Q6 V. H8 O3 H$ j8 RADC_HandleTypeDef  ADC_Handle;7 \; w; J3 g% J- H: }; _! Z
ADC_ChannelConfTypeDef  ADC_Config;
- N0 q# c$ r' F3 ?( i/ S+ q: Q! u4 r, L: y0 ^; W5 ?) c, {& r  t5 u! ?) e
+ {+ e5 k2 K' x8 u, V0 \( P0 Z
static void Rheostat_ADC_GPIO_Config(void), c# Q5 ?( \! d7 m
{
$ F- }( I8 J4 f) D0 V6 e         GPIO_InitTypeDef GPIO_InitStructure;
- Q, u( h3 t; A" Q( F# }         // 使能 GPIO 时钟& ^5 _- W+ Q/ E6 `( N0 i
        __HAL_RCC_GPIOA_CLK_ENABLE();
/ L! D+ A5 l) ]         __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟" a% k' Q+ `" [, x8 I# n; u
        // 配置 IO$ ~: _. n3 ~! ]
        GPIO_InitStructure.Pin  = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;* c" [& U8 v9 \& D. L1 Q( l' o4 G
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;  //配置为模拟模式, o( C& A+ E" n7 n2 m8 N
        GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉7 {1 q9 \+ M5 N5 K! \
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);        ' O2 t. W. Q8 I8 s. a/ I% |
}& b/ @6 P1 r8 N7 D/ y
  q9 q7 ]( y, v3 |( r. c# j

' k: q. H: ?/ I5 b7 B, C9 a8 b% Q  F: o- z

$ J  K. g% ~) M* V$ ?' z' C3 Hstatic void Rheostat_ADC_Mode_Config(void)) l, `0 i+ r; Z. q  p9 G4 b/ Y' C
{, U/ B) A: n& u; N0 `4 V
        
9 ^" ?- ]. x3 c8 {& B+ S, i/ v" [" ~        // ------------------DMA Init 结构体参数 初始化--------------------------
: S3 D5 a! K7 K- e, s! L6 m+ Q        //DMA_HandleTypeDef hdma_adcx;
/ e! j5 [" b: S1 B2 l% E; x9 b& w        // 开启DMA时钟+ F0 b" |1 f8 i1 ]/ j1 F
        __HAL_RCC_DMA1_CLK_ENABLE();4 e4 g( q/ ?3 Z' l' c+ F
        // 数据传输通道
" g( v: w& B+ C$ S6 v. c; c        hdma_adcx.Instance = DMA1_Channel1;  //通道1: g- w3 c! Q- M! |3 P
        
, m4 J5 M$ I  X6 [         hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY;            //存储器到外设
' H' o* t& c( q$ \     hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式6 H! U: q* Z" [8 w8 ~
     hdma_adcx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式2 ?0 o2 u7 p! H/ ]
     hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位
2 _5 U; d4 J5 a# K- e     hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //存储器数据长度:16位
' V% e% y1 {2 ]( X3 y2 Z     hdma_adcx.Init.Mode= DMA_CIRCULAR;                         //外设普通模式9 |" V/ N1 P5 Q# V  c/ e9 e
     hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
5 |: \! @: G5 Z7 S! q3 U        
" ^8 n0 y5 E: F. Q- _) x" p' e        HAL_DMA_Init(&hdma_adcx);                                   //根据指定的参数初始化DMA" u8 O% s7 x7 U& W6 `1 f' q
, M7 x: Y4 \1 T
    __HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx);          //DMA句柄关联到+ Y1 i8 i. {( t$ b
        //---------------------------------------------------------------------------& A) u6 U5 o; `# W7 ~- _
    // 开启ADC时钟6 }( |: Y2 X' {+ S
         // __HAL_RCC_ADC1_CLK_ENABLE();3 Z$ g1 a+ j! s$ G1 z
          ADC_Handle.Instance          = ADC1;
- ^* m& e; D3 X, u4 s  if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK)
) s) f* N, v4 R  {
) T1 R; y4 K' V5 u8 x3 y% i    /* ADC de-initialization Error */
/ [9 Z3 K  e+ W- ]   // Error_Handler();
2 _) K. g7 z$ K4 Z  V0 p- H- I0 f8 {  }$ k1 }7 o8 G6 f* U3 t+ r. L
      ADC_Handle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV2;      /* 同步时钟模式,带prscaler 2的输入ADC时钟 */) _4 F2 ^8 H# w/ ~0 A) ~* s. G
          ADC_Handle.Init.Resolution            = ADC_RESOLUTION_12B;            /* //12位精度 */
1 E6 t" |4 P8 `) r+ h* r! \+ D8 J% R          ADC_Handle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* //右对齐 */4 q( a# O0 z# _# Q; P1 q
          ADC_Handle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;    /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
. N! R# z+ i' A5 k: h          ADC_Handle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */
5 Y; v# U8 T2 B( m: v. ~# u          ADC_Handle.Init.LowPowerAutoPowerOff  = DISABLE;
$ @+ i. e$ E% U2 r          ADC_Handle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */
! h& T$ x5 o- q          ADC_Handle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */2 @# i) O( P5 T4 |* @  J: o! e9 A
          ADC_Handle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
( P' g4 F8 }! ^          ADC_Handle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* 软件触发 */
+ n. `. {' U, j          ADC_Handle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
1 D) l! j# f. s/ f  {) d          ADC_Handle.Init.DMAContinuousRequests = ENABLE;                        /* ADC DMA continuous request to match with DMA circular mode */
  x' `+ C- N1 ]          ADC_Handle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */
; b( {/ U9 P$ H  e6 z+ ]# L          ADC_Handle.Init.SamplingTimeCommon    = ADC_SAMPLETIME_55CYCLES_5;
* k% D6 R/ f" Z! T        8 F1 A+ ?6 N: G. T6 n
                 /* Initialize ADC peripheral according to the passed parameters */
. R3 P* ?. ]% f( u          if (HAL_ADC_Init(&ADC_Handle) != HAL_OK)  //初始化' f8 p6 w5 n/ X. p7 F7 ]7 U
          {$ X. }4 j) s3 v0 E- U: o
                //Error_Handler();
! T$ J& v5 t9 p; n: u2 `                  printf("初始化失A\r\n");( e/ @% @& ?6 U9 D5 B- v
          }
9 J) U% z0 w  W; y         
- I& c8 K+ V" ], }//         7 J* D) U$ j  s' R
//          /*  ADC 校准 ################### *// o9 w2 `( F$ m
          if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)
/ n' V6 b% a" n          {
( V5 ]* k1 F7 o) C                //Error_Handler();
% q" W: q% g( w/ i: b" U& m9 o                  printf("校准失败\r\n");
' k- ]  e; F  R8 T  I          }
: X" h2 \& }+ _  //---------------------------------------------------------------------------
) Z8 \  a  x2 v/ T. E) z) S  ~          ADC_Config.Channel      =  ADC_CHANNEL_0;1 j) I3 N: c9 V3 h. g
         ADC_Config.Rank         = ADC_RANK_CHANNEL_NUMBER;( F! l* Q7 L% H/ h! {' P
    // 采样时间间隔        
' |: ]# Q" P: S7 [8 m7 m    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
( j0 Y% q* `) h, n  k, W7 \9 J5 G         
. l$ H8 }# @6 Q! r% _
$ P' A3 A7 M0 h          if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK): R3 C, p/ }, h9 o( F
          {
1 m  Y# |7 N. \( Q3 w                //Error_Handler();
- j* k5 e* Y; N: m+ A# F          }" l. _7 i) r5 D$ X
          //---------------------------------------------------------------------------0 E/ {! I) _9 C. O& d
          ADC_Config.Channel      =  ADC_CHANNEL_4;
* @$ k  W: T4 {7 b2 R/ D         // ADC_Config.Rank         = 1;
. C0 d0 ~8 h4 {1 R* F4 V  c; O* O    // 采样时间间隔        3 q4 L2 g& v4 w9 x' T+ h
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
! l. I5 i/ R  |9 @: V         % Q$ E0 g4 b: E5 Z7 R% z
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);" `4 u" L% [2 q1 D. |
         
* F' {# Q8 L, z, [0 u! B          //---------------------------------------------------------------------------
$ H" O+ G0 l. B% D$ |7 a5 l1 O          ADC_Config.Channel      =  ADC_CHANNEL_5;4 D0 c0 N, F: V3 {4 t# ~
        
# q7 c! V3 Q: T$ V( n4 q9 s  f    // 采样时间间隔        9 `9 R$ x6 c* R0 u
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
2 i' K0 x& a( O' D- s         $ S; |% S2 n" z0 }' m6 i
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
- w7 U0 S  F2 O( J: Y, H. ^        
* t, \2 H8 P9 \/ C        //---------------------------------------------------------------------------" s" g& g3 V# a$ Z. w$ G5 L
          ADC_Config.Channel      =  ADC_CHANNEL_6;& l- Q# a% l; }! M: x3 a; U" e
        ' H1 Q' D0 r/ I: j7 H9 z
    // 采样时间间隔        
5 e5 n$ S1 k) P3 A9 D; I6 Z    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
! C) f0 N4 o8 \+ K! ]3 s         
5 j8 r; P$ r) F    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);/ u# I- H+ D9 ~+ a& m
        
7 O! q' a( d' o* D: i( u. s        //---------------------------------------------------------------------------$ i" [% G4 C# c/ U+ Q2 N; d& ~% m: b$ P
          ADC_Config.Channel      =  ADC_CHANNEL_16;" z0 F) G3 {+ d* u
        * Q# |1 P: G6 d5 p1 D
    // 采样时间间隔        $ n8 Q' ?0 p! A0 V, q* W, j
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
- r  z/ a1 b" k3 T  X3 @         
0 @) \  `4 ?) y0 n1 G7 q    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
9 Q: _7 A$ W; @" d3 m+ w        3 Q4 P7 ]( d+ w6 b" i% @+ n
        //---------------------------------------------------------------------------2 a1 G7 T* Q0 q; t
          ADC_Config.Channel      =  ADC_CHANNEL_17;
: Z1 ?+ I6 U( v+ `* U         - o8 S" t6 O& ~8 g; _: k
    // 采样时间间隔        
0 J' q6 a+ y8 @$ T% D) M, l+ @9 J    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
! r$ b0 ~+ p+ d, Z6 w        - ?4 Y' u( b: ?' F
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
! S0 K6 B# b5 V4 c3 Y          i0 t3 n2 _$ a. X5 ]- ^
        
; b. e: `: O) Z. p' w' v+ D       /* ### - 4 - Start conversion in DMA mode ################################# */# m2 c0 N" ]9 E7 G5 e  @& e; J
  if (HAL_ADC_Start_DMA(&ADC_Handle,5 `4 ~0 Z" c& @) B% ~
                        (uint32_t *)ADC_ConvertedValue,6 U) b) b% G) U1 d0 d2 Q! r
                        NOFCHANEL$ w3 n/ j. m0 D$ |
                       ) != HAL_OK)
/ f/ Q9 x5 m2 {! C" L* U. T& l3 w( ^  {
8 w$ s, K: @1 y0 G, F& s& O6 ?2 t     while(1);
8 E# r) ?) T: V- t9 y         ) k5 x. _7 \5 S. J0 s
  }3 W' K* i# R" w% ]4 l, S9 Z
        ( l! N* s/ r& R. D5 \* p; [' }
代码下载:& |8 @3 a! P7 ^8 E& g
FreeRTOS_多通道ADC-DMA _HAL.rar (1.14 MB, 下载次数: 0) + J8 U( Z6 l$ s9 s9 P& w! ?1 ~

" }8 Z3 \" J+ \2 o( r- {) h
" j# e1 f1 l! E( h+ n

该用户从未签到

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-7-18 09:29 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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