附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下) X3 X: P+ \4 r9 l }' \8 j' a
- \ x; g7 c+ W0 w, k0 F- /**9 M6 k6 o; l2 J) d2 `, I& N
- * @brief 配置ADC1的工作模式* F# | o% a @! \, \7 t# q
- * @param 无
4 Q+ }3 v L' r' b - * @retval 无# @3 ^ I* i* v6 [7 e0 a& x( D
- */& O! D# p( E; z/ I1 q5 z5 r2 _2 U
- static void ADC1_Mode_Init(void): V! J) q6 h; {6 p" |6 S
- {
m+ v% G* Y: O' ~ - ADC_InitTypeDef ADC_InitStructure;9 ~0 c; x. y o$ q4 @
7 }: S. w$ r; @3 {6 q- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/- ]/ X$ X* A* S9 V
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
' D' B) @+ K. z+ ?! A& y4 X6 S - # `' _6 ~- [0 v; Q* t8 i& B
- /* ADC1 Periph clock enable */0 n) E7 E4 M2 ^2 |7 `' M
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
* }7 ]* T! w6 J B - S# I) x; x3 S" S8 h% S
- /* ADC1 DeInit */ ( g: S/ ~/ s5 Y
- ADC_DeInit(ADC1);0 W& U9 ?: M, N/ @, |
-
& d0 o3 M# l/ b4 O( [2 U - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/
+ c4 i7 t# c# h& u% u2 y - ADC_StructInit(&ADC_InitStructure);
2 q8 ~0 Y& C9 z- r
6 j7 W# z/ J+ _& Y) m$ k" d- /*配置ADC分辨率为12位*/
0 T' n- g: F( o5 e! x - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;: Y- U% v# k, o8 M
- 0 a' d+ b, [8 A$ f5 b6 i
- /*开启连续转换*/
8 ?& S! A2 s% G: @( t1 g' I - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
5 F: I# P: x- r( V4 `9 k - ! L- g( b7 W( ?, S! D
- /*禁止触发检测,使用软件触发*/- w+ U/ A+ U! n) H2 B
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
) C9 e1 z) t6 M1 X$ `8 Z: e8 v
Z% O) ~' {* P0 d6 h- /*ADC采集数据右对齐*/5 k) I! y, m$ ~1 P$ z
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/ r1 |, X1 L9 m9 _
- - _+ B! R, l) }
- /*向上扫描*/
, m3 E) F9 m8 d - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;+ D8 Y; Z* |; j: `9 Q0 g7 R
- d; q5 H8 e+ w0 n: J ~
- /*ADC初始化*/
* c5 a$ `3 @# q# k5 K+ @' { - ADC_Init(ADC1, &ADC_InitStructure);
; G) U) i" K% G8 @ A7 K -
- Q. b( o) F0 B. _2 I! @/ F8 t, K- G1 L" u - /*配置采样通道及时间*/
! r+ {% @" r6 F8 C - ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); * |6 c3 l' j# ^3 Y: q+ A% k" @
- - w' J) f+ |8 W/ W
- /* ADC 校准 */+ ~ _. K6 T: L: P: ^1 @8 o
- ADC_GetCalibrationFactor(ADC1);
6 T1 F6 W1 C1 K
& G& r% }( T0 G( t- /* 循环模式下的 ADC DMA 请求 */
4 a# T7 o) C4 u - ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);( N$ U" J$ Z3 Z' L" s' v
" ~7 j! `: Q3 X h$ D6 b1 i/ F- /* 使能 ADC_DMA */
( X! ^' c8 l1 V/ `2 O( V - ADC_DMACmd(ADC1, ENABLE); / ?( ?0 H& c" r$ ?. L! f! d# g1 v
, M6 x4 l+ L; h* }7 h+ ]1 X- /* 使能 ADC1 */
1 R% ^ M0 Q9 i3 R0 B - ADC_Cmd(ADC1, ENABLE); ( ^$ Y( a4 g" N# R8 O V
- $ ~8 a$ e% n ^7 M) s k, g
- /* 等待 ADCEN 标志 */" Y: J$ k0 J Y# a" S
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); F; J3 ^! J8 L$ |& n: N5 R
! v+ v. ~ ~* N' s6 @- /* ADC1 常规软件启动转换 */
( s E1 g6 g% q' p# M- Y+ w! ^ - ADC_StartOfConversion(ADC1);8 V8 B! R( y) q: K, n' D
- % _4 C4 r/ D. B6 k3 n6 s
- }
复制代码 8 v( g- _# y. y9 H3 y/ b9 E4 f1 q
' \/ ^4 V8 }+ }0 [# ` |
* @brief Configures the ADC clock (ADCCLK).1 ~6 g' j# ]/ b/ y& e& h
* @note This function is obsolete./ |4 q0 m3 p! a' H1 ~
* 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 . M; I9 A9 Y4 ]+ e( p- V/ @' E' ?
* from the HSI14 or APB clock (PCLK).
* This parameter can be one of the following values:; _0 d$ |( f4 r# v4 ~" ^2 e1 T# _" c
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None- h. ^2 l* e( ?
*/# P5 j6 p3 {; V5 M% ~+ b
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)3 O C* \8 c; J# K5 K
{$ O. f1 W; u/ d3 y
ADC_InitTypeDef ADC_InitStructure;
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/9 p. S! s4 r1 d7 y7 f4 |% ?
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.9 d9 K8 e& m+ e6 G
另采集数据全0,还没看那里的问题../ V6 s" R4 r `. m
滤波显然会影响速度的吧?) y. H, _, Q3 m& G
滤波之后还能有多少bit?
你现在是内基准还是外基准?* y& d7 u$ b5 C' w, H# {/ i
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持