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

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

[复制链接]
dajin123 发布时间:2015-1-8 09:33
附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下) ^' o" a  u( g

2 _+ n! N7 `. y% z( `
  1. /**
    / V( k' C! K; G' \
  2.   * @brief  配置ADC1的工作模式
    # ~* ]) j  N* H
  3.   * @param  无% _6 H- n. z# e2 G  a- F3 ]3 G+ w
  4.   * @retval 无
    ) y! Z# ?: t- O7 k" g
  5.   */
    0 s* k* s" D0 {- \8 ^: p+ C7 S7 M
  6. static void ADC1_Mode_Init(void)
    ( O# R+ p1 n9 v' J
  7. {; [; d+ r2 ]" \3 ~2 b
  8.         ADC_InitTypeDef     ADC_InitStructure;
      M( A" p3 g: q4 @- n

  9. % `; }2 E- J& ^
  10.         /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/! l% ~3 x4 ?- N. R2 N# e9 d
  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        2 s1 z5 l  A6 s% d3 `6 w

  12. - G4 P/ x: v- @4 b' d
  13.         /* ADC1 Periph clock enable */
    9 e4 w1 B* X: e' L* ^$ j
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);0 V2 p1 \# ?" [# e
  15. ; p  O" P4 r, x/ p  A
  16.         /* ADC1 DeInit */  % }- I2 m, Q, r9 ?; V8 D- _
  17.         ADC_DeInit(ADC1);/ c! o- ?, y2 `2 \. f7 ~, \
  18.         
    * z( S) F3 P' p0 H' j: T* ^) V
  19.         /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/) I9 Y$ f" X% t9 A
  20.         ADC_StructInit(&ADC_InitStructure);                        
    ; d' O" s; \1 V( |0 M. @9 y/ |5 R

  21. 0 i4 j* c. U7 t
  22.         /*配置ADC分辨率为12位*/
    ) G6 W0 C6 `) Y1 O8 N
  23.         ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;% s' y) o( l& f

  24. 2 d' k9 t3 k/ Z# V) n1 m
  25.         /*开启连续转换*/, I9 x2 o, U. B# z/ U+ n
  26.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    5 R5 g  U% h. ^  o% X% {# S

  27. 0 `7 ^( e4 ~* r! W: X, w1 i
  28.         /*禁止触发检测,使用软件触发*/7 U% c0 j) l- m5 X* _
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;* b0 ]& `) X! T% K# }9 V% m! i2 s
  30. ) r" m6 O! U. o: R- K& {* r/ [" G
  31.         /*ADC采集数据右对齐*/4 ~3 {- F: m0 P2 k
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;% p7 F: N5 C* f9 Z2 z5 q
  33. % C' i) I2 ?8 Q0 t% Y; M4 p
  34.         /*向上扫描*/
    4 }# @0 m0 Q  f4 k! d5 d
  35.         ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;. Q* U& u. S& w' A
  36. 0 G+ ^5 k9 m0 _( _' ~* d
  37.         /*ADC初始化*/: a  v1 }7 m5 u4 U" B) E
  38.         ADC_Init(ADC1, &ADC_InitStructure); 3 D" e- D- N& Z
  39.                               
    & `! b6 K& f' L
  40.         /*配置采样通道及时间*/+ f( Y8 h5 F$ r2 Q1 p5 {" E
  41.         ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);   y% Q; Z: J5 b" \! X2 W2 o1 Y

  42. 0 ~0 A' l) r, @! j+ o# F) K) X8 l7 k6 ]
  43.         /* ADC 校准 */" A. J* B7 B6 e
  44.         ADC_GetCalibrationFactor(ADC1);0 ]; E' N& Y1 t

  45. - ~3 t' Q3 k& V0 C% {+ k" K/ J$ ^
  46.         /* 循环模式下的 ADC DMA 请求 */
    8 q* O/ d9 W: |* z' P7 |
  47.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    ! C$ I: p+ K# y5 Z( p' U7 v9 }+ c! h8 p

  48.   c) [5 f$ m0 F: `3 k& b" o7 A' K- D5 c
  49.         /* 使能 ADC_DMA */
    : X0 Z, I! s" V# h0 t$ y
  50.         ADC_DMACmd(ADC1, ENABLE);  
    / R+ N& u) l4 ^3 r
  51. " m* m7 i- N& o6 v/ F/ O
  52.         /* 使能 ADC1 */
    ; C  y6 t+ e; @" X; C
  53.         ADC_Cmd(ADC1, ENABLE);     8 I$ {4 I0 k( T- }7 r* {3 Z

  54. : l' A, l) n/ a) ]" H3 P' A
  55.         /* 等待 ADCEN 标志 */5 _' H6 `; h+ U  h
  56.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
    & B7 u( L+ X; Y& f6 v! L$ e3 |

  57. 8 k9 z# a) `& x& z! n" t" l: g
  58.         /*  ADC1 常规软件启动转换 */  
    0 T7 F9 d+ c$ j
  59.         ADC_StartOfConversion(ADC1);- U+ g; S9 H! V& t( B% a1 b) u
  60.         0 A3 k8 ~* K2 v8 F5 g6 B  ]/ m
  61. }
复制代码
. J4 O" p- q+ b/ g2 Z

) d- D+ f/ e* m# n; `( c, T

STM32F0_Template.rar

下载

313.36 KB, 下载次数: 2782

评分

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

查看全部评分

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

举报

95个回答
善之水 回答时间:2018-2-25 17:08:31
/**9 h% K, c7 \$ }9 s3 [
  * @brief  Configures the ADC clock (ADCCLK).. k, ]3 |4 ?9 F
  * @note   This function is obsolete./ ^5 \8 H# _; _! B/ z
  *         For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
4 n+ L0 d/ a9 q. n  * @param  RCC_ADCCLK: defines the ADC clock source. This clock is derived 0 _* c- _3 @, c" P
  *         from the HSI14 or APB clock (PCLK).
# G% V6 ]5 \9 f/ x5 h  *          This parameter can be one of the following values:
5 S1 n2 d$ e) i$ f, ]2 z. O9 G  *             @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
* Q& Y) m3 d% N) v  *             @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
0 {) }6 Y: |2 T' k* _  *             @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4  8 R4 J( `  Q' n) R. N
  * @retval None2 r8 {. r# u. N* P" _% A6 Q
  */" w( B2 p/ h; ?  ?+ }
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK). `% D% n/ F6 K' I* t0 ^( ]* `# t
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
q80351951 回答时间:2016-12-18 01:01:49

7 F$ P$ [! v7 \$ U7 {8 ^void ADC1_Mode_Init(void). R7 s/ r9 [- a) C1 {% O" _; l6 `
{
  O1 }; r- B2 p  ^0 J  V) ]$ ~    ADC_InitTypeDef     ADC_InitStructure;
) }! k8 u9 J" m9 a
  ~+ u+ C' {( _5 ~    /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
6 u$ b, d7 z: Y    RCC_ADCCLKConfig(RCC_HCLK_Div4);5 G2 t4 z9 d: \1 g" Q$ D
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);$ y- i8 v, R& D1 p% ~0 e& l

. h8 V* F" d/ y6 A% a  K
* {; X, K8 |, z+ s5 Z源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
* ^) G/ ?" j( ^' D, k6 n5 \
$ i: Q" l/ j* N3 A; s! M另采集数据全0,还没看那里的问题..
0 f5 [5 y! @7 G* ^' g6 L
; f3 D3 r8 W% G6 k# G
zhang_123-55168 回答时间:2015-1-13 11:45:55
dajin123 发表于 2015-1-13 11:42
( E0 o. m) S+ S$ rstm32ADC飘得还是比较严重,不过加了滤波算法后还好
5 D$ f* |! p2 [+ G5 j+ K
滤波显然会影响速度的吧?
8 T: E/ k" R, y. n, C+ \, }) c滤波之后还能有多少bit?# n. o4 e+ c/ u. Z- ~6 H: c
你现在是内基准还是外基准?, K% Y4 _% j5 H! H) M# T( ?7 ~
内部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% J+ O+ [% ?5 l7 Y  C4 _
谢谢分享
% I3 _! d6 ]( _, k3 d  N' A( y9 G( p/ y
能帮到你就好
dajin123 回答时间:2015-1-9 08:34:58
lovewyufeng 发表于 2015-1-8 13:01/ ]5 ^, r/ ]/ s0 Z4 W" O- L2 R
多谢 分享

4 D  L* k% n& @% B& w能给你提供有用信息就行
我是酱油哥 回答时间:2015-1-9 08:44:53
谢谢分享!
wyxy163@126.com 回答时间:2015-1-13 08:48:57
提示: 作者被禁止或删除 内容自动屏蔽
mantishell 回答时间:2015-1-13 08:55:25
数据从哪里读取呢?要不要使用中断呢?
: J- H, q1 S( s* e) F
沐紫 回答时间:2015-1-13 08:56:03
谢谢
dajin123 回答时间:2015-1-13 08:57:41
mantishell 发表于 2015-1-13 08:556 {% k7 T" m: y( e4 `* e
数据从哪里读取呢?要不要使用中断呢?
: h8 r1 r) J! R( a
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
dajin123 回答时间:2015-1-13 09:05:19
沐紫 发表于 2015-1-13 08:56
: ]; Z- D7 W) \4 h# n( M0 f5 N4 i谢谢

8 W5 X1 W/ b7 m0 l4 y5 {; V多谢版主支持
Tcreat 回答时间:2015-1-13 09:40:48
不错学习学习 支持
kevin0129 回答时间:2015-1-13 09:51:56
楼主这注释写的很详细啊,很适合新手入门!
xuwu_19911119 回答时间:2015-1-13 10:04:14
今天晚上试试看,昨天晚上没有搞定呀。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版