附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下: Z. t/ R0 D* ^9 j. ~3 Z
. C+ U; A8 b( b% l6 g8 h( k' O- /**
6 t- ^6 x2 N: K2 {4 Q9 X- a, C - * @brief 配置ADC1的工作模式
, `4 d% n: `% a" ~3 a6 Q - * @param 无
! s! I( o" l, z$ l, u/ \9 [' ~ - * @retval 无
* v7 h7 y& m& g ?1 j5 V - */
, T' z4 [, T6 Q8 j - static void ADC1_Mode_Init(void)6 d) l- x$ Q" C7 q7 I) d. M
- {
7 K. m/ e4 Y: R; N - ADC_InitTypeDef ADC_InitStructure;
" _. I) M& x) Z
/ T2 x4 _7 p' P- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/1 d7 g; X1 x# g+ u* c* P: W
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4); % }2 p2 }) M) Q; ^3 B, w* d
- ' l4 v# D ^0 }
- /* ADC1 Periph clock enable */
. \6 @, H5 S$ L) n - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
5 c! `0 x+ n$ h/ G' b
# ~/ L" @/ Q( k- /* ADC1 DeInit */
- S$ s! t/ l' \0 U, V1 _ - ADC_DeInit(ADC1);8 x6 v0 j: z2 J: n* o/ K
-
& p& B/ ^ Z0 v: |8 n4 g3 d - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/( F% a2 ?. Z1 F: \% ~2 a. J
- ADC_StructInit(&ADC_InitStructure); / A3 a+ a Z+ N' N1 V
- / u5 U( y X% u$ a. N" _' n
- /*配置ADC分辨率为12位*/
4 F& b/ _8 s/ R8 ? - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
7 W# Z3 Z' \- ]' t3 b - ) J- j F1 V @. ~3 K
- /*开启连续转换*/
. S6 \7 `6 c3 u5 ~* J+ o' O0 c - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; z- }; E1 T, B) k6 Z5 P
7 p( ]) a" w" k" i5 _. ^- /*禁止触发检测,使用软件触发*/
+ ^5 ^7 @+ E- y8 z* |" e! S - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
2 l5 ?8 @, D P r2 b+ m - # p' y- k Q, i& X. w' v' [& |
- /*ADC采集数据右对齐*/4 |( V5 a2 H+ \* R# N! T) f1 T5 g6 J
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; \: U {# f! d' V
+ q! [& ? h+ m- /*向上扫描*/3 t) D( I0 s3 G* ^3 C1 @) C8 z; U
- ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; Z: L" R8 @2 E* z3 M
- 4 b# }4 p/ Z' O( @+ R; w! t4 h
- /*ADC初始化*/
2 R2 M8 r! v, o7 C5 n8 f' b: } - ADC_Init(ADC1, &ADC_InitStructure); ' W& |- B2 q1 k% A
-
3 _3 Q" h1 u, |8 ~9 a - /*配置采样通道及时间*/+ z l2 l$ o$ P5 y% e# n
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
& W4 e# O; \7 z- J& g - 5 T) Q ~7 b. w1 [ N
- /* ADC 校准 */
2 Z; q( J* y |" z: |( Z/ _ - ADC_GetCalibrationFactor(ADC1);
9 C, m, W, @9 ^ H2 Q5 s
4 ^- c- @. d2 [( G0 [* ?: U- /* 循环模式下的 ADC DMA 请求 */) x, u* t9 {( ~
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
4 Y; I' Z5 C! w" Q+ s# d* }) w - 1 Y8 `: K3 S9 P D: n. j
- /* 使能 ADC_DMA */
) F! Z7 p9 H( E' a - ADC_DMACmd(ADC1, ENABLE);
$ e9 }7 w- p3 r ?" n" L- h/ c
" c3 N7 [3 J$ Y; H- /* 使能 ADC1 */
0 r9 p: R" y: P, Y4 t - ADC_Cmd(ADC1, ENABLE);
% s' p( _" h! U8 ]
, z) ?3 ]6 N4 S! H( K: p- /* 等待 ADCEN 标志 */) r* w- u2 F% H9 o! f
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));' e- m# K) u: k0 S- |
- ) J) c; K4 C1 }( f8 G9 E; D$ ^
- /* ADC1 常规软件启动转换 */ ) Z% u7 I. j( Z, k* b
- ADC_StartOfConversion(ADC1);
% ~ O# b |# d# W5 _/ }/ h - 8 l: W9 z& r2 N5 D; t6 j A; H) G+ Q
- }
复制代码
2 t( S+ o7 t. l$ i# w9 ~$ _$ Z# Q+ \5 {2 Z
|
* @brief Configures the ADC clock (ADCCLK).
* @note This function is obsolete.- d: d3 p6 ` N7 l# n7 M' I
* 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 6 a' O4 @( e `. p; s1 n" K
* from the HSI14 or APB clock (PCLK).3 ?1 D& y, r9 e3 |
* This parameter can be one of the following values:
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz); i$ l/ Z F5 C( ?0 T5 o: m
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2( Y5 F: W& q7 \( \# r B/ C, {
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None* x$ ^: {0 l8 g% Z0 k' ]
*/2 f# c$ t$ m& _! j$ m0 w
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)
{& `, T$ r1 p- i) Y- s7 n
ADC_InitTypeDef ADC_InitStructure;
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);# X; J) P0 U0 \, _. A% q
# Q0 P: [: v! t% M k
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
7 U5 J" i) J! ^) v8 |4 d# k
另采集数据全0,还没看那里的问题..
滤波显然会影响速度的吧? j% f7 |8 F. V
滤波之后还能有多少bit?3 Q) U( D# C+ P
你现在是内基准还是外基准?! \2 O4 b5 W1 ^
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持