附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下! E5 L& N( h: j4 H4 i
% D* p; I1 A6 q+ q4 `$ S: o- /**
0 x& m$ x$ B0 H* Q! Q" h3 ]& [ - * @brief 配置ADC1的工作模式
- b7 I J2 Z0 `9 ? - * @param 无* [- Y G* n1 g1 V
- * @retval 无
: w+ n9 M P0 \& E( s5 G* G5 W - */
4 J6 m' {/ [8 n - static void ADC1_Mode_Init(void)
/ }- W- {+ |- } G9 O - {& P3 Z+ D' ?/ w& V; U v
- ADC_InitTypeDef ADC_InitStructure;
/ B) s8 @- S+ z% m) C/ x - & t3 f k" |0 Y8 f5 [
- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
o9 k3 r# G% G6 X, d! k5 p, R - RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4); $ G, c, | M/ d- E! |' f6 e
- " n3 t' X8 M0 R9 G2 U
- /* ADC1 Periph clock enable */
6 R6 f; Q% [, z4 b+ H% X* r4 u1 I - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);) Q! e4 k! P$ e( D
- % {4 h6 o, G/ A7 E+ F O
- /* ADC1 DeInit */
' O2 T) I; C0 x% { - ADC_DeInit(ADC1);/ Q8 W; j% X7 i6 D6 G9 b0 X, f
-
7 ^2 K2 u+ [# K& ^$ _ - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/5 [' S+ G. n7 q9 O, [
- ADC_StructInit(&ADC_InitStructure); / e) D: H3 W3 G3 w$ f! w! {2 o, y
- & p9 i1 Y. T! j! n
- /*配置ADC分辨率为12位*/* A0 U, Q! T3 R e4 S& t- q
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;: f# J: E( N4 x+ k3 R2 n, `% H8 }
- 2 V, E- W! C. B# C
- /*开启连续转换*/
- ^7 w7 S7 g* k9 i: j- Q/ M p - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
) o6 O6 {3 Z& \* h* V1 ~ - " C6 a/ }" w, a: ^, ?9 x- T4 s
- /*禁止触发检测,使用软件触发*/
! V! p, Y2 z& X( h& ? - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;; J. V' m4 E, P) G+ x; w1 r
- ( D# _* A% x$ B/ d
- /*ADC采集数据右对齐*/
6 L( _, O. y: T# t1 |' L1 r! [2 x/ g; H - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;9 B7 _1 L& f% G R# g8 w1 L# r1 N
- + ^; A e5 p/ j# j1 {+ d! e, r
- /*向上扫描*/
6 F, N; W# L5 f$ D* Y& i1 H/ n2 w1 P. t- U - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
" a- K, |" B6 l3 T2 X! O9 V; i/ a; f - & d" }; R, q1 n K) `% _9 ~! s
- /*ADC初始化*/
; T/ e8 Z% U( c# r, k - ADC_Init(ADC1, &ADC_InitStructure);
5 _ I u; {! o) N - 1 x, B* i3 }1 \8 y6 |- I
- /*配置采样通道及时间*/ h% w% u6 ?# J9 W* K) H
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
: G( c4 a5 Y6 }3 j( a% j
; s1 h2 V7 ^9 w8 b- /* ADC 校准 */
' Q% l" M7 t% [7 V4 h3 t( D, q8 M) ` - ADC_GetCalibrationFactor(ADC1); y2 L M7 h- f
. H* L) B! u% s; g0 _- /* 循环模式下的 ADC DMA 请求 */
; ~9 s& o. v, n3 L ? - ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
- y# L& T* Y- i( K, s( P0 C8 X - 0 W8 {' K5 S1 f! |
- /* 使能 ADC_DMA */
- U# y( `2 ?3 ] s- Y4 ~# F - ADC_DMACmd(ADC1, ENABLE); ) [ _! E/ Q# i/ o. U* W2 ]1 M
- 9 w7 R: c0 H8 [$ e
- /* 使能 ADC1 */+ J' L3 ]" e$ \' H5 H
- ADC_Cmd(ADC1, ENABLE); V9 q* U+ {$ Q- J4 s
- 0 a' W; c3 b) F/ G' B5 Q! Q
- /* 等待 ADCEN 标志 */# Z3 h4 |. }$ C. p8 \( x
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
d" V) S% [* C9 p8 F" A# i2 z3 U - + R( F7 W t5 f' w, _
- /* ADC1 常规软件启动转换 */
5 C$ Z6 ?; o) d3 \" x/ ~' ~/ b - ADC_StartOfConversion(ADC1);5 k( d# G4 U6 C3 J' J3 ~, c8 O& l$ y
-
. a- Q- X- |/ V1 y - }
复制代码
0 x1 O/ L$ ?; c" z" b1 E5 D% v8 i" m4 q. b8 B4 h0 [
|
* @brief Configures the ADC clock (ADCCLK).
* @note This function is obsolete." _* V4 I8 F* E, S' E* B! E9 R& [
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver+ V6 K0 {! p( s3 `' @# H3 d5 `7 D
* @param RCC_ADCCLK: defines the ADC clock source. This clock is derived
* from the HSI14 or APB clock (PCLK).% Y. a4 ?/ E& T8 |* q2 _7 I7 Y0 V$ [0 {
* This parameter can be one of the following values:0 _( z8 V5 v, {, l f& R7 A
* @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
*/9 C1 y2 D! t5 U& I# }1 |8 g
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)3 [8 U3 b( S n6 ~" ]2 ^
{
ADC_InitTypeDef ADC_InitStructure;# y2 F! x0 n$ C; @2 a" e
0 k9 p4 s+ d6 Y7 k, b* n* }/ d$ P$ Q8 z
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/, S2 }- `/ y; Y# `7 h
RCC_ADCCLKConfig(RCC_HCLK_Div4);4 T% A8 C q# m8 I! C- O
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.. W5 a/ O8 _! y8 I$ @
$ g( V, U8 T# X5 @
另采集数据全0,还没看那里的问题.. ` Z# X+ c$ q i$ g
9 z$ [/ z( [' z. F7 L- w: _
滤波显然会影响速度的吧?
滤波之后还能有多少bit?
你现在是内基准还是外基准?/ g; s1 ]( r+ E1 g0 p) l
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持