附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
% f" a; @' d3 ~' x/ }
& X; d2 k. Z# Z7 c) m0 o M4 J" t- /**7 S/ `+ s- c9 b |, H0 u; P4 @. _
- * @brief 配置ADC1的工作模式# C, v- {, c3 X# ?
- * @param 无
2 Z7 |2 Z( e3 \3 z7 [4 N - * @retval 无
* J' y2 b5 O( r* W) }8 Z - */
% z# h7 c( h( a; P( j" i- @7 N! e: d0 T - static void ADC1_Mode_Init(void) r& e" I/ }- k8 E4 |) k1 J. r7 @" x
- {" |# @! t8 h( O
- ADC_InitTypeDef ADC_InitStructure;6 h/ a% ~2 L; H% S+ v0 n! I P0 c
& [: Y# N1 N$ _" y- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/! j$ F: [ b5 e/ X0 T3 \
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
- i( G% J0 T- o' e$ y# l
- h2 f5 U! s. B( j' b- /* ADC1 Periph clock enable */! ?! A ~9 c: }; R8 e
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
) \* U9 R8 `% R S1 x - % g* e; G9 w; ?( B( o4 P% B
- /* ADC1 DeInit */ $ e y8 e5 }! J" L
- ADC_DeInit(ADC1);
' t8 q0 Z5 z! e$ E, ?. G3 ~ -
% W" |5 C2 S$ J - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*// Q( d) j* ?9 Z" d
- ADC_StructInit(&ADC_InitStructure);
1 Q t7 p: T8 a" u+ Z - $ x9 n5 Y, q% B" j. C% ^# Q
- /*配置ADC分辨率为12位*/" x! V: z3 u. M1 k1 F+ k
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
! J$ J2 R, ?3 X2 \ w0 e4 j* d - . E* Q, A. {) l. b9 u0 ~
- /*开启连续转换*/1 q1 k' S: y) ?2 j7 z0 z: x
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
7 k! W6 _+ D& e3 E5 G
) O& r8 e% }$ n& f7 r& r( ]- /*禁止触发检测,使用软件触发*/
2 u- u' h2 N! L) O/ C& C2 o - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
8 F/ M5 M- C8 x( u9 H8 S
7 |, A% }4 r: O8 J+ V3 {6 j; P- /*ADC采集数据右对齐*/
! h' ]. f& A3 b - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;7 a2 ~6 M" g8 x) B# {% b5 u
/ F- q! o4 Y! \4 a6 `/ \+ e- /*向上扫描*/
- t* J2 b* z# E - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
- P1 z$ @' H' M) v+ t2 c$ l; h" P/ c - # q. `( i ?2 n& {) H4 {
- /*ADC初始化*/
6 ~/ u2 f- M6 k& r3 u - ADC_Init(ADC1, &ADC_InitStructure); + k" X' ?5 b% j$ w
- ) c2 U5 s) p- ?2 `
- /*配置采样通道及时间*/
( I6 V! x+ w; G A# U* w - ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
/ c2 e/ }. C$ a: `1 l$ w. d
+ y: g5 W$ G3 M+ E7 B- /* ADC 校准 */
# B* o; O/ `0 ^2 w; B3 H- E - ADC_GetCalibrationFactor(ADC1);
3 z) k% `( L$ q% _1 W - ; D+ J! ]! o) H, }0 b- o& G: Z
- /* 循环模式下的 ADC DMA 请求 */. n6 y8 n' m. P1 {/ S$ ?
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);3 v$ O- \; W$ n y
- 2 s' x& W: {4 m; u6 B* b( t
- /* 使能 ADC_DMA */
* G' Q- y: f s: m: X - ADC_DMACmd(ADC1, ENABLE); ?; F; K1 I- a5 ^* p
$ Q: B/ p% {- _/ m- /* 使能 ADC1 */3 S( T5 ]% D. Y- ?5 B2 v
- ADC_Cmd(ADC1, ENABLE); 4 a, p& W4 ~7 z! q' E
- * k A: A% J5 [3 w0 }
- /* 等待 ADCEN 标志 */5 c$ f& r, B6 N/ g0 s3 m
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));9 ^+ k8 E1 }" Q& M y% i& a
- 0 x P! W: ]2 V' H$ I
- /* ADC1 常规软件启动转换 */ 4 S4 C/ L" m/ h8 C
- ADC_StartOfConversion(ADC1);; d) |+ L) ?( }9 o7 W0 c- ~; r
- ' v; @6 y# k( B2 j- s" E" I& Q
- }
复制代码
8 y7 q; X7 f8 l* ] B; w% r% ~7 x: o b- L
|
* @brief Configures the ADC clock (ADCCLK).
* @note This function is obsolete.! g5 B9 @" R) M0 x
* 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 2 _% q8 l) T, ~2 O/ i2 d# y
* from the HSI14 or APB clock (PCLK).6 ~4 C4 {: k5 O$ m
* This parameter can be one of the following values:
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)7 ~8 y3 M0 y) h0 D
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/25 Y8 j/ u0 j' _; |/ U
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None
*/
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
1 G$ p0 P9 V _5 h
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/# \8 x) b! E$ Z9 p+ O+ o& M5 R7 E
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
- |4 P' L, s6 Y
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.5 n$ h: |5 E5 o- i
. }& Q) r# {3 ]; w
另采集数据全0,还没看那里的问题.., ]- k1 E5 O/ X! K
滤波显然会影响速度的吧?
滤波之后还能有多少bit?) m& \7 c- D& b; p$ ~
你现在是内基准还是外基准?
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持