附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下, K2 r9 a6 P( V& S9 B p5 y
+ ^: n& z, m. F9 g8 _( r6 Y8 R5 ]
- /**
! K9 m# h) A1 u+ ^2 t - * @brief 配置ADC1的工作模式. u3 C$ [ Y: G
- * @param 无
7 U3 H- \, t" H; J" r3 n - * @retval 无' J! E: W: r+ V& j- f
- */& s& K8 y: O# Y" _" |6 e3 `0 u. w
- static void ADC1_Mode_Init(void)
% R7 G. g& S* m! F) a - {
9 f. X; L4 T, U: F+ w - ADC_InitTypeDef ADC_InitStructure;* {1 M/ _$ h! y+ X& L/ E4 F9 X
/ ~. L" A2 F0 A) U2 `- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/( T0 x+ d K( h2 U; {
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
1 O0 H+ U. Y( a# v7 u1 l: D3 B - 5 ~9 l B l2 c- F
- /* ADC1 Periph clock enable */( R$ S4 m0 L9 j7 S" Z6 Y4 _
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
; |7 z7 D1 I* u+ k
8 `! F4 i$ s1 ~5 e" [. ~$ n O( L1 f) H- /* ADC1 DeInit */ + |1 }; W/ X& ]1 h% X6 G
- ADC_DeInit(ADC1);
! V/ ~6 e' @( O( M& E7 ^6 l* k9 @ - ' l- p1 J, G6 r, [: h
- /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/4 d8 Q, v j0 F: r, o5 y9 v
- ADC_StructInit(&ADC_InitStructure);
8 g: O" _! p" l- J+ R) i - 0 j1 Z. ]6 ~2 ^7 Q
- /*配置ADC分辨率为12位*/
! V" O/ w5 e# m7 _4 b/ c3 x - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;7 a. S1 E# y+ Z' e
5 F. w! U' q) ~5 [- /*开启连续转换*/
* [4 ?) S u, k6 @$ } - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
) s. O) C! f) `9 T4 P5 [
5 I. n( S/ D3 H, H- /*禁止触发检测,使用软件触发*/
1 ?& N/ J' O. x1 e - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
; P7 N. q/ E; S! \6 ?: l" {
3 j/ A) j/ O$ H& `- /*ADC采集数据右对齐*/
2 A* r4 P+ \' ~ - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
3 N, v* ~! {+ G7 ]% X; p9 H6 m/ L# g4 Y - ( N6 Z; C( C+ |+ L
- /*向上扫描*/
' v! D! X8 l8 D/ V- P: y% o1 v; T - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;2 f, j+ z0 Q# \. L1 j
E/ k% J0 y- z! J, d, x& u- n- /*ADC初始化*/4 ?% G& m- F( w+ ~. A9 L0 }
- ADC_Init(ADC1, &ADC_InitStructure); 0 | m" e% Z$ ^( F* v
-
8 v0 E0 H- p( ^. T5 T - /*配置采样通道及时间*/
" _, c q+ q5 v' Z$ { - ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
! _* M X S& V! y2 _
6 g' |" ^9 R) B# m- /* ADC 校准 */8 ] s* F9 e A
- ADC_GetCalibrationFactor(ADC1);
' x. s% N. W, d2 H6 N+ f% o
/ N A, W" j2 e; f W' A. S- /* 循环模式下的 ADC DMA 请求 */" w8 _" v7 {. c ]5 g* h* S
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
) P f, u8 F/ ^: q; y
* D/ s, [( Z% k( j5 R3 n$ v- /* 使能 ADC_DMA */
$ t# `+ P; \& o" D7 E2 P - ADC_DMACmd(ADC1, ENABLE); * s4 `$ H; z8 H
$ Q2 e, U% M% j+ w0 @4 B- /* 使能 ADC1 */3 F! E7 D+ |6 `& X
- ADC_Cmd(ADC1, ENABLE); 5 m) ]9 Y2 Y5 b3 j8 x' O: v* I* j& n
- , e! x8 y; q2 F
- /* 等待 ADCEN 标志 */' t9 D& k2 U2 q) f: j+ k, c8 |
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
; L7 j0 e) f. t- t - ) a$ \+ w2 g" N7 p( {
- /* ADC1 常规软件启动转换 */ , J/ E+ l9 Q& l# n1 e$ b" v7 y
- ADC_StartOfConversion(ADC1);0 c5 n- W# h4 c ?. a
-
9 n$ J8 O- E U& c$ t - }
复制代码
& [2 d0 E" M' L4 F- m7 l8 I8 S/ n( O& b* |# J; [
|
* @brief Configures the ADC clock (ADCCLK).
* @note This function is obsolete.4 V6 Z8 r/ ]$ p( W7 y5 F* K
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver. m# M% d# J" W, F' {6 p
* @param RCC_ADCCLK: defines the ADC clock source. This clock is derived
* from the HSI14 or APB clock (PCLK).
* This parameter can be one of the following values:1 d0 W- w$ J" M9 i8 {! c* w
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz): K* a) @& [: j6 |) b" N
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None7 y7 B, P- E0 f9 |" B6 ?
*// ^# a* L1 Q/ q' y8 L8 [; R
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)3 `; Q; D( n1 ?0 |# g3 U) N$ b
{
ADC_InitTypeDef ADC_InitStructure;
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);% d8 U8 g! ~; C' D
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.# `1 n& Y# `5 P# ~. j7 V
另采集数据全0,还没看那里的问题..$ K6 O6 S0 [# k9 `' p' H/ ]3 M
2 v" Q) E% x/ `1 V2 F# ?& d
滤波显然会影响速度的吧?
滤波之后还能有多少bit?5 L2 G$ u/ W! i. I
你现在是内基准还是外基准?) p6 \+ ^( D# ^" J, T
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持