|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。5 M ^; P4 Y' o5 B: v0 C
1 R+ _+ w/ q4 n1 {0 V5 ?$ p- o+ O6 f5 c. u- ^
#include "bsp_cpu_adc.h"
8 B! f, S; T; x& z! @2 @#include "usart.h"' T1 l$ K. _# W# o+ `9 W
: E6 ?/ U) T# _5 V. `* p( l7 N& x
/*( K) \4 K! e; [. P+ Q j! l
PA0 --10脚
* O6 j/ p# L* q: MPA4 --14脚
* ~' r- v/ f1 Y H3 {7 wPA5 --15脚
) @$ t" V/ S: O. [* q* JPA6 --16脚4 L: O# ?1 R4 j5 B" C$ K+ }5 m' i( {
AN16-----内部温度传感器% ]0 v8 S7 W! d9 {5 s9 z7 A
AN17----内部参考电压
4 b* w% h, c: K- d$ i t# m( r1 b9 y' V
' T7 X- V' ?2 Y2 J) B
*/
) F& w% A7 `9 V+ {9 x' j& D& F( G# q' X' @! u6 l
__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};& v' g4 X# }" R5 [9 p+ H- ?1 P
- V i6 s: l; q# j& `DMA_HandleTypeDef hdma_adcx; ~' S, [ @5 Y) v3 z) r+ g
ADC_HandleTypeDef ADC_Handle;0 M' r3 o$ v9 \# A, ~. c4 n) h
ADC_ChannelConfTypeDef ADC_Config;8 w6 h7 D) y2 o( a' ?
; u1 g% M/ W% d. }; E8 Q4 D5 {! {: w$ Y& V& d
static void Rheostat_ADC_GPIO_Config(void)
5 l- i5 i0 z. ~* X S/ X; E! P{
$ U9 s, o$ Z! ?- X! p, e' y GPIO_InitTypeDef GPIO_InitStructure;
) F6 N2 y) i: Q9 m9 m: ^ // 使能 GPIO 时钟2 T% G& H: H | d r
__HAL_RCC_GPIOA_CLK_ENABLE();0 y/ J3 D0 U) x% X5 d7 `, [
__HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟
4 |# {3 Y4 A9 [2 J5 ] // 配置 IO
" D1 t4 z) S/ Y( X6 e' z( U GPIO_InitStructure.Pin = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
" p- Q6 i: y; H GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; //配置为模拟模式3 I8 G4 V' |( Y9 _5 Q
GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉$ _2 a6 k! @0 S1 c. @9 U! y
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
! W( S5 x* v; g+ i% b}8 _& D K* O/ B% m5 X. o# t
, j" a+ T% a$ |- B! k
6 I* j( O$ a7 E2 r) Q! ?, J% q4 @0 x0 Q8 X4 Q" B8 H* C
$ D/ C, m( e/ n/ Z0 U$ estatic void Rheostat_ADC_Mode_Config(void)+ r1 S) d; [: R) @" i$ z
{
$ K$ a$ J5 F4 @2 X 4 F& f3 }& |; A) x' G
// ------------------DMA Init 结构体参数 初始化--------------------------
# P' R) Y5 E! p6 F: d- @2 r2 P! R //DMA_HandleTypeDef hdma_adcx;7 u0 t0 D9 h3 I8 J* g4 S
// 开启DMA时钟6 T; E; {6 D7 ]8 n* v
__HAL_RCC_DMA1_CLK_ENABLE();
8 r+ K0 U% F% w A/ A+ u3 z // 数据传输通道4 @/ G. P! [) ~
hdma_adcx.Instance = DMA1_Channel1; //通道1& R8 o9 n9 m! d- S& D
; G k! U* u- J
hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY; //存储器到外设- I7 t- y' U: `- s* j# I4 E! @
hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
) c, _; g9 X" M& I: ? x hdma_adcx.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式9 W( D& j; M' K4 O
hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位/ k O; T# n! g
hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD; //存储器数据长度:16位
" ^' j; L" I* |7 s" a9 m hdma_adcx.Init.Mode= DMA_CIRCULAR; //外设普通模式: `5 @6 d, ]0 g
hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级$ I, h' ?* n% O8 V/ l; ~7 i( A# q
3 ]+ |7 ]( @3 J, J7 I HAL_DMA_Init(&hdma_adcx); //根据指定的参数初始化DMA
% w' V5 I& j& o P! j" n' X( K* {7 ^! s% E; w( |4 n% M& b- R* ?
__HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx); //DMA句柄关联到5 d' T+ }: p- W) @9 S! x
//---------------------------------------------------------------------------
) w" m2 \5 S+ t s+ F // 开启ADC时钟
+ R4 F3 ~ m: O7 d/ s3 p3 x // __HAL_RCC_ADC1_CLK_ENABLE();
# a: U+ b5 q1 L ADC_Handle.Instance = ADC1;- A: Q; p' _6 b% X/ H
if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK) A0 X" P: M0 h2 R7 _+ E" H
{) d# Y) q, x, m$ y
/* ADC de-initialization Error */
0 n/ r; F4 t. y% D9 g // Error_Handler();! Y& s7 }" V# J) l/ @$ h
}; _- L4 J1 R& u
ADC_Handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* 同步时钟模式,带prscaler 2的输入ADC时钟 */
0 H6 l5 ` x5 x0 I) `3 ` ADC_Handle.Init.Resolution = ADC_RESOLUTION_12B; /* //12位精度 */3 O8 c4 L+ g4 }! O' ^6 |1 l0 \# L
ADC_Handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* //右对齐 */
9 i! h& b# H8 C3 `, ?) P! @3 J ADC_Handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
6 ~; p7 r+ [8 w ADC_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */
5 w0 ]) g* x$ Y/ [: v6 ~. h$ d ADC_Handle.Init.LowPowerAutoPowerOff = DISABLE;
9 P/ p: K! ^+ [7 D4 H' E ADC_Handle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */0 Z1 ]$ i [9 D: v4 {# \, p* e
ADC_Handle.Init.ContinuousConvMode = ENABLE; /* Continuous mode enabled (automatic conversion restart after each conversion) */- f* P$ V- _: ~6 T3 b0 z# J
ADC_Handle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */
* ~ ^ S8 V$ t5 p ADC_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */+ ~; U e) C1 j! D
ADC_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
7 n( E! p4 u9 K/ ~+ H3 R4 z ADC_Handle.Init.DMAContinuousRequests = ENABLE; /* ADC DMA continuous request to match with DMA circular mode */, d, I" M8 \2 g! a1 H1 ^
ADC_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */
2 S: T4 ?) C) |2 r2 x ADC_Handle.Init.SamplingTimeCommon = ADC_SAMPLETIME_55CYCLES_5;
. X) f3 _8 H9 Q, ^0 w
. x$ i y; e3 \! ^ /* Initialize ADC peripheral according to the passed parameters */7 }5 \9 K0 H9 V- O
if (HAL_ADC_Init(&ADC_Handle) != HAL_OK) //初始化8 G* F+ f# |1 c( `) q7 l
{
' G* Y. r O8 E( W; ? //Error_Handler();
: ?; P6 U3 I3 o `0 Q printf("初始化失A\r\n");" Q$ k2 S0 s+ P N/ l+ f
}8 ?3 g- P0 a. G+ q. r: z* A7 X
$ f/ D, T4 G, g7 q//
5 L& ]8 Q2 `4 N y4 X ?- v: }+ H// /* ADC 校准 ################### */
) s6 B7 P1 { \: b- ?5 N0 ?4 ?* F! n if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)7 t; E4 ~9 E8 C& P8 ^5 S: r
{$ j; }# u3 E2 F2 w
//Error_Handler();
" c0 ?$ L" j- l8 v5 T3 N printf("校准失败\r\n");
7 P! k' Z e/ b; B }
# X1 B0 i! `; H$ @0 o9 e //---------------------------------------------------------------------------
" H' Z8 B! u0 P$ H1 X5 v+ \ ADC_Config.Channel = ADC_CHANNEL_0;" K) x2 a& W, T# j! r( _' d
ADC_Config.Rank = ADC_RANK_CHANNEL_NUMBER;
/ w! G# O1 t1 z // 采样时间间隔
0 k* |0 T( x" {5 S+ Z ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
; p7 ] b l/ }3 j# W . Y. K. ~- h" M$ F/ D4 ^ O2 G, R
" A) d: n. N% ` if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)
8 ?+ i: Z1 K) ` {7 D+ n0 {+ L' H8 a; e
//Error_Handler();( `& J3 K; J& l& T2 P
}
B4 X7 w5 J3 O2 V) P! t //---------------------------------------------------------------------------
- a9 B+ A& C# R& p5 ]6 }# x E. \ ADC_Config.Channel = ADC_CHANNEL_4;
3 [- _3 m9 r6 l# s // ADC_Config.Rank = 1;8 d8 q, d0 R q# q
// 采样时间间隔 " X9 T# X$ ]' o! z
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;- M, h m8 h9 J! D! `% l9 }: k' C
. p4 U; a' t* U2 [5 V( e. j$ v+ t
HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
2 c/ ^ u5 j- p0 J g 6 h6 A, v$ L: C- \+ w8 e" c! C
//---------------------------------------------------------------------------
0 R# W# a$ o- F0 V9 K ADC_Config.Channel = ADC_CHANNEL_5;
) _5 D0 j) {: s' C [
/ C$ B' \0 b. M. R$ H9 S. A, W // 采样时间间隔
" G1 R& g) v) g h2 q, y7 e' q/ B ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
5 e I5 o& Z1 D# x. P
$ a* U& e5 ]6 @8 e% R, X* z HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
6 n0 s2 `* e% Y8 A
+ U0 [$ q- f8 Z/ i% r- ~+ f2 ? //---------------------------------------------------------------------------
% @6 `. T8 Z! x( F' g ADC_Config.Channel = ADC_CHANNEL_6;
9 d2 }, Q _$ \3 q4 x
t9 h, i% v# Q# {/ y( h- b // 采样时间间隔 - ?) `7 f" _# v! ^8 n9 _
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;, H+ c2 r" A; n- A! \4 ^
! V/ \, T+ y+ O. h HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);0 n7 N4 O" i( P
7 L# W$ W i& E- h
//---------------------------------------------------------------------------
/ I/ S% t& S& ]0 T ADC_Config.Channel = ADC_CHANNEL_16;
3 v* i0 v* k' d7 ?% ^( M
" @+ c* P% e0 R9 |' [; G // 采样时间间隔
& h+ [" j# O; K. |9 K# x ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;8 R) d/ ^3 s8 d& P' |
0 B2 Z2 v4 `5 M6 G2 r: K! e* T HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);: n' I' q1 J# C( R
+ @0 p. |3 ]2 u2 q7 U( j* N
//---------------------------------------------------------------------------
* }1 S4 A8 Q8 S( b- s) e$ D/ s V% k ADC_Config.Channel = ADC_CHANNEL_17;. v3 O6 g8 \+ ]" O! d5 [
' a- n1 a- C0 H& v2 E
// 采样时间间隔 1 O) c; m+ q8 w7 H8 g" Z. ?
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
2 {% P3 H* ]1 C, o1 d/ ^# C* a
$ \* _8 B4 a- j* z R1 w HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
6 t. D' H* W# U3 U M* y. } . E4 Q* }2 z& k
: N5 e+ q% W/ ?0 {! \/ b) W# G /* ### - 4 - Start conversion in DMA mode ################################# */* c- u8 [9 ^3 @. z3 d2 k/ C
if (HAL_ADC_Start_DMA(&ADC_Handle,$ G1 C0 @) R* l4 p0 e6 k
(uint32_t *)ADC_ConvertedValue,& {* d/ T# p) Z+ v8 j$ ^
NOFCHANEL
V$ S9 V; S3 ^& W6 |. Q, B ) != HAL_OK)+ f% y9 C7 `+ t. f7 Y/ E8 r
{+ K4 `2 _# K/ W2 | x& w
while(1);
* |, k' V% F$ y5 M1 b4 M3 k$ v
- j3 _+ @$ r9 m& S9 c% Y5 s4 w }' H% O( E& I0 l0 I
' `& |2 U4 ]& F5 f! a/ U代码下载:6 `6 {/ s( h k
FreeRTOS_多通道ADC-DMA _HAL.rar
(1.14 MB, 下载次数: 0)
4 f* C, b! x( E" P
8 x/ V; q. k& T/ N4 _* h ~
" m8 }( d6 v# F8 b% c# Z |
|