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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下! E5 L& N( h: j4 H4 i

% D* p; I1 A6 q+ q4 `$ S: o
  1. /**
    0 x& m$ x$ B0 H* Q! Q" h3 ]& [
  2.   * @brief  配置ADC1的工作模式
    - b7 I  J2 Z0 `9 ?
  3.   * @param  无* [- Y  G* n1 g1 V
  4.   * @retval 无
    : w+ n9 M  P0 \& E( s5 G* G5 W
  5.   */
    4 J6 m' {/ [8 n
  6. static void ADC1_Mode_Init(void)
    / }- W- {+ |- }  G9 O
  7. {& P3 Z+ D' ?/ w& V; U  v
  8.         ADC_InitTypeDef     ADC_InitStructure;
    / B) s8 @- S+ z% m) C/ x
  9. & t3 f  k" |0 Y8 f5 [
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
      o9 k3 r# G% G6 X, d! k5 p, R
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        $ G, c, |  M/ d- E! |' f6 e
  12. " n3 t' X8 M0 R9 G2 U
  13.         /* ADC1 Periph clock enable */
    6 R6 f; Q% [, z4 b+ H% X* r4 u1 I
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);) Q! e4 k! P$ e( D
  15. % {4 h6 o, G/ A7 E+ F  O
  16.         /* ADC1 DeInit */  
    ' O2 T) I; C0 x% {
  17.         ADC_DeInit(ADC1);/ Q8 W; j% X7 i6 D6 G9 b0 X, f
  18.         
    7 ^2 K2 u+ [# K& ^$ _
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/5 [' S+ G. n7 q9 O, [
  20.         ADC_StructInit(&ADC_InitStructure);                         / e) D: H3 W3 G3 w$ f! w! {2 o, y
  21. & p9 i1 Y. T! j! n
  22.         /*配置ADC分辨率为12位*/* A0 U, Q! T3 R  e4 S& t- q
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;: f# J: E( N4 x+ k3 R2 n, `% H8 }
  24. 2 V, E- W! C. B# C
  25.         /*开启连续转换*/
    - ^7 w7 S7 g* k9 i: j- Q/ M  p
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ) o6 O6 {3 Z& \* h* V1 ~
  27. " C6 a/ }" w, a: ^, ?9 x- T4 s
  28.         /*禁止触发检测,使用软件触发*/
    ! V! p, Y2 z& X( h& ?
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;; J. V' m4 E, P) G+ x; w1 r
  30. ( D# _* A% x$ B/ d
  31.         /*ADC采集数据右对齐*/
    6 L( _, O. y: T# t1 |' L1 r! [2 x/ g; H
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;9 B7 _1 L& f% G  R# g8 w1 L# r1 N
  33. + ^; A  e5 p/ j# j1 {+ d! e, r
  34.         /*向上扫描*/
    6 F, N; W# L5 f$ D* Y& i1 H/ n2 w1 P. t- U
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    " a- K, |" B6 l3 T2 X! O9 V; i/ a; f
  36. & d" }; R, q1 n  K) `% _9 ~! s
  37.         /*ADC初始化*/
    ; T/ e8 Z% U( c# r, k
  38.         ADC_Init(ADC1, &ADC_InitStructure);
    5 _  I  u; {! o) N
  39.                               1 x, B* i3 }1 \8 y6 |- I
  40.         /*配置采样通道及时间*/  h% w% u6 ?# J9 W* K) H
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
    : G( c4 a5 Y6 }3 j( a% j

  42. ; s1 h2 V7 ^9 w8 b
  43.         /* ADC 校准 */
    ' Q% l" M7 t% [7 V4 h3 t( D, q8 M) `
  44.         ADC_GetCalibrationFactor(ADC1);  y2 L  M7 h- f

  45. . H* L) B! u% s; g0 _
  46.         /* 循环模式下的 ADC DMA 请求 */
    ; ~9 s& o. v, n3 L  ?
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    - y# L& T* Y- i( K, s( P0 C8 X
  48. 0 W8 {' K5 S1 f! |
  49.         /* 使能 ADC_DMA */
    - U# y( `2 ?3 ]  s- Y4 ~# F
  50.         ADC_DMACmd(ADC1, ENABLE);  ) [  _! E/ Q# i/ o. U* W2 ]1 M
  51. 9 w7 R: c0 H8 [$ e
  52.         /* 使能 ADC1 */+ J' L3 ]" e$ \' H5 H
  53.         ADC_Cmd(ADC1, ENABLE);       V9 q* U+ {$ Q- J4 s
  54. 0 a' W; c3 b) F/ G' B5 Q! Q
  55.         /* 等待 ADCEN 标志 */# Z3 h4 |. }$ C. p8 \( x
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
      d" V) S% [* C9 p8 F" A# i2 z3 U
  57. + R( F7 W  t5 f' w, _
  58.         /*  ADC1 常规软件启动转换 */  
    5 C$ Z6 ?; o) d3 \" x/ ~' ~/ b
  59.         ADC_StartOfConversion(ADC1);5 k( d# G4 U6 C3 J' J3 ~, c8 O& l$ y
  60.         
    . a- Q- X- |/ V1 y
  61. }
复制代码

0 x1 O/ L$ ?; c" z" b1 E5 D% v8 i" m4 q. b8 B4 h0 [

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2806

评分

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

查看全部评分

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

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**
2 Y$ t: V& }& P  * @brief  Configures the ADC clock (ADCCLK).
7 Y, M" \( L, Y  J0 M% q: x  * @note   This function is obsolete." _* V4 I8 F* E, S' E* B! E9 R& [
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver+ V6 K0 {! p( s3 `' @# H3 d5 `7 D
  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived
: }: ~4 P3 \  f* x, l  @. S* e3 [  *         from the HSI14 or APB clock (PCLK).% Y. a4 ?/ E& T8 |* q2 _7 I7 Y0 V$ [0 {
  *          This parameter can be one of the following values:0 _( z8 V5 v, {, l  f& R7 A
  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
2 @) w4 T4 M. a. \% l  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
) O) I$ h# c. O4 b) F2 R  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  
: W/ i+ w& _) q, [0 ]8 w  * @retval None
7 @6 d7 k6 I$ T* M( a# h  */9 C1 y2 D! t5 U& I# }1 |8 g
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
- K  f# M- `) ], G. v, {此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

) i$ f+ E5 k1 a/ s( ~' G- Vvoid ADC1_Mode_Init(void)3 [8 U3 b( S  n6 ~" ]2 ^
{
8 [/ f+ m: K# V: c  m* m3 {    ADC_InitTypeDef     ADC_InitStructure;# y2 F! x0 n$ C; @2 a" e
0 k9 p4 s+ d6 Y7 k, b* n* }/ d$ P$ Q8 z
    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/, S2 }- `/ y; Y# `7 h
   RCC_ADCCLKConfig(RCC_HCLK_Div4);4 T% A8 C  q# m8 I! C- O
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
6 W1 C0 @2 e4 M, H2 S
) D( g) k% ], o' Q/ A1 @
- T. k6 L$ \! A: ?. q源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.. W5 a/ O8 _! y8 I$ @
$ g( V, U8 T# X5 @
另采集数据全0,还没看那里的问题..  `  Z# X+ c$ q  i$ g
9 z$ [/ z( [' z. F7 L- w: _
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:425 W0 q" ^" [. ^" B, ]$ M8 [
stm32ADC飘得还是比较严重,不过加了滤波算法后还好
$ d5 z* x6 X# ^" C9 n3 G3 @
滤波显然会影响速度的吧?
: p+ V+ a" d) E滤波之后还能有多少bit?
% l6 _) F4 r0 j6 L6 P你现在是内基准还是外基准?/ g; s1 ]( r+ E1 g0 p) l
内部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: }' f; N/ V9 ~+ S
谢谢分享

  Z+ I/ O' n. ]* H; [  E能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01; o1 C8 \8 Y) w8 h% }+ b/ h( w
多谢 分享

, [( S8 P3 R1 u! }+ H' y9 ^( o能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?* E; g1 \+ G, C, @" K
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:55
, |$ d. b* M, Z* W) N3 i! ~数据从哪里读取呢?要不要使用中断呢?

! H8 U' L' x. y0 K" p) Y我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:560 v8 J, h. y, o2 _& H, W
谢谢

, [/ }% U/ y8 D% u! y& `多谢版主支持
Tcreat 回答时间:2015-1-13 09:40:48
不错学习学习 支持
kevin0129 回答时间:2015-1-13 09:51:56
楼主这注释写的很详细啊,很适合新手入门!
xuwu_19911119 回答时间:2015-1-13 10:04:14
今天晚上试试看,昨天晚上没有搞定呀。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版