你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0 ADC(DMA中断)多通道,注释超详细  

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
, T2 H* e/ x. n9 A/ i7 A, K5 V$ C
8 Q' l3 @" Y# Q; _! X
  1. /**
    1 G0 P6 I% }+ g
  2.   * @brief  配置ADC1的工作模式
    0 f8 ?' M# }+ T% r( f
  3.   * @param  无
    ( _( j% c! i  h" n5 }
  4.   * @retval 无+ f* |. [. u$ p
  5.   */
    . c& w  |& ?; ~7 F2 g4 }1 |3 M
  6. static void ADC1_Mode_Init(void)
    9 t# |" ~$ h6 F* o
  7. {
    6 `9 `& h* i* j& u
  8.         ADC_InitTypeDef     ADC_InitStructure;/ S) ~9 J6 L" K( S$ e! ~. W% \
  9. ! a9 a  B0 {: Q# I6 }+ G, f
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/& S$ S* `( r6 b
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        ' R* [" o5 V0 t# v: L

  12. ) C+ s, U2 y3 b9 `# W9 f
  13.         /* ADC1 Periph clock enable */
    ' W/ i) E3 K/ U
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ; N$ v' A  w$ ]. N. {! W
  15.   E( N0 A4 V2 z! o- w
  16.         /* ADC1 DeInit */  + `8 M( W4 i9 K9 I7 Q8 G
  17.         ADC_DeInit(ADC1);; v" T2 O/ t3 Z8 q9 J  Z
  18.         
    ; Y. h& D5 r9 }
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/
    5 f( A( S: `$ |. c  {5 m
  20.         ADC_StructInit(&ADC_InitStructure);                         . F# {* F$ I5 A9 G$ X% X" f. j0 d) X
  21. 4 p) S" R9 P4 ^- ?8 o, _9 s
  22.         /*配置ADC分辨率为12位*/
    % z5 o4 F) z9 h
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;8 Z6 F! t3 G1 c% _/ }
  24. " ~% t1 e  w% B2 @9 ^
  25.         /*开启连续转换*// z8 J, N. I. }( m& z# D
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ' P8 e4 S1 n. s+ \
  27. 9 G; H0 r% N) ?9 X
  28.         /*禁止触发检测,使用软件触发*/
    & S6 v: s! u( i0 }1 l
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ' i% {) x+ B3 Y& l
  30. - L  N) |5 w9 w# y% n1 ?# N0 T
  31.         /*ADC采集数据右对齐*/
    ) T: W, m/ [$ f1 o' j& B
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;7 |  u) k# k/ @- [2 v% I, w# ]

  33. ( E. _1 h4 W" y3 j
  34.         /*向上扫描*/4 }; ]& A/ [% ~! o8 _/ S
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;; \% X- G1 q  T, G2 U
  36. 4 J$ o# J; y1 {: T' D( w
  37.         /*ADC初始化*/
    6 T/ D- y! ^3 H; N  |7 n' |
  38.         ADC_Init(ADC1, &ADC_InitStructure); * k. a# r% G9 U% L# A2 x
  39.                               
    : q. r8 _: F# o! P! S! w' R. N
  40.         /*配置采样通道及时间*/  Q0 k6 ]; h! b8 C: ~+ k* d
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); # z5 x( g, V3 m: T
  42. * _; h9 }% M* g( f$ u
  43.         /* ADC 校准 */
    3 P* A# s. S% e5 F3 t
  44.         ADC_GetCalibrationFactor(ADC1);, O6 [* X/ u0 W# }- @, `$ p
  45. % H! P  V" T# S# n# p. q( G
  46.         /* 循环模式下的 ADC DMA 请求 */
    / S/ U2 P, {$ M% W/ @: V4 A/ N
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);( f' m4 g( o+ N4 c; i% Z
  48. " s! y; d/ p" n2 z
  49.         /* 使能 ADC_DMA */
    7 S1 C2 _# h) S9 R* f
  50.         ADC_DMACmd(ADC1, ENABLE);  + P. ^1 N, L* M, n! y  D

  51. - W5 v; E' J7 l# V" v4 h6 {
  52.         /* 使能 ADC1 */8 X5 i( N8 b# Z1 {' V
  53.         ADC_Cmd(ADC1, ENABLE);     ' D% `& E7 n8 ^
  54. & _5 b, T4 P5 O, g4 }* h2 s
  55.         /* 等待 ADCEN 标志 */' [3 |% C. ^) v3 ~) N: ]
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    % }' H. l% f- G
  57.   j7 q1 R. |, Z/ m1 u  E7 |9 ^
  58.         /*  ADC1 常规软件启动转换 */  
    % U4 ^6 D9 N6 V# n6 y. ^' B
  59.         ADC_StartOfConversion(ADC1);
    2 W) g. ~  H% n( \: T7 ~
  60.         . O( i# K3 B# b8 t/ |. f
  61. }
复制代码

; j, [; U) Q4 G/ @' {: f! O4 D
" C: c3 T; d8 l, R  s

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2796

评分

参与人数 1 ST金币 +1 收起 理由
wbaojang + 1 淡定

查看全部评分

收藏 13 评论95 发布时间:2015-1-8 09:33

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**2 J2 o8 n! `2 c/ E
  * @brief  Configures the ADC clock (ADCCLK).
  c: M, L" B- o5 Z9 m; @  * @note   This function is obsolete.
  F' {/ t( q4 ?3 h  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
& n: f7 R, x& \7 e1 n: L) j( Q) E7 M  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
! {% q0 A4 X4 a8 x# A  *         from the HSI14 or APB clock (PCLK).9 C: f. y! |: t; c
  *          This parameter can be one of the following values:9 {4 H9 k7 a. p& ^: W% ^. C
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)% C+ f" [3 Z* V* W0 j6 p" i2 h
  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2# Y- t2 j1 h% B  D
  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
+ S' f( [* N% S! q7 T% M- K6 a  * @retval None
' u' e. X7 y" z- m/ _7 Q# |  */: Z! q0 R) q. j& p2 ]% {1 h! o0 ^
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
* {# S9 X1 h* P7 u: f此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

" a" {/ X0 R8 C! D* kvoid ADC1_Mode_Init(void)
7 |3 U5 O9 |2 v/ s" `; J8 v+ i{
* z5 J8 C: R) {  S    ADC_InitTypeDef     ADC_InitStructure;
( \! K  j9 V6 t8 l
' _/ p% ]. N$ [6 i8 R4 x) R4 ?    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
1 r: ^2 _/ w. l4 c: i# P$ c: i) |  D    RCC_ADCCLKConfig(RCC_HCLK_Div4);3 R  z! [' c/ X/ g+ \. U( ~4 s
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
9 Y" y! i/ ^6 X4 K* P  \# C! n
) ]$ D3 i& N, k7 s% |# D/ r( |: I2 e) W  T/ T$ H& ]' e
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.% M5 {$ H! e, m' `, w
7 p0 B; f2 Z7 F
另采集数据全0,还没看那里的问题..
; n) m3 C% o# |2 ~$ q
6 }- W0 [- A+ a; w# y. e$ ]
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:429 g2 }: V4 h1 h$ n9 j
stm32ADC飘得还是比较严重,不过加了滤波算法后还好

2 ^8 C8 Y. u$ ?. O! `滤波显然会影响速度的吧?4 ~* h  W+ r/ ~. e* y% G/ W
滤波之后还能有多少bit?$ ]) V) f$ n1 a3 m  ?& S1 n, w
你现在是内基准还是外基准?
. P, q, O' R% M2 F+ A0 O内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了  呵呵。
dajin123 回答时间:2015-1-8 09:33:36
沙发自己坐
埃斯提爱慕 回答时间:2015-1-8 11:42:01
提示: 作者被禁止或删除 内容自动屏蔽
lovewyufeng 回答时间:2015-1-8 13:01:36
多谢 分享
dajin123 回答时间:2015-1-9 08:32:43
dsjsjf 发表于 2015-1-8 11:42
0 h# U/ Y! ]% R: x. `谢谢分享

5 R6 N" N* l* w/ a+ d能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:014 l5 n2 z$ h- X! A
多谢 分享
* y% r% |1 ~+ P1 r5 ?; {) O
能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
# d' F5 x) h! ~# K  K* y
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
1 L4 z9 e" S: F; D/ K' F数据从哪里读取呢?要不要使用中断呢?

; t3 t. ^: m/ U7 k! ~我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56: w6 ~  n. S. \
谢谢

  K- d! N, O* l8 k& m多谢版主支持
Tcreat 回答时间:2015-1-13 09:40:48
不错学习学习 支持
kevin0129 回答时间:2015-1-13 09:51:56
楼主这注释写的很详细啊,很适合新手入门!
xuwu_19911119 回答时间:2015-1-13 10:04:14
今天晚上试试看,昨天晚上没有搞定呀。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版