附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
% B" s7 {$ E( y* j: o6 H8 p6 W+ k* |' R* L0 j5 ^1 P
- /**
+ ^) j9 H7 u/ p' K- E, y - * @brief 配置ADC1的工作模式
/ A0 C0 k' x4 q! T: ^ ? - * @param 无, e3 I5 {: X% H
- * @retval 无
: w+ H" ~# h& D1 q - */
9 X1 y9 c. u8 t% E+ t+ f0 h* R$ H - static void ADC1_Mode_Init(void)
- u, s$ M* R; F m5 I% ` - {. L& L% J. z* ~6 Z
- ADC_InitTypeDef ADC_InitStructure;9 p0 D. z; j9 h1 ~3 u
. x0 v7 l' x# K7 t5 m- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/3 u( c- q: U+ q" r8 g- p
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
F' W8 A( G* [4 j' `0 p4 T
, _) Z9 V5 N" ]5 i4 n) d# i3 j- /* ADC1 Periph clock enable */8 U; S2 T& H- C$ E$ P9 U5 B+ C
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);; X" A4 @% J/ c0 ]: k5 q
- + g3 s1 X: h1 {9 {' ]9 b
- /* ADC1 DeInit */ ) K8 X* ]6 \6 Y* {, T
- ADC_DeInit(ADC1);: J R O6 y7 o% L R3 V1 n
-
, }3 Q% c O1 A( ~ - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/$ e* b4 s$ r; }. i% a+ D/ f3 D
- ADC_StructInit(&ADC_InitStructure);
& v$ @9 h# a9 b g3 ^6 _
0 Q+ ?" f. Q: x+ P3 r( Z. R- /*配置ADC分辨率为12位*/% \/ Z* C* o& S/ w
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
7 Q! k/ G3 J# r, a5 f% u - # @' W/ T( K- [4 T; u
- /*开启连续转换*/
" \4 D `; y* @' T* N1 | - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; # j; K$ ^$ [+ T8 C) ]
* r6 Q2 Y- }- B" {0 f+ a- /*禁止触发检测,使用软件触发*/6 j% h% z6 z7 b+ t _# x/ r" u9 @
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;/ j( A, _8 ~5 T1 _3 Y
+ p3 r/ \. C! Q6 E/ m$ _+ g- /*ADC采集数据右对齐*/
$ H4 M& D/ o( v( V0 e - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;8 {! c7 |0 z! l5 t0 X, I; U
1 H2 i9 ^2 r4 Y- /*向上扫描*/
4 D( u- [% q4 m) }! d# |7 q5 a9 d - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;3 N8 c- o4 `3 v8 G7 l
- ' W, A) S$ T% L: f+ B) P4 R' ^
- /*ADC初始化*/
3 D: H: B2 B. r - ADC_Init(ADC1, &ADC_InitStructure); 4 h' x( x0 W6 D2 m9 R. J
-
; C* |1 k2 w2 t - /*配置采样通道及时间*/
% G4 _+ D" O0 O0 x - ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); 2 D& l+ ?8 Q& M! P
- ' z y( U' U/ w8 p* b
- /* ADC 校准 */2 b9 a( }. y- J
- ADC_GetCalibrationFactor(ADC1);
% q# S& j9 n+ `! M6 _ - & S) ^" p- i! [! H& B
- /* 循环模式下的 ADC DMA 请求 */' D! c; K0 j8 }
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
, v9 s5 Q5 }6 G; s3 z( w, E - 3 y, `+ s, T$ X, u/ X
- /* 使能 ADC_DMA */
2 x1 v' ^2 k/ M3 H* J( W - ADC_DMACmd(ADC1, ENABLE); / `% S2 }8 K" I
" R/ [( p* |+ ^- /* 使能 ADC1 */
/ C0 x; T @! B* j2 t, _ - ADC_Cmd(ADC1, ENABLE); 9 [- ?% T3 C! n! u: ?
$ H8 [) ]! w% _' h( g% ?% u- /* 等待 ADCEN 标志 */
o9 V' D$ @7 T: U# l6 v: G$ w - while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); d+ T7 x- O: T6 h
- 6 ]+ B* B7 {) |9 }
- /* ADC1 常规软件启动转换 */
6 W- L+ i5 v3 Z+ \; o# K8 z) z - ADC_StartOfConversion(ADC1);, h% t/ `8 _' j8 X) m* k: S% ~: o
-
' D4 n; F, b: J" N4 Q - }
复制代码 2 ]% w" j" P) Q. n9 y4 m# @
8 P+ M p, L( ~
|
* @brief Configures the ADC clock (ADCCLK)." f! D3 [+ B7 ~$ _9 T' V' u
* @note This function is obsolete.
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver1 I3 o% C2 \! q7 x9 H% w0 Q
* @param RCC_ADCCLK: defines the ADC clock source. This clock is derived / W6 j3 v5 h7 q) a
* from the HSI14 or APB clock (PCLK).
* This parameter can be one of the following values:
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2. U1 s# q z/ f* j% u% ]' l
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None( S9 q9 l( O$ E* N9 M/ F; T& {1 k
*/
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)
{5 Q; f( d" b" J8 }1 G
ADC_InitTypeDef ADC_InitStructure;
T" M2 b& o3 p! f2 W4 x I- [# X) I
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);7 L, |2 X+ e8 s& n$ s" m0 |7 r
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.0 S! C4 ]' i/ [2 e, U! X9 l
# [' K) n' C( t" @ g; H
另采集数据全0,还没看那里的问题..
$ F. k' Q- M2 N" U
滤波显然会影响速度的吧?
滤波之后还能有多少bit?
你现在是内基准还是外基准?0 K$ ?. Q& y/ [4 D8 G
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持