附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
( f! Y+ k- h: b5 W8 g9 j/ M& i: }$ _6 G% W* F8 t/ q
- /**
: }, ^4 Y1 p8 \ - * @brief 配置ADC1的工作模式
2 u. }, u$ [- O( H - * @param 无3 i7 \4 Y( i6 e5 ~/ g" @
- * @retval 无
, [7 @' i6 J, v- ?: a, j - */( U- T! ^+ @, ?; `
- static void ADC1_Mode_Init(void)
+ n) m3 K! {/ T/ b- r2 z) A - {7 P" q p( O* B% V1 a! I
- ADC_InitTypeDef ADC_InitStructure;* y3 s, l h4 q; N
$ I# x: W* O0 ]" d! w- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/* `4 _5 I% Q/ G. Z' q0 r1 o
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
; P6 c2 c4 q# n: o2 V4 w- C& Z) c
. N4 e/ w, y: c0 @- /* ADC1 Periph clock enable */
# N. Z4 C' J" O+ o - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
8 Q8 G3 t: X c. y- l6 q2 K9 N8 d
7 [# q9 `" C8 _$ f- /* ADC1 DeInit */ . }+ y8 K8 n1 q+ Y _1 \. J0 J
- ADC_DeInit(ADC1);
! {, B6 T) G3 K! r" k -
' R6 i" e9 \0 h* X - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/ ~' b6 A# [/ l! T1 q8 e# B
- ADC_StructInit(&ADC_InitStructure);
# |% G7 a4 a( ^; w- U$ v
2 s- s8 ?( Z: ]4 N K- /*配置ADC分辨率为12位*/
& B( R6 H) [9 k - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;, K* \$ r: }5 ^: `
! E6 N5 X2 n; U, W& f0 H* b- /*开启连续转换*/9 | G( c) t' E( O$ ~+ l
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; * k6 ^. n$ u O
- ; O5 L+ e) y. p' T" U/ R/ L
- /*禁止触发检测,使用软件触发*/
9 Q- t. `+ x' B6 v - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
" W! u/ x7 j3 \0 I# u: `6 @
7 e' [2 k; Z3 a0 D- /*ADC采集数据右对齐*/9 p H- Q" [0 B3 G5 _) M6 C& A. q) D
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
1 a0 d9 ]# {% r8 d - ' J1 {0 x+ I% v, Y, B9 @
- /*向上扫描*/
1 M- R& h `3 L5 U8 h$ k1 A- O+ C - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;/ L1 R6 h4 u" I- r' l
$ M! u; `: l& ~+ C, j% |- /*ADC初始化*/9 H; l8 v- n4 g/ @) P
- ADC_Init(ADC1, &ADC_InitStructure); 3 [$ D! @9 U, m' \/ n
- $ ?# F5 J2 S# R1 ^6 Q6 D! ~5 n
- /*配置采样通道及时间*/
1 B: |4 t3 \# L# p) \: n5 R+ o - ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
- ~1 Z* C' L) z
, Q! E& t3 I* C* {& Q- /* ADC 校准 */1 B. |# R9 d/ f; K5 u# }: U* Q
- ADC_GetCalibrationFactor(ADC1);
) \, G, g1 d, n6 G; ^6 z - ' _+ M# `6 ~- T ~) C9 o
- /* 循环模式下的 ADC DMA 请求 */
% W; [. K5 @9 s8 O - ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
" Y: y7 ^+ ^$ ?5 e
q9 v3 x2 T6 G) v5 K- /* 使能 ADC_DMA */
1 R$ W- ]' S1 y8 h - ADC_DMACmd(ADC1, ENABLE);
2 v. d* D: b% y% `* Z( V! |
, y$ D5 X4 a9 v% d9 V- /* 使能 ADC1 */
5 \% b. v9 `5 X8 p$ n - ADC_Cmd(ADC1, ENABLE);
/ g$ b9 y b! L" m3 K7 b
4 T6 s9 ~6 p# H8 ^5 ?- /* 等待 ADCEN 标志 */: \: M! h- p# U/ N
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));9 y5 c; L* c; S! l6 I
- 0 w6 K9 ~0 y+ u7 Z2 s
- /* ADC1 常规软件启动转换 */
- K& E! N. S; |0 M) V) c' C: A - ADC_StartOfConversion(ADC1);7 ~- S8 `8 @6 B
- ' b; }" I! L n
- }
复制代码 3 e5 ^, k; J8 k
0 O; d1 |9 u5 z" d2 r |
* @brief Configures the ADC clock (ADCCLK)./ R2 e6 E, O+ x+ N3 X% s! R0 d: I
* @note This function is obsolete.
* 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
* from the HSI14 or APB clock (PCLK).
* This parameter can be one of the following values:
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)( n; C" Q3 ~4 {2 n
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2, C# {5 r( F1 b4 P! T: F
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None
*/
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)4 x4 ]5 P) @/ B
{; m$ o, x# W! a6 S: o
ADC_InitTypeDef ADC_InitStructure;
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);. q; j: l4 |. h$ \1 T3 `4 `0 P
% {+ U6 a0 q% _; y2 L. ?5 k* u
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.1 y. f6 S" A: I- T
另采集数据全0,还没看那里的问题..& W9 L4 n# u J: c) l& Z5 Z
滤波显然会影响速度的吧?6 E5 W2 p% T0 L! a# y. N( R
滤波之后还能有多少bit?4 P" q, x y' j* S; A6 N
你现在是内基准还是外基准?: b, Z9 x* \3 ?
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持