|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
分享一个STM32F030 多通道ADC采集并用DMA传输的例程,希望可以帮到都需要的TX。
0 z5 E2 S- O% d* i6 f# Q* M
$ U9 d7 |- b* p% p" W9 ]! ?6 Z8 o7 C; o! C0 ]$ K! r( }# U: P
#include "bsp_cpu_adc.h": j% ~( B( r) c$ D3 i6 V0 R9 B% h% b
#include "usart.h"
( Q0 W/ H* @' J& H8 e& m4 [* p; e6 }( P
/*! I$ y) f( `5 s9 Z( X
PA0 --10脚" D( E4 d% O$ s- r3 \& S; R
PA4 --14脚: L" z; V2 ]: \% _) p2 g y
PA5 --15脚
x, e7 b5 j( @4 N2 Q$ lPA6 --16脚
$ w2 ?' k% m/ E- z* X& JAN16-----内部温度传感器
- l, s/ F/ L% M( R& c& CAN17----内部参考电压
1 Y9 H7 A( ~- f: n9 k/ Z3 e5 ^8 Q! Y" u5 T3 N) w
* @+ ^# `) e4 W2 h0 a
*/" c) P; {4 M1 j/ G; U. K4 P X
G. ]1 ]) m( u* I$ L2 i7 T+ }0 D
__IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0};! I. [5 W9 s: J6 l! d" G0 `
1 H1 [ T5 L/ ~1 @/ \
DMA_HandleTypeDef hdma_adcx;7 H' h& Q8 g0 }* h7 M( I( }' C% a
ADC_HandleTypeDef ADC_Handle;
* R8 w2 d" N) Z- o8 ^5 |ADC_ChannelConfTypeDef ADC_Config;0 n# _, f: e9 [' _4 m
7 r6 n# `# |4 _- U7 d, m% v
?$ t' b: U; l+ i; Rstatic void Rheostat_ADC_GPIO_Config(void)
3 I& R, R1 g$ R7 G2 |; J{
7 E8 s/ ^, I4 k' G" F' Q' U$ ] GPIO_InitTypeDef GPIO_InitStructure;
1 Y' c* n1 X i6 @1 r1 { // 使能 GPIO 时钟/ u& j' G9 J0 O
__HAL_RCC_GPIOA_CLK_ENABLE();
. Z6 u+ T- L3 {! ]: H __HAL_RCC_ADC1_CLK_ENABLE(); //开ADC时钟
7 M3 F8 ~, \ [2 D$ Y // 配置 IO( T7 z: h! Z5 a* f
GPIO_InitStructure.Pin = GPIO_PIN_0|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
3 u0 O' L/ H- a" j GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; //配置为模拟模式1 [ o7 }2 }8 S# Z1 |
GPIO_InitStructure.Pull = GPIO_NOPULL ; //不上拉不下拉, f$ n9 }+ l! W
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); ; M+ n5 |8 ^& q4 |, B
}
; [& t5 P6 ?% Q; b% G6 U$ `1 F
+ G) h3 N/ d! \
' B3 D6 u; W! d: V/ w/ e6 c I' }2 }0 ?1 [4 |. f, f0 _6 p; ~* W
) H, z p" m2 vstatic void Rheostat_ADC_Mode_Config(void): F: I6 b( D( g
{
7 U9 R" t9 I9 n* R# |
/ ~. `' v6 P& S/ G" k( Z( ^ // ------------------DMA Init 结构体参数 初始化--------------------------2 F0 W$ O L$ i4 ?: }% N' M
//DMA_HandleTypeDef hdma_adcx;
- ~) ]( W$ P0 X" m, |, ^ // 开启DMA时钟
+ M" H4 Q, l7 J2 O __HAL_RCC_DMA1_CLK_ENABLE();! t9 E1 j- w4 |
// 数据传输通道
! I) t$ P! ?$ X; u2 } hdma_adcx.Instance = DMA1_Channel1; //通道15 t) ]$ }" q2 Q, h3 g* h7 I4 v: \0 d
( N1 q( c' R v hdma_adcx.Init.Direction=DMA_PERIPH_TO_MEMORY; //存储器到外设
1 N6 @! o' H( B' C2 k hdma_adcx.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
! x5 o! t' B; N hdma_adcx.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式) w: d4 U, T) p6 K6 @
hdma_adcx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//外设数据长度:16位9 X8 w9 p6 t9 A: Q5 f+ \8 v
hdma_adcx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD; //存储器数据长度:16位
9 Q1 v& t m/ V8 J t' z A+ h0 T hdma_adcx.Init.Mode= DMA_CIRCULAR; //外设普通模式2 ]/ {, [8 _8 z
hdma_adcx.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
) `5 @0 P( f. T4 z7 M
* N4 j7 I7 t( Y( _ HAL_DMA_Init(&hdma_adcx); //根据指定的参数初始化DMA
- l( X& B7 ?2 ]5 a0 U
- I3 z! p, C: H; R8 E1 B0 {) [2 v __HAL_LINKDMA( &ADC_Handle,DMA_Handle,hdma_adcx); //DMA句柄关联到
; W; Q' s$ [! N( m //---------------------------------------------------------------------------
4 c; F$ S. h. D7 G // 开启ADC时钟5 E. d3 v, Z* ^5 @( ~6 E- J
// __HAL_RCC_ADC1_CLK_ENABLE();
5 q3 y* e! u& H7 m0 b4 t0 [ ADC_Handle.Instance = ADC1;
) Y* i2 u- R2 |1 N6 K- @3 d if (HAL_ADC_DeInit(&ADC_Handle) != HAL_OK)
& \9 i9 e/ U, p6 b+ f+ d$ ] {5 @$ ?1 D8 C7 G$ G# l1 \* J
/* ADC de-initialization Error */* F2 l9 m+ ?, N' C7 K+ v! d
// Error_Handler();' @: ]8 H" f1 T# g2 M
}
0 c; x; {; ~) i6 \ ADC_Handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* 同步时钟模式,带prscaler 2的输入ADC时钟 */' b# q" g7 j* m/ U; X
ADC_Handle.Init.Resolution = ADC_RESOLUTION_12B; /* //12位精度 */
2 _ Z9 @. _% z ADC_Handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* //右对齐 */
- K2 E+ D. C" p' w6 p ADC_Handle.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */% O( a9 C: u5 K: s: C/ H9 \: G
ADC_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */; ^& [. V" P" ?2 [
ADC_Handle.Init.LowPowerAutoPowerOff = DISABLE;6 F( o6 x, o0 U: B* K5 ?9 G8 y
ADC_Handle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */
2 E5 d0 J: m8 q! F& p ADC_Handle.Init.ContinuousConvMode = ENABLE; /* Continuous mode enabled (automatic conversion restart after each conversion) */
! { S" K- C; v! C) _$ o ADC_Handle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */( a3 q. |! m0 x2 X- q7 ]& M/ ] s* b
ADC_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */( V5 T& Z& L2 \6 X
ADC_Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */. r3 A2 H7 ~+ m; b+ c$ s; N+ Z
ADC_Handle.Init.DMAContinuousRequests = ENABLE; /* ADC DMA continuous request to match with DMA circular mode */
& [; p5 y- f; A* ` ADC_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */3 Z: r$ n% b' W R% Y C2 {
ADC_Handle.Init.SamplingTimeCommon = ADC_SAMPLETIME_55CYCLES_5;0 ]' u4 t7 u! X4 ?. R
: k) ^3 f* N# s w* @2 s2 }
/* Initialize ADC peripheral according to the passed parameters */
; m8 t h7 {1 D5 l! c if (HAL_ADC_Init(&ADC_Handle) != HAL_OK) //初始化
" D4 U5 Q1 x Y {% a. K" J" L/ }- J
//Error_Handler();
c- Z, y. T( q, ]* D1 [8 o: n printf("初始化失A\r\n");- y# [' W7 E3 j' g/ a
}
& _% R6 n+ j6 _: ^
3 T$ z4 F! m; T; r0 E// . [, Z: X% T, f8 ~& D. \, y$ {
// /* ADC 校准 ################### */9 P# C' f7 n. L1 f$ z$ ?
if (HAL_ADCEx_Calibration_Start(&ADC_Handle) != HAL_OK)
! [+ z! Z" D. @& ?" i {+ S, k, A( @# l- H1 w
//Error_Handler();
0 G" ~$ g A1 t# I printf("校准失败\r\n");
0 k. g8 K/ {5 ^ }. _+ p0 H% J/ B: _* I
//---------------------------------------------------------------------------
0 {# o( c; c3 j. l ADC_Config.Channel = ADC_CHANNEL_0;! |8 e% H9 l7 L4 S ?2 E% e6 j
ADC_Config.Rank = ADC_RANK_CHANNEL_NUMBER;7 z* q1 j0 r# V% t0 u8 }0 F4 J) l
// 采样时间间隔
5 x" Q& j2 z+ j+ P ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
( [) S. {5 T; A( [$ \
1 r, e1 R, {" d2 U
3 N6 b$ N/ |$ E. D6 n4 Z if (HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config) != HAL_OK)- b R- `/ o% _* r
{% e, l1 @+ j. d& w0 s
//Error_Handler();% [: Q: m' K( I4 t! W! J: p
}: c2 E7 l7 R3 P1 @' N& ?
//---------------------------------------------------------------------------
6 d4 h; k: Q4 t, I% ]3 |9 s% V ADC_Config.Channel = ADC_CHANNEL_4;
! }$ O% u6 Q1 H* p, ~ // ADC_Config.Rank = 1;
/ s' x" R' [. o( [3 R, W7 Y // 采样时间间隔 Q: q3 {: @$ V# H) x, c6 B5 }! @
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;; z& F6 x( h8 z4 t* v2 H5 \
% B2 P, w! p/ r HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
8 w. w$ z3 D+ g/ E
1 W6 Z& g# v! M //---------------------------------------------------------------------------
! D" i; ~. h8 n; h ADC_Config.Channel = ADC_CHANNEL_5;! W7 U$ k- k% p( o1 U$ k
" a, }' W1 B7 K // 采样时间间隔
$ G8 s/ G1 S5 h. B% @ ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
! ], V0 F& a- Q+ X# ] 5 M3 k! V. w3 _$ P: S1 g
HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);; `+ l0 {6 u( S# e) N2 }: U
5 C" l( J2 @2 Q2 ~
//---------------------------------------------------------------------------
: A5 R2 T! L$ x ?8 B+ J8 L ADC_Config.Channel = ADC_CHANNEL_6;
& ] p( p, Q4 o% T0 R 3 Y" x& j7 c- B- Z
// 采样时间间隔
7 ?1 s! s3 n5 q v) D0 } ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
# h( H. |% V2 X | : j; K2 H% z4 D' e% m3 E
HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);
6 Z9 A! i$ {5 a- M# T" J8 R
# O2 ?3 x9 ?8 i8 o9 U9 b/ `6 L //---------------------------------------------------------------------------9 L7 N5 w1 ^7 Y( u
ADC_Config.Channel = ADC_CHANNEL_16;7 |! @& M8 \+ d: ?
# @6 f/ J# Q; x4 t# J% |0 {+ | // 采样时间间隔 $ N; [5 `7 N; Z9 V6 n: q
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;. L A: g; u3 w% }# q6 Q
& h- G+ G6 ?2 L$ F! H& v HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config); _+ Q T! Z0 b
: N1 v8 A$ E# F$ t* d1 s! y6 x
//---------------------------------------------------------------------------
# P. I2 b( l. } ADC_Config.Channel = ADC_CHANNEL_17;. B5 c( z" @4 U; e
3 u, Z9 Z: X8 \$ q
// 采样时间间隔 2 \8 |! B1 P, Z# x
ADC_Config.SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
8 @! x8 ~: ~% b* `" A3 z; t & g: ?' z. Z Z. @. S
HAL_ADC_ConfigChannel(&ADC_Handle, &ADC_Config);- ~! F! _9 H, \( l* {6 W& g
, a7 N: ]. b7 S* P
! L7 W& W; s3 B /* ### - 4 - Start conversion in DMA mode ################################# */$ W9 V4 A. B. M& Y$ O, J
if (HAL_ADC_Start_DMA(&ADC_Handle,9 Q, P: G- |! ?) {
(uint32_t *)ADC_ConvertedValue,6 J+ D3 u: m4 O3 n
NOFCHANEL1 t1 L2 W$ i2 A* `. C4 q) d5 S
) != HAL_OK); n- Y8 A- h) S+ y, X0 Y
{- X. m1 M4 F9 C& ^
while(1);5 m9 g1 N" y# w& B
9 B8 m" e, }) X6 }2 r1 C1 `( Y
}: @4 j! q( M# j
+ G2 b% H, _0 J8 U; v5 s# j代码下载:! {* l b3 G% A( p
FreeRTOS_多通道ADC-DMA _HAL.rar
(1.14 MB, 下载次数: 0)
; D" `; S3 m. e0 `% q3 ]* A7 O4 F
% c' u) v/ X9 b& M- C/ J: r
4 S2 g+ |1 F7 J" v* Y- ~$ H |
|