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