附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
& E" z% q; j5 i+ _, {. S J; G+ n9 E0 H
- /*** @7 S- b; f, H0 q/ G
- * @brief 配置ADC1的工作模式
5 D! z& B( |* f8 v# M, o) |: ~5 z - * @param 无) M% _- n* O8 W ^
- * @retval 无
! L- X, [: v& G) k6 w$ H/ n - */
+ S \& P$ b' r( D - static void ADC1_Mode_Init(void)
) ?0 X! _# P2 n& M1 Q4 U6 ^9 z6 S: y - {" z \' G; x/ a
- ADC_InitTypeDef ADC_InitStructure;
$ W0 I, Q/ m4 Y- t* p
- z. J) @1 r0 r8 ?- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/, t/ K6 ^& P% B: f" e G4 E
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4); 6 {. [. S- [5 R$ @% u; \& l
- : g1 g6 W: K' p/ C" K1 n
- /* ADC1 Periph clock enable */8 n( W# a5 `6 Y# w/ W# {* B+ f
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/ B- |# ]: ^7 | - 9 I H6 W6 F4 [1 ~9 i8 p
- /* ADC1 DeInit */
8 l: m" W& U7 O+ J7 v* Z* I7 F: H - ADC_DeInit(ADC1);
1 ], D |6 q2 j) \) V - 1 i; [0 z* A! @7 O9 p! T5 Q
- /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/# p% H O' F- h* ?( h" k# R
- ADC_StructInit(&ADC_InitStructure);
& g" u% l, U% a - + N q4 d, r0 R
- /*配置ADC分辨率为12位*/' \6 p7 d+ F& B J4 N; r# I- ]
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
c; _4 }3 _$ L) q
4 S: r' r9 I7 g1 w- /*开启连续转换*/6 q3 F% B3 G. l4 l8 m! x5 ]2 Y
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 8 h& l1 t9 @! p, ?
* z, U; e5 Q7 B/ x- R1 l0 y- /*禁止触发检测,使用软件触发*/
I2 `! ?" Y% G E' c. F7 I3 q4 o$ Q - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
1 q) R( t+ f$ o& y3 q - 5 k0 O$ {9 Y* V8 h
- /*ADC采集数据右对齐*/: X- b1 {, v+ ^( L$ z
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;" }% L/ Y( H9 r
- , H, N) x; G$ Z2 w
- /*向上扫描*/
% u$ U5 I9 G% e4 i - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;, R& G N! q ^) S* i
- # o: O6 o" Q5 j+ F5 p
- /*ADC初始化*/5 v, r8 s( G- _
- ADC_Init(ADC1, &ADC_InitStructure); ( F' y: N/ n# p+ t% E& O5 \
-
8 k7 W& w8 e2 s. w7 u - /*配置采样通道及时间*/- {/ |' s) Q: y
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
' i' c7 d2 }/ q6 G0 Q$ D
" ?1 g4 S% J, c+ ~& S- /* ADC 校准 */, s. R2 p! T! [# e& p/ t
- ADC_GetCalibrationFactor(ADC1);& |/ q, f! Q% H# C) I" n
- 2 c/ o8 r3 A1 n( t* h% i
- /* 循环模式下的 ADC DMA 请求 */1 S; L- f0 W9 ]# k: b1 P
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);$ p. I% K/ \4 N+ j3 @% l) G; c% S
& `/ t. l! K. o& u4 j- /* 使能 ADC_DMA */. g! A0 @/ J( _" O1 @5 R' U( X
- ADC_DMACmd(ADC1, ENABLE);
3 g+ t1 z8 `% I) T8 H! X0 f
1 | x- R/ P' r. k- F1 y& {' N+ r- /* 使能 ADC1 */8 p5 s+ i* \' f. {, g C8 ^0 t/ N
- ADC_Cmd(ADC1, ENABLE); ' Y+ R$ v2 _ D4 ]% I9 e3 v
- * `: i$ j) s- F2 x
- /* 等待 ADCEN 标志 */: I- b' |$ s1 U! F' `
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
$ ]$ r) \7 A: @/ { - d {3 \' e4 \$ i E, b8 n2 K
- /* ADC1 常规软件启动转换 */ + @# l) p' D/ j
- ADC_StartOfConversion(ADC1);9 X* e Y% E4 Z! _* h
-
( o9 O4 A8 q* M+ P: q( g6 f) J& G+ x - }
复制代码
( Y% ~+ k5 @# r
Q4 ?3 x6 L S( C* n8 h |
* @brief Configures the ADC clock (ADCCLK).( z4 f# S- I7 g3 z
* @note This function is obsolete.
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
* @param RCC_ADCCLK: defines the ADC clock source. This clock is derived 7 Y! q: v: t9 @! _: \
* from the HSI14 or APB clock (PCLK).+ `$ i3 ^0 X& u8 Q7 n% b
* This parameter can be one of the following values:
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2 |6 j' I( p/ I. |
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None
*/& m0 C) H0 i3 X! }
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)/ E4 X- }7 q6 F3 b' @% Q
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
" S1 B! d& ^ E+ @- S5 R
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4); e% L( D' k3 g# Y$ S& i* @6 Z
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
, W3 H7 ~8 u( C; m# Z) p/ f5 ^$ t# P
9 i% l6 F" v0 r# J* y5 F
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.' R* R9 d- a, ]7 s7 d {
" \4 T" }7 s3 S1 e% P
另采集数据全0,还没看那里的问题..
! l `% g. c. J4 _2 Z* Z
滤波显然会影响速度的吧?
滤波之后还能有多少bit?
你现在是内基准还是外基准?
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持