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