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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
3 {( ~( W% s+ k, i" ~
& |. i, {. X5 L. b/ _, j& a8 z0 I' b
  1. /**" K- ?1 O  {% K' I
  2.   * @brief  配置ADC1的工作模式( f8 `7 R8 l* ]' l* ~
  3.   * @param  无
    ! o6 r, H: s2 Q6 E7 Y  A( Q
  4.   * @retval 无
    ) V' w) l8 u1 Z8 E2 ^
  5.   */
    : a: G5 U; ~7 c3 }* B5 A' b' R
  6. static void ADC1_Mode_Init(void)
    $ t9 L" y; L: k1 O
  7. {# S& R# }- i7 r, w
  8.         ADC_InitTypeDef     ADC_InitStructure;
    $ }- i( b. q/ I6 k
  9. 1 K' f, S" d6 y9 s/ Q! I
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
    + E" Z, v1 }# O
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
    / w% y# Y) q( d
  12. 3 [5 ^3 ^% j; S8 Q- ]
  13.         /* ADC1 Periph clock enable */
    " C6 G0 A$ \' A( F5 E  A
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);( g) a6 V1 L4 }6 y& n$ Z2 G
  15. : k4 y+ z4 L6 p* M1 ?
  16.         /* ADC1 DeInit */  4 ~, ~7 ~0 S; K; ~  W
  17.         ADC_DeInit(ADC1);
    % Q6 N; |8 H! r( m: E  P7 x
  18.         + ^5 |# ^; Y; ?" l" Q% x- ?# @
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/
    2 s5 ?( o$ `3 h' D: C
  20.         ADC_StructInit(&ADC_InitStructure);                        
    4 v% `6 H) G8 \6 V  M4 C9 x

  21. 2 Y' j2 q1 c3 U: A7 E
  22.         /*配置ADC分辨率为12位*/
    ' d1 h9 {5 \9 l+ Z
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ! a& p% |' ~% ^

  24. ( T# f# d! Z8 K8 t
  25.         /*开启连续转换*/
    4 B9 K1 S. V3 s% Y
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 0 Q# r9 c! A- M" o, G; r7 h: e
  27. & f- S" Q2 F& r6 E0 h
  28.         /*禁止触发检测,使用软件触发*/" O, Y$ e4 v7 k  h* Q: H! `
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    3 Q" j3 n( i) _2 A# Z) ?

  30. ) {) [6 h- ~; ?! h+ O% J  e
  31.         /*ADC采集数据右对齐*/: ]$ l; g( m2 e7 K0 ?. h
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    1 l' S: g8 a0 ~* d2 x) C* B8 v% G6 ]

  33. + Y$ Z% K  O+ E2 G. j$ U! T' Q
  34.         /*向上扫描*/
    : l- _" n# p9 D' U
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    . I! r( z" r. b8 D  r' `

  36. , N' r! w8 Q; y; d! Y
  37.         /*ADC初始化*/. s) ~; N0 C$ H' q4 ?
  38.         ADC_Init(ADC1, &ADC_InitStructure); * C) t+ k  D) x& a1 p  Z, q
  39.                               
    3 ^7 W) g+ P: _8 z' o! u# a
  40.         /*配置采样通道及时间*/
    9 m! P, J4 N- D3 H3 S9 g/ l
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); . ]) n2 @/ J, {  _
  42. + h; p. R! u2 T6 K% a* U1 p! M9 n
  43.         /* ADC 校准 */
    4 O$ R6 |  \' q/ U; c9 c2 F
  44.         ADC_GetCalibrationFactor(ADC1);! y; S" U* @5 M" s

  45. % ]7 k6 J7 i, Q* X2 ]/ s, R
  46.         /* 循环模式下的 ADC DMA 请求 */
    6 |$ g1 i  I% M! ^' [
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);3 J/ Y! y2 G4 a, I" [

  48. + j' M7 ~, Z* w, _; w
  49.         /* 使能 ADC_DMA */5 n. @# P! B  V; Y. w
  50.         ADC_DMACmd(ADC1, ENABLE);  - j5 o7 F9 k5 ^# D+ K6 s
  51. 0 q6 |0 G# j0 [* Z! g3 ]/ r+ }7 T- }
  52.         /* 使能 ADC1 */9 H- m* h: B; N* u) A
  53.         ADC_Cmd(ADC1, ENABLE);     / a5 c/ M3 p' t0 N

  54. # L$ @. O1 ]5 Z6 f% e
  55.         /* 等待 ADCEN 标志 */8 j' B# }4 }+ s6 J! S' t8 U9 M  K
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    : \0 A9 e3 }! T3 v6 ]1 }, `% [' a

  57. 4 h4 [% Z; B1 c% O. m) d. n0 P$ g3 ?
  58.         /*  ADC1 常规软件启动转换 */  8 }8 t, G/ z* d6 q2 Q) X+ r
  59.         ADC_StartOfConversion(ADC1);  l% ^, R/ j7 ]4 J
  60.         1 e0 w- `8 T3 f
  61. }
复制代码
" L' U+ u2 E; y, e
3 R4 h% ^$ W+ A( l

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
/**) b! h( P# h' G4 f* U- h" Y
  * @brief  Configures the ADC clock (ADCCLK).! l. c, \9 k7 ^/ D
  * @note   This function is obsolete.
1 B  x$ W! Z! G1 n/ g1 ^8 ~$ n  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
' |2 E! u6 u; h  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
% P. ~  u4 D; ^  *         from the HSI14 or APB clock (PCLK).* F+ g. b) p4 R# o6 \7 G- s
  *          This parameter can be one of the following values:1 Y$ K1 d$ u8 L
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
- `: |" u; x& g; x  N9 J  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
6 u; w9 _1 F% ~7 @1 e  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
7 ^9 g4 k  e3 Z2 S- S  * @retval None
; c; u# t( f4 |2 W+ a  */
. W, L0 J4 S/ L/ i/ G& ~5 L! bvoid RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
/ {9 G0 |2 ]3 K此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

; g  Z, v% P: [( S$ _/ H) lvoid ADC1_Mode_Init(void), I( C# V$ p6 k; i6 [
{: M8 N0 F& s2 L
    ADC_InitTypeDef     ADC_InitStructure;
" t/ A9 S. b7 U( H; e) R1 V- Y0 H& |9 D) E/ I
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
: y; K- W# H( }3 Z    RCC_ADCCLKConfig(RCC_HCLK_Div4);
/ }& f  x) m. n3 V    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);# [* I% D6 e5 t4 `) v% J
" p3 A( T" F2 Y" E; t9 H

' S. Z. @0 ~6 @  q: q. J源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
3 \2 H% s; A5 V3 m) J9 U1 ?" U2 K0 r
另采集数据全0,还没看那里的问题..
5 Q7 @; w' ?6 f9 H' y5 J" N& k3 \/ M+ P* c2 D, r
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42& ]7 {1 e8 J* a9 w7 ^4 U
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
( e5 v( X( U, p; Q8 ~; m
滤波显然会影响速度的吧?# Y( F9 S( p+ [5 z8 G
滤波之后还能有多少bit?
( H& m5 a/ q3 J7 W% w7 J+ I你现在是内基准还是外基准?
) G: h/ \( ~% ~4 V% J( \6 b内部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
; A, X3 {" W! j5 [( O谢谢分享
# Q4 W# U; K6 Y5 f
能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01% T$ U  F# [6 }; u; k+ p
多谢 分享

$ U" t+ a6 i' D  k' p能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
5 B9 q" i" Y# w/ P
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:552 X$ U9 {' d. P
数据从哪里读取呢?要不要使用中断呢?
5 q! e6 Q6 n% S; E0 P8 o) B
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
3 U9 h6 [$ h5 N: q/ o谢谢
7 T% k4 r" m+ f8 L
多谢版主支持
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 手机版