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

STM32F030C8T6多通道ADC采集DMA程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。
2 V" t$ Q$ z, n. ^* u; ~* {9 [& }" \! ^# B
+ t, g1 \, `% P9 ^* |- W9 r2 n$ v
#include "bsp_cpu_adc.h"
* E! H4 L% @/ L% L; a  b#include "usart.h"
/ O: l* z5 Y8 b8 q% U3 a+ P& V+ {
/*
0 G6 E% u7 h+ c6 S2 Z& A" q* ~PA0 --10脚2 d2 p% I/ g$ L: {+ {; A
PA4 --14脚7 t) j, g& p! a# i+ L9 i3 m' E) m; E0 g' \
PA5 --15脚
2 @* G0 v& J" A( ]PA6 --16脚; U7 l5 Z  f9 e- g, X$ t. |
AN16-----内部温度传感器0 ^9 X$ ?1 w, @6 N5 v3 B7 R) |, c
AN17----内部参考电压8 ~# J6 t) H& m0 Y
  N7 o( ^# P( k7 U( Y8 Z& o8 k+ X

- u1 Q! M8 i5 A' U( \( \*/3 \# v- ?! d/ F

* ^5 ~% q+ P( }, F) c__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};
6 F! w/ x7 F6 t+ V8 a
7 Y+ A3 H1 h0 U7 W' XDMA_HandleTypeDef  hdma_adcx;2 ^+ z" a: O" N' E* L; j- w
ADC_HandleTypeDef  ADC_Handle;
8 i7 d5 q0 ]; ZADC_ChannelConfTypeDef  ADC_Config;, I* X9 m* G; q9 }( E  p5 s/ H  h* v

1 A& p: l) o! I
" [5 i6 v. S/ y# x4 B! Fstatic void Rheostat_ADC_GPIO_Config(void)* `! u( |3 u- F
{" {" N3 ?8 V: Q
         GPIO_InitTypeDef GPIO_InitStructure;  L0 u+ Y8 I. f! X- F/ S+ v- a4 ~2 t
         // 使能 GPIO 时钟
9 T) N! N" H) `3 O1 d& w        __HAL_RCC_GPIOA_CLK_ENABLE();) t' ~: ]1 n& C/ E
         __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟8 I) a6 a* K( O( x' h5 s
        // 配置 IO
, K4 D8 ]7 K) v! M  A1 u6 p, w9 Z- o8 A        GPIO_InitStructure.Pin  = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;, f1 k# W7 Y" d- J- Z5 e
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;  //配置为模拟模式
+ A2 V; G! n; H% V! b: r        GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉
3 Y1 F9 a+ s* y4 O! |& x* @8 {* T        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);        
" s4 I$ I+ ^6 u" @* e, t  Z}$ \) ]' b4 y8 g) E, r+ f
8 b/ e$ Y5 a4 B" j" k* B" A! d
# h! h+ i: O1 I8 t8 s
. Q+ A8 E0 }3 v

8 I$ ?1 H, ~- U; F* lstatic void Rheostat_ADC_Mode_Config(void)6 S* Z) C( c0 n1 |* y
{
; C* U" _0 ]( x        
' u$ f+ @' d2 D& d$ f        // ------------------DMA Init 结构体参数 初始化--------------------------
2 o2 R0 e$ ~9 v! O3 ~, B        //DMA_HandleTypeDef hdma_adcx;
' n8 P/ G! U' a' }        // 开启DMA时钟
. t2 o+ Y7 h* H3 J: X7 ?3 H        __HAL_RCC_DMA1_CLK_ENABLE();
2 E2 m4 L9 y. [& `6 p6 u& B) i0 T6 E        // 数据传输通道
; e" F1 s6 n0 K7 e5 b, @        hdma_adcx.Instance = DMA1_Channel1;  //通道1. V2 L2 T9 E( Y+ i/ {* Q
        
. I' ~! e" _, @$ n         hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY;            //存储器到外设0 M+ z. Y" r* g1 c
     hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式* h3 C& u: D+ M
     hdma_adcx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
1 ~6 x9 y& p0 A, K, o8 j     hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位% l$ \$ Y* p: N3 ^! V0 s1 j' Q
     hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;   //存储器数据长度:16位: J/ N# \! Y0 ]4 _& f
     hdma_adcx.Init.Mode= DMA_CIRCULAR;                         //外设普通模式
/ r9 D8 [$ z( x3 Z     hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级5 P/ r6 ]6 u, J
        ( b. o% m# E/ \1 O* j/ L' G
        HAL_DMA_Init(&hdma_adcx);                                   //根据指定的参数初始化DMA  y3 b1 |7 i# T4 J) w
1 ]9 ?& o% w3 X% ]0 f- {9 K/ G) O
    __HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx);          //DMA句柄关联到
$ C" p1 T2 L7 a        //---------------------------------------------------------------------------. E7 x+ i1 H& m; `* L; L; J
    // 开启ADC时钟& p% r1 ]5 z% V6 J. n9 u
         // __HAL_RCC_ADC1_CLK_ENABLE();  m3 @) }; ?3 b
          ADC_Handle.Instance          = ADC1;, G6 U9 `: z0 M* ]
  if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK)' r+ Y7 G& z. b: L: Z) `
  {
1 O' G  b) w1 b& S    /* ADC de-initialization Error */  E1 E5 J5 {7 G1 }: z
   // Error_Handler();% m% o8 O$ L* s) ?" V  n
  }
0 G' F1 M8 F# J# Q      ADC_Handle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV2;      /* 同步时钟模式,带prscaler 2的输入ADC时钟 */9 C. ~1 f! m# U
          ADC_Handle.Init.Resolution            = ADC_RESOLUTION_12B;            /* //12位精度 */+ R' y% S# y: v3 {2 t
          ADC_Handle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* //右对齐 */
' b) P# _5 g1 m# F          ADC_Handle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;    /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */( }7 c  m7 ]6 p6 }# [7 v; ?; \' S, `
          ADC_Handle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */
" P2 V  `; N+ I4 K/ o" m; Q- Q          ADC_Handle.Init.LowPowerAutoPowerOff  = DISABLE;
2 v  P: G( z* a' n- }% X) T# @          ADC_Handle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */6 t5 x+ e2 j. ?/ ]
          ADC_Handle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */% @: B2 g: r2 ^8 e5 n( U- i4 {4 e" a
          ADC_Handle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
! Y2 O& R- p: s4 H' @          ADC_Handle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* 软件触发 */
6 J3 X! f; @/ r/ o( j$ B( I          ADC_Handle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */% o7 `# p& T4 z* m* j
          ADC_Handle.Init.DMAContinuousRequests = ENABLE;                        /* ADC DMA continuous request to match with DMA circular mode */: H2 h4 @& q, S) Y2 K  R# u
          ADC_Handle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */
" t. B- f2 d" m) E          ADC_Handle.Init.SamplingTimeCommon    = ADC_SAMPLETIME_55CYCLES_5;
3 S+ d/ `8 L8 Z: Y( H& L        
6 B. C4 f+ Z9 r+ r3 m1 w1 M, [                 /* Initialize ADC peripheral according to the passed parameters */3 W2 y( q, ]4 j% \
          if (HAL_ADC_Init(&ADC_Handle) != HAL_OK)  //初始化2 h3 N% X! n0 H- P1 Z
          {& |6 n3 U2 L7 A
                //Error_Handler();! h, y2 X+ t. x2 b1 }$ c1 {
                  printf("初始化失A\r\n");
0 ~# v3 l) V2 R* i0 h3 R/ D/ @          }
! y2 E2 ~4 i7 s9 y0 a# }  z1 G         
/ `3 w! H) x7 p  ~: t//         1 G6 c2 \! p) \7 o: @, V( W0 @0 W
//          /*  ADC 校准 ################### */& |* |% q4 m% R& R: D
          if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)
# d) J2 n" j. G* H9 O. d' P          {2 L( j& K' L8 q
                //Error_Handler();
: V. A5 i8 \' z                  printf("校准失败\r\n");
* J' q1 m' E' G3 D1 c          }! u' w2 c0 T( g  n, B$ R
  //---------------------------------------------------------------------------
% Q+ h% X% J& ?9 X& T% q          ADC_Config.Channel      =  ADC_CHANNEL_0;& ^, Y# R" N$ M1 l# ]. \( s
         ADC_Config.Rank         = ADC_RANK_CHANNEL_NUMBER;
. K& U- K0 N4 U% B* V5 x! a    // 采样时间间隔        
' b' p( z& q) M    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;7 a, u4 l* M: K( h$ @: L
         
( G! {9 }$ \" v7 {3 `! U% D& Y' h  A; s: f; g
          if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)
: C8 E0 r2 t% p. o' V" N          {
+ H; o2 W* U1 D8 d+ a8 ?, z                //Error_Handler();
! H- Z2 \6 q+ J* q- G' g) N7 \          }
+ M3 a- s7 \! ?; B. N          //---------------------------------------------------------------------------
+ b" G7 B/ x- ^, I" v5 x; K          ADC_Config.Channel      =  ADC_CHANNEL_4;- K# i( }& N) Z
         // ADC_Config.Rank         = 1;) x  c7 ~5 z4 G) D8 C
    // 采样时间间隔        
& K/ c$ |& o% }6 I# J! c    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;/ R/ @; x6 d- `
         3 t) j3 S! }7 j' I
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
. V. T1 ^$ A# [% W$ [         
4 @5 V$ A- M, N1 L9 ?          //---------------------------------------------------------------------------# ?* y4 j1 \1 {' s  v) e
          ADC_Config.Channel      =  ADC_CHANNEL_5;6 E4 H$ C$ G5 d! t6 y2 `
        
) z( a/ X$ j$ q3 Z% ]: M0 W& A8 W4 T    // 采样时间间隔        
5 Q# v7 `0 l, i* y+ q    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;! e! B& B1 M; U# M
         1 C/ ?8 ?) O0 Q* A
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
% W: i' l& O, N* B" U5 F        
% J5 F# e6 W  Q6 ~8 F7 C. {        //---------------------------------------------------------------------------
- Q: Z% ~5 W6 B$ I          ADC_Config.Channel      =  ADC_CHANNEL_6;
" W! W6 [0 ?' z' e+ S- m/ G        
. u; j* \5 ~# [8 X    // 采样时间间隔        
# V# f8 g/ A% ?0 M9 r: M    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;* U, C" b+ }' C. ?  i8 s
         
: G2 X: V$ V4 y# v    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);  S" y3 ^5 [5 Z
        + R  G# c# ^. V- y2 s" [
        //---------------------------------------------------------------------------
- ?4 q; B5 v: z2 W6 ]# c5 m: _          ADC_Config.Channel      =  ADC_CHANNEL_16;- u0 T, e3 I1 _5 T. ]4 A, b9 S$ _# F
        & K/ @3 W7 h# D: l! J
    // 采样时间间隔        
* W5 Y0 Z- c" V; f' W1 t    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;+ x: T! M, T8 a+ ]/ l$ W
         ' \* L0 D2 ?0 F0 v
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
: C, U: P& [; \' y3 K! Z& [- O: q        
, M* _" ]/ w+ \, |. O  ]( \9 B4 M        //---------------------------------------------------------------------------( A' \6 m1 f7 b  z. @% v; |4 Z
          ADC_Config.Channel      =  ADC_CHANNEL_17;8 b# X* b- ~0 ~9 o
         
$ a6 j& B( H# M9 @( E  N    // 采样时间间隔        : s% `* Q4 B4 q! g+ t% Z
    ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;. x* Y' R3 \. V' l9 c' Z  r8 X7 y
        & w0 l: U9 g2 {9 I
    HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
, l* E. M7 j% s7 a7 _( K        / w* \9 B/ A* g% d9 e, y
        7 e4 T: {- Q  ]* h- p! ^- k
       /* ### - 4 - Start conversion in DMA mode ################################# */$ a! y  I" A: Z3 l& |+ a# z
  if (HAL_ADC_Start_DMA(&ADC_Handle,: y6 D# N) F2 K9 D
                        (uint32_t *)ADC_ConvertedValue,4 S/ [. @8 z( |6 f6 @8 {
                        NOFCHANEL2 F* z4 H4 s* Z" c8 b3 j' G+ j
                       ) != HAL_OK)- T6 c% z( S4 L" k1 d5 d5 Q
  {' c% x$ \7 G: S# [
     while(1);
1 Z# }# b  S! Q* w         3 r7 H3 s7 t( c+ B; ?
  }% R: b/ J8 ?% k& }3 E* ~
        
' _1 Q& W* T  K, ~* ~代码下载:
: k( X- R- h$ G4 |- z FreeRTOS_多通道ADC-DMA _HAL.rar (1.14 MB, 下载次数: 0)
1 H+ w$ [% t+ Q$ o: s

  @6 i. `5 F* f" k! `7 j
( H9 @  C( 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-7-19 05:50 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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