|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。$ _4 J1 S. o* d/ v: @
* r! v1 N) t2 |1 y
5 }3 a: [2 H4 V, g; d8 I j4 [#include "bsp_cpu_adc.h"/ a& i; c) |$ p! A- y s
#include "usart.h"
% b* C( R; b" O" j* q) W
- b7 b* T; ?7 ^6 \% o j5 c/*
6 r, ]6 R# A& I4 X% bPA0 --10脚6 }! l/ G$ Q4 T2 x/ ^1 ?" M/ ?
PA4 --14脚
: [: \) m- X' Q- SPA5 --15脚5 e' k, p2 g% @" @8 b
PA6 --16脚+ i1 t7 D/ H5 R( t" N+ K9 U* B1 A
AN16-----内部温度传感器
3 [5 P+ N5 G1 o+ J' l0 }* qAN17----内部参考电压 I" W: `' l' e4 Y4 R& ~/ E) b" c5 ^6 j
4 ?( R1 _5 u/ Z' a% D- r) _* L3 d( j9 [' j. V" W3 @
*/# e: F# I3 k# U8 U4 v( L; K' w
3 a9 t, q D. i# i__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};* S. D# m, P1 }1 N5 O4 t) h
+ R0 Q7 Q6 w p8 N1 v, E+ X
DMA_HandleTypeDef hdma_adcx;+ ^6 D! J( a6 ^8 `. \7 f) }2 \
ADC_HandleTypeDef ADC_Handle;
4 E. j& x. ?. W3 D+ ?ADC_ChannelConfTypeDef ADC_Config;
- {8 z9 f0 n( M7 W! b9 M* _
$ C: z/ f- Y( |0 q
* N; L4 |9 k, e: ^static void Rheostat_ADC_GPIO_Config(void)7 V7 Y* W- {" ]. c; w* ]4 b1 t& M
{/ a' [# ^; k4 u6 p8 k& N) N' e
GPIO_InitTypeDef GPIO_InitStructure;+ R$ ^" Z9 r' E2 L
// 使能 GPIO 时钟
6 d. h% A+ S5 Z/ Z4 P) C& B __HAL_RCC_GPIOA_CLK_ENABLE();
. c1 @- M9 `$ V& X6 u1 h2 R __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟
0 _8 C, R; A! m1 p5 x1 i, C // 配置 IO
. d; l; C; o+ z, J! I1 j GPIO_InitStructure.Pin = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
, [( P: T/ Y5 I2 _& Q GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; //配置为模拟模式; H) L9 I; K# P
GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉: Q! G4 Q6 g- F5 q$ H. Y
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); * U+ ?6 E0 l8 ~9 R7 u1 H) |
}
3 v4 ~$ ~, C# h! {$ U" P% M2 @5 F0 o# u- `5 K3 @! o8 T
) i8 C; O' ]) ^0 J0 k) K& p! f
* K8 A3 ?3 q! r3 R
& ~5 {& [. y9 D6 p( c. y* o+ \* X! e Gstatic void Rheostat_ADC_Mode_Config(void)6 ?& E+ i5 T T( [$ H+ @% X
{: s$ k; V- t9 C5 @, m
) b- O* B' \/ ~+ |) E // ------------------DMA Init 结构体参数 初始化--------------------------
) B/ R4 [7 Z+ J4 P& m# c //DMA_HandleTypeDef hdma_adcx;, r9 P* h& P. L4 J( D
// 开启DMA时钟. z/ s m. ]* I- \7 p
__HAL_RCC_DMA1_CLK_ENABLE();9 e/ f5 t# A9 a Q
// 数据传输通道
2 Z/ z3 O5 }: ~& H hdma_adcx.Instance = DMA1_Channel1; //通道1) L+ g& `% e: D# O0 ?/ y% ^* P3 G4 `
. ~/ L8 D; e$ H# r/ {7 ] hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY; //存储器到外设( L0 I. N9 S, f6 R- W8 ^/ \
hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
0 r/ I2 ]% K6 q% k hdma_adcx.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
$ W0 I3 E! w7 G* I8 _+ h, Y hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位: t7 f& X$ T" I* d; @" \
hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD; //存储器数据长度:16位" q1 f, L2 [3 ^7 j: D7 |4 P
hdma_adcx.Init.Mode= DMA_CIRCULAR; //外设普通模式& j1 J! \, J* p |% ]
hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级% r5 `5 n4 U7 k' @' Q+ V9 a$ N( u
" A+ f8 I, N; n n2 u9 A
HAL_DMA_Init(&hdma_adcx); //根据指定的参数初始化DMA+ S) E8 t7 v1 p9 r
5 y) J0 T# Z' P# j0 h8 [! n W
__HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx); //DMA句柄关联到+ `! r5 L( d, e
//---------------------------------------------------------------------------' }2 j/ u' q& l+ @: P9 F3 c: ] R
// 开启ADC时钟
. b0 |! x: z% R- B // __HAL_RCC_ADC1_CLK_ENABLE();" o# A4 N- t4 t, s2 I
ADC_Handle.Instance = ADC1;1 T, O& i0 a r
if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK), t8 b8 w5 W( s" p) f2 ^
{
0 X9 ^; j n% Y. P$ f; ` /* ADC de-initialization Error */7 P) J s3 C( t
// Error_Handler();! r7 U1 j/ f" |: }4 Z; n1 V
}, e4 l s/ R& O. h4 D; j
ADC_Handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* 同步时钟模式,带prscaler 2的输入ADC时钟 */1 v9 O& o& i3 r6 P# B2 \/ a
ADC_Handle.Init.Resolution = ADC_RESOLUTION_12B; /* //12位精度 */" P+ e. ^% k; ]1 [+ C! c. o9 a0 J
ADC_Handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* //右对齐 */
4 p' }2 ~# K) U! w6 a1 E ADC_Handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */# v3 @/ I* @0 G3 `9 O1 c
ADC_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */- O4 q ?. K& W1 G+ u& W0 n
ADC_Handle.Init.LowPowerAutoPowerOff = DISABLE;
( p& r' C7 D) W, r3 j) {) v7 U ADC_Handle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */7 t7 K/ T: j2 l9 P; E
ADC_Handle.Init.ContinuousConvMode = ENABLE; /* Continuous mode enabled (automatic conversion restart after each conversion) */
( n0 a# B* V- A- K ADC_Handle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */. [, f) Z8 M( S, J) S
ADC_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */( i( Z* ^4 U0 I% z- S
ADC_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
; \+ t6 Z. p4 Z- H ADC_Handle.Init.DMAContinuousRequests = ENABLE; /* ADC DMA continuous request to match with DMA circular mode */! x8 N" A' h4 {" E+ [
ADC_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */# `5 C- _/ ?6 z6 ]- m- i6 L
ADC_Handle.Init.SamplingTimeCommon = ADC_SAMPLETIME_55CYCLES_5;5 q. x B; s- ?1 b& A
7 T7 D+ v7 C& A. a% |* J( c! U /* Initialize ADC peripheral according to the passed parameters */
- T5 i( U0 O5 R if (HAL_ADC_Init(&ADC_Handle) != HAL_OK) //初始化8 Y1 z: Q! ?/ s1 r* _# ^6 L9 y
{
0 ^* o8 [% r3 g) v. e2 |! g( s2 S //Error_Handler();
9 F$ N" N0 M1 W$ M printf("初始化失A\r\n");
2 [2 }$ e3 M A" f }
* a; C$ T' K! M2 d, X! u5 N 1 T! }* l& W1 j2 d+ o# Y3 Y
//
% j' r! v+ c6 q4 X; z// /* ADC 校准 ################### */8 d6 h8 t# c2 Y. a8 n# h
if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)6 ~" {, O% ^: m1 `$ a g9 z8 K
{5 l. Y7 a5 h) n' o+ m
//Error_Handler();5 f0 F; t( b7 L" P
printf("校准失败\r\n");2 O& S5 I0 C/ M) f
}) H( e+ e6 Z4 U. r9 j! S# x6 I
//---------------------------------------------------------------------------6 _9 o, t, n: k+ y6 ^8 F# y
ADC_Config.Channel = ADC_CHANNEL_0;# r" Z1 W" @! R/ q
ADC_Config.Rank = ADC_RANK_CHANNEL_NUMBER;
; d) F2 ]0 S' Y, {3 @) C% q, f9 Z // 采样时间间隔 7 C$ e \9 i* o3 F" ?& g
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
# M$ C0 O" _# z
! k& ?$ ^/ `/ c$ ~: d K
) e( D2 |. y! ^ if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)
3 ?& I$ {/ i4 F5 Z0 e" d {) q8 g0 H6 G4 @& y
//Error_Handler();
2 p* E; p8 N- f, p0 X, p }
- z6 ^* y5 h+ i //---------------------------------------------------------------------------0 h h+ K5 e. q! N" `( W# }
ADC_Config.Channel = ADC_CHANNEL_4;
/ c- h5 d V) z. Y# p( G) l1 J6 g // ADC_Config.Rank = 1;/ K- [' P# e; H2 Z: E- E2 K
// 采样时间间隔 & [0 X/ C4 Q- @- l' R
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
" S) s% U- a6 W1 c
" z S1 q1 w& [ HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);' r. o6 C9 W3 v& g
- A$ k3 H9 p% m4 j
//---------------------------------------------------------------------------
* _* s8 p1 p! E$ ~5 O u ADC_Config.Channel = ADC_CHANNEL_5;
. l8 x9 Q0 g3 ^3 X9 |# j# G" Y3 T! H
, e; v! b& y; Y! D // 采样时间间隔
' ]" @0 T& d( q5 h+ K" Q ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
0 T# l1 k. f% w. w
; x E: e ~# z3 O HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
0 h- u; o% D/ ^ h
( M6 W) z: r) S& W; I, E //---------------------------------------------------------------------------: _4 _$ B8 {5 _' U. | D
ADC_Config.Channel = ADC_CHANNEL_6;9 ^0 o+ _8 F8 ?3 @5 }# n' I
7 a. U& j' M' v
// 采样时间间隔 4 V1 h: r0 K. L0 x# ?( h% s
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
5 m3 w+ W! z% @* q ! i) O# I1 A0 l$ n
HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
3 Z! W6 Z1 }. h( M$ ] / \5 S! O4 j1 W4 r+ | s
//---------------------------------------------------------------------------* I* A; `) I% p0 n6 j/ \4 z5 d
ADC_Config.Channel = ADC_CHANNEL_16;3 L4 }; X5 O; C0 y% S q% @5 \
5 G1 ?7 O* c) L2 A" I# a% M- A
// 采样时间间隔 4 w' R' D- T {" P3 W( v% _& s; K) r
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
* `1 H" `# z6 Q, w" \, I
/ y. H! {, i1 W* `/ ~% ^ e9 K! R HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
' x' u" c* D/ V& Q1 n. b! P/ b
. |/ F1 r" b0 r% n$ h( | //---------------------------------------------------------------------------% s1 x; w5 l6 A8 ~% }, n) `& `
ADC_Config.Channel = ADC_CHANNEL_17;3 _9 T, b) `! ] Y* R" s2 t
9 L+ R& [$ l5 L // 采样时间间隔 8 |$ }" O' f, g2 B2 s8 ~
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
- a, s1 z" R: h, J$ H. M: q: i
8 \, I8 g' F* U) d HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);0 {! k! b+ X3 J" e/ C2 l! p- u0 s
! M% O$ x2 A( T) Q- E4 d9 S
! t7 S( A2 I% |2 k3 i: u /* ### - 4 - Start conversion in DMA mode ################################# */8 o% a9 \! L' V+ g# h$ e2 K
if (HAL_ADC_Start_DMA(&ADC_Handle,
, ?3 N$ x& s. Z, \: ^! } (uint32_t *)ADC_ConvertedValue,& e- c' v8 l. ]
NOFCHANEL0 o6 k+ K; ~5 y* V
) != HAL_OK): n. ^8 }3 d" R8 Z% |
{: {" x. t, U" Y$ S
while(1);. t" A+ `7 D- m. R; M
' A9 h9 g6 @! G/ }/ k# F) @' w }
: q3 s" n/ J) \4 I" }+ K) S' r " \: i! \5 g: Z' {) s: v
代码下载:4 S- u8 H0 W o6 R! ]7 k% C7 A
FreeRTOS_多通道ADC-DMA _HAL.rar
(1.14 MB, 下载次数: 0)
" T. E, }7 Q" v2 d- `2 d- N2 l
) \( _: h4 d P' x
; d% u9 c1 I& P" R1 l5 {8 J' {# B
|
|