|
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 |
|