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

【安富莱——DSP教程】第45章 示波器设计—系统框架

[复制链接]
baiyongbin2009 发布时间:2015-5-5 11:45
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接8 @: d; k, z9 ?$ d) K* Q
第45章 示波器设计系统框架

* q! P; h6 R2 _
    本章节主要是对示波器的系统框架做一个简单的介绍,后面会推出示波器的详细设计分析。示波器的的源码注释已经很详细,对框架有个了解之后看源码即可。
    45.1 ucos-iii任务分配
    45.2 示波器核心任务
    45.3 DAC实现方波的输出
    45.4 ADC实现数据的采集
    45.5 总结

1 G# B  u. j+ F7 U% \- J6 G45.1 uCOS-III任务分配
    主要创建了如下6个用户任务:
l AppTaskStart----启动任务
l AppTaskGUIUpdate---界面截图任务
l AppTaskCOM----留待以后升级使用
l AppTaskUserIF---留在以后升级使用
l AppTaskGUI------emWin任务
l AppTaskGUIRefresh---Led闪烁任务
下面主要对启动任务,界面截图任务,emWin任务,Led闪烁任务做一个介绍。
- a# V/ m4 O* z7 ^5 |/ s5 C
45.1.1 AppTaskStart启动任务
    启动任务用于硬件驱动的初始化,系统滴答时钟的初始化以及触摸扫描和按键扫描,代码如下:
  1. /*
    1 Y7 k4 @3 Y3 S; d0 D2 J4 U: ^
  2. *********************************************************************************************************
    - M5 x. |5 ~- [/ j- K3 X( ~/ P
  3. *        函 数 名: AppTaskStart
    ! }2 X+ y3 u8 S, u! u
  4. *        功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器(在BSP_Init中实现)! y; H3 w& P8 w: e( e) y
  5. *        形    参: p_arg 是在创建该任务时传递的形参5 A- R9 L- e4 l8 }9 z- e* I6 R
  6. *        返 回 值: 无
    : o4 W+ ?( i5 s6 v5 y
  7. 优 先 级: 2
    ! ]3 x2 R9 H( V9 i. M  O
  8. *********************************************************************************************************) V# ]- h8 j5 A
  9. */, g; o( v' L" z, Y" U
  10. static  void  AppTaskStart (void *p_arg)  f. t4 R, P0 C( b) a$ d9 U3 s
  11. {+ W' ~9 Q# c' \" m) z) G( ?0 o/ y: n
  12. OS_ERR   err;
    1 @! a* N$ ~1 V+ q/ p6 u
  13. uint8_t  ucCount = 0;. J6 p& a6 O& D' Q
  14. (void)p_arg;) k8 ]% d0 N$ k6 Y$ u/ Q
  15.          bsp_Init();
    # N2 a8 k. j& @- P& ]
  16.     CPU_Init();7 ]. W! q& A8 v& e) k* G
  17. BSP_Tick_Init();                        
    + M) f& O2 p$ b' J: C
  18. 4 p, B3 x$ P' Z% |  ]: j# ~
  19. #if OS_CFG_STAT_TASK_EN > 0u
    ' @! s( C& {# i
  20.      OSStatTaskCPUUsageInit(&err);   + i1 d  t3 H$ S5 |; Z# j* `
  21. #endif
    8 g; @' Z/ N) k( T# O! J. u/ w

  22. ( V- O% U" Y4 \+ h0 r7 C- U$ V
  23. #ifdef CPU_CFG_INT_DIS_MEAS_EN
    ; j2 u/ ]4 L$ u
  24.     CPU_IntDisMeasMaxCurReset();
    " b% B  {5 h+ n# L2 x/ ~8 r- @
  25. #endif
    ; p' N  D5 a% y
  26. $ V4 F0 l( p, ^2 L( C/ u9 a
  27.     AppObjCreate();                                            7 P- Q7 q# ^& {; P% f; n
  28.     AppTaskCreate();                                           : E( `& Q% S! f9 j; [
  29.     while (1)
    4 f' [# |8 a) X" b; h; c
  30. {                                         1 J: k5 e& A: h0 B
  31. /* 1ms一次触摸扫描 */
      k4 ~# U; h0 x& p: ?2 @
  32. TOUCH_Scan();; K# k  }+ T! L
  33. /* 5ms一次按键检测 */2 Q* z: ^9 p" z' w
  34. ucCount++;
    ! @& T6 z5 r) v4 b
  35. if(ucCount == 5)
    * r6 X% P- X5 v. b+ N7 p
  36. {& O+ v$ j* }  d( _* M) F1 @
  37. ucCount = 0;
    & L6 B% \; k2 u8 N
  38. bsp_KeyScan();% B' f' B: Z' y8 u
  39. }
    2 m( ?* h/ p! ?* f; X" g9 p
  40. BSP_OS_TimeDlyMs(1);- R' F6 j( i" X" l% l$ h
  41.     }+ C3 F! t' J8 l* |" k" F" A( S5 S% c6 t) a+ {
  42. }
复制代码

2 t, x- b0 Q+ `. u1 q& T8 L) k
45.1.2 AppTaskGUIUpdate—界面截图任务
    界面截图任务主要用于界面的截图并将图片以BMP格式保存到SD卡中。
  1. /*
    ' d/ v0 a0 S( W8 N2 F
  2. *********************************************************************************************************
    7 v6 b2 O. l$ `0 g; @7 I, Z
  3. *        函 数 名: AppTaskGUIUpdate
    * }# W: P9 y5 e6 S6 |% G/ a
  4. *        功能说明: 此任务主要实现截图功能.
    1 s' z0 m* Z0 F
  5. *        形    参: p_arg 是在创建该任务时传递的形参
    ; W$ B; x- T9 g" g* I
  6. *        返 回 值: 无
    ! N; i% g, y! `- g
  7. 优 先 级: 33 m$ `  z) K  t7 g: _( [
  8. *********************************************************************************************************
    8 f) k1 t8 V1 b: C0 F& g( B
  9. */9 |! r3 p) l; x& o
  10. static void AppTaskGUIUpdate(void *p_arg)& @5 ]! c. E: k& J* r8 M
  11. {; g" h, |$ x' ^# s1 U) }% U
  12. OS_ERR      err;
    - Z7 A; ?/ @/ m/ }% j! y
  13. uint8_t         Pic_Name = 0;
    - V  `" c3 n: m" I2 q9 ~
  14. char buf[20];
    0 r( E1 f  [/ m( Q1 J( D
  15. CPU_BOOLEAN SemFlag;
    0 k2 p; z1 o& E

  16. ) a5 A$ ]4 u# z9 j. \
  17. (void)p_arg;
    # _0 t- O$ V. P% E, m
  18.   
    * F, S  Y/ A# {$ B# a5 f; h
  19. while(1)
    6 P$ ~' `2 G. N. A$ Y5 y& T, w5 l
  20. {$ f4 n9 ~2 a5 d2 y& v$ g
  21. SemFlag = BSP_OS_SemWait(&SEM_SYNCH, 0);
    ' _$ Z& i/ E8 @+ ^* D* X
  22. if(SemFlag == DEF_OK)6 g- ~# Q/ ?( w4 \* E  W" }
  23. {
    7 b; p' v; X$ p* }8 @2 c
  24. sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);
    . l% x( k9 y3 b- |* E! Y# B3 w
  25. OSSchedLock(&err);+ h; r% W2 x$ p7 `% R; c% }
  26. /* 如果SD卡中没有PicSave文件,会进行创建 */, i$ k& t2 `. m! ^: d
  27. result = f_mkdir("0:/PicSave");( g( ?5 Y; d5 c  E- y
  28. /* 创建截图 */  l1 q/ V& Q- Q& W
  29. result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);. J) X$ R% V" P5 ^( c0 Y
  30. /* 向SD卡绘制BMP图片 */7 E8 m8 y0 u( g  [6 u. ~
  31. GUI_BMP_Serialize(_WriteByte2File, &file);
    # V: a/ r. |6 M1 G9 i. e
  32. /* 创建完成后关闭file */) v! f' o, k; d. P7 a. n) ?0 l5 o: @
  33.     result = f_close(&file);
    3 i1 D3 _) M7 \% g* G4 |  G
  34. OSSchedUnlock(&err);
    / c0 g9 V4 p1 w
  35. Pic_Name++;
    # f6 }7 }8 \, B! ?6 \# H
  36. }                                              0 t  D) v7 M* A5 G" |5 I. U
  37. }   9 K, i1 [( ?! R' H
  38. }
复制代码
( c! _) v# n4 z4 e
45.1.3 AppTaskGUI—GUI任务
    这个任务是示波器设计中最重要的任务,代码如下:
  1. /*( \9 y5 A  E: S/ t
  2. *********************************************************************************************************) u' O$ ?4 m; _" N# l" j" B
  3. *        函 数 名: AppTaskGUI
    / V6 j% g/ b5 H/ d* Q2 I/ ~
  4. *        功能说明: GUI任务                      : S: i. w; B& r& m9 U/ m  g8 [$ ]
  5. *        形    参:p_arg 是在创建该任务时传递的形参
    4 [: R$ m' ^4 `1 f6 @
  6. *        返 回 值: 无/ T# R" g) t) h# @' A% @
  7. *   优 先 级:OS_CFG_PRIO_MAX - 4u
    # y9 Y8 I3 k/ L
  8. *********************************************************************************************************5 B( {; C0 f8 R
  9. */$ g/ ^# b3 L- ]6 q) M) K( R
  10. static void AppTaskGUI(void *p_arg)5 G: R7 s% {; T. q
  11. {( z% Z) G8 l7 c0 T) I( `" k- U6 Z
  12.     (void)p_arg;         /* 避免编译器告警 */3 j$ T$ X! h" W# @  |
  13. while (1)   i- c" j. m6 V% [# u6 c2 O
  14. {1 d4 ?; r* C% B, x
  15. MainTask();          ; I0 j2 v; N+ Q/ O" j$ n: a) o/ W
  16. }
    4 b/ v! d+ ]8 y& f6 q
  17. }
复制代码

8 E! K! i' W2 F# x
45.1.4 AppTaskGUIRefresh—Led闪烁任务
    这个任务主要通过LED的闪烁来指示系统的运行,代码如下:
  1. /** Q( _3 K+ F# E  w. n5 E
  2. *********************************************************************************************************! H# P# w" I+ y! k, u- k( N
  3. *        函 数 名: AppTaskGUIRefresh
    # d* `8 s' L3 R0 L6 U3 @
  4. *        功能说明: Led闪烁任务,表示系统运行                     8 v4 e' ?& j: D0 p% m7 T( f* X
  5. *        形    参: p_arg 是在创建该任务时传递的形参! c' Y& f. r0 N* _+ _( ^6 w$ H
  6. *        返 回 值: 无
    ) T, }* Q7 e$ {& V0 }' W' r
  7. *   优 先 级: OS_CFG_PRIO_MAX - 5u
    3 r$ r1 q3 X+ B; ~0 z# P
  8. *********************************************************************************************************
    6 B, r4 c8 \; I! c. T
  9. */
    ) f6 S% d2 o- @
  10. static void AppTaskGUIRefresh(void *p_arg)
    " g+ Y3 J" ?2 w$ o. m
  11. {) U. d" C8 D% M7 _! L( ^
  12. (void)p_arg;         /* 避免编译器告警 */7 T: E: s0 q- V- E3 g$ r, B5 b/ y* }
  13.   ( e: P) Q0 X1 q* r) y* o
  14. while (1) 7 Y3 U; D* T! t+ l" m
  15. {' C( \4 i2 J5 L
  16.         BSP_OS_TimeDlyMs(200);
    " A' h6 V+ \# `) E
  17. bsp_LedToggle(2);
    " _+ o- g3 s- ~7 l
  18.     }          3 E2 C) y6 D& O8 c! n
  19. }
复制代码
' i0 s7 o# f% P3 |- s- q: L; {
45.1.5 其余任务
    剩下的两个任务留着以后升级使用。
  1. /*
    1 e5 S3 q+ M8 t& \3 H
  2. *********************************************************************************************************
    3 _8 V! E- Z8 u
  3. *        函 数 名: AppTaskCom
    & f- s" j, ~# |: M2 s5 t, ]- |8 \
  4. *        功能说明: 留待以后使用, C" i7 w6 A: A/ b/ N
  5. *        形    参:p_arg 是在创建该任务时传递的形参, x) d5 Y1 j4 Z3 }
  6. *        返 回 值: 无
    + C9 f; o  [# P6 J/ E/ n* l+ M
  7. 优 先 级:3
    + {2 b( z4 G  A, B# P3 [
  8. *********************************************************************************************************$ J6 I7 ?3 E0 l9 p* _9 {
  9. */6 u0 H8 J3 X/ N. P( s
  10. static void AppTaskCOM(void *p_arg)
    . f, y* J' T9 {! {& \3 E/ T( K
  11. {2 T6 e& S2 g) D- |
  12.    (void)p_arg;; `5 b0 Y& |/ k
  13. 3 ?2 k( W5 b: z
  14. while(1)6 v7 `- [+ v/ C. x3 V- o
  15. {  W/ |! Y! H9 U& r
  16. /* 100s执行一次 */7 Z/ j! g- U. f9 c! ]  Q
  17. BSP_OS_TimeDlyMs(1000000);
    / I. J. ?) J! P' v4 C$ @" B. O4 p" j
  18. }                                                         
    ( V$ S# H$ D3 ?' v5 O+ `6 c1 m
  19. }
    0 Q! l" Z- |$ \9 F( T3 V- m+ T2 T
  20. 3 k9 A' ?6 `' j6 d4 |6 l
  21. /*5 B+ Q- ]2 l$ `
  22. *********************************************************************************************************
    $ ?  d% w" \1 \4 Q. ?* [
  23. *        函 数 名: AppTaskUserIF5 h$ j' b7 j# R7 a8 |
  24. *        功能说明: 留待以后使用。+ c! U  t0 I) I9 u0 p; t
  25. *        形    参: p_arg 是在创建该任务时传递的形参
    " P( }9 r  m+ B/ f
  26. *        返 回 值: 无+ E" T$ `- `& [: t& R: L; h' t
  27. 优 先 级: 2
    $ c& c; D8 j3 f/ }9 V9 v' O% S# o
  28. *********************************************************************************************************: a4 L* W9 y' n3 E* ]
  29. */
    7 x$ [  L1 m/ g
  30. static void AppTaskUserIF(void *p_arg)
    ; T; Z4 f6 x" O7 R5 Q0 F; k
  31. {
    " H1 \6 A7 W3 @( B0 T& A4 S
  32. (void)p_arg;        /* 避免编译器报警 */! \* H; G. T% k: Q% M

  33. & b1 l9 `& A# v0 i+ y0 {- c# E$ O
  34. while (1)
    ' T5 f/ t, h+ \7 {1 D! _, B) P
  35. {   ( z7 K" k4 C4 O0 C8 v! {* v
  36. /* 100s执行一次 */
    ; X0 O/ R" i/ H  z" w' j; f0 g
  37.         BSP_OS_TimeDlyMs(1000000);            
    & ^7 |5 z. v5 D8 t' Y
  38. }
    + z- X. a; A6 ?8 B& @# O3 V1 Z  I
  39. }
复制代码

1 {$ Y9 O3 {( o1 A% l
收藏 评论12 发布时间:2015-5-5 11:45

举报

12个回答
stary666 回答时间:2015-5-5 13:49:22
沙发,支持原创
wu1169668869 回答时间:2015-5-5 23:43:18
学习一下 5.gif
MrJiu 回答时间:2015-5-6 10:08:10
mark一下.....值得学习..........
拼命三郎 回答时间:2015-5-6 10:58:12
ddddd.png
拼命三郎 回答时间:2015-5-6 10:58:35
xxxx.png
拼命三郎 回答时间:2015-5-6 10:59:16
stm (1).jpg
baiyongbin2009 回答时间:2015-5-6 11:26:32
本帖最后由 baiyongbin2009 于 2015-5-6 11:31 编辑
$ u, C$ N: \& \; o7 P5 V5 ?8 I& g* P  |3 v7 e) z* j
45.2 示波器核心任务
    emWin部分是示波器设计的核心任务,主要包括以下几个文件:
45.1.png
下面把这几个文件及其之间的关系做一个简单的说明。
/ u0 n* {( F6 i4 |
45.2.1 MainTask.c—GUI主任务文件
    这个文件是示波器代码的核心文件,这个文件里面几个函数的关系搞清楚了,示波器的整体设计也就搞清楚了。下面把这个文件里面的几个函数简单的梳理下:
l 函数void MainTask(void)
代码如下:
  1. /*5 @7 o; r$ @! |
  2. *********************************************************************************************************
    ! q  l1 f! A! M' t
  3. *        函 数 名: MainTask2 i8 i" c, m7 ?$ |. }2 O
  4. *        功能说明: GUI主函数8 u5 A; T- Q( q7 O+ L7 ^
  5. *        形    参:无       3 h. G. k0 ~8 c; ]: B% }
  6. *        返 回 值: 无
    * j0 I1 z( }5 j) s
  7. *********************************************************************************************************
    - G/ W( i( g% I3 A
  8. */
    ! Y( p0 u6 d, o( T' I7 z" z
  9. void MainTask(void)
    * u, G- T1 m9 f/ {  }
  10. {
    % m) X- {! ^% z$ C; z
  11. /* 开启所有窗口使用内存设备 */1 y8 M* R, {. x0 l: l! F7 S+ {5 j4 {
  12. WM_SetCreateFlags(WM_CF_MEMDEV);
    + Y+ J7 M9 {9 I4 B3 i! m
  13. GUI_Init();
    / \* F+ a% W- }1 C. |6 C+ b0 [
  14. /* 设置皮肤色 *************************************************************/1 m7 J) x6 I/ G3 X4 d, N0 E8 o
  15. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);9 E: J" r& O& h  Y% r) z1 g0 r
  16. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);3 t7 F# C& g+ N* y
  17. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
    . j* ~7 x; |8 E5 ^4 b; O
  18. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);. p; _. |2 w; `( W2 t1 @; C
  19. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
    9 }0 I' x" g; d. ]( Q% s
  20. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);- {! L9 T2 r: `4 n9 v: q: `9 m
  21. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
    ; B: D/ T- R6 L
  22. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
    7 E$ r  d, m* C3 s% A6 o- y, ?
  23. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
    ! w+ M: W& r% }# u( ^; }
  24. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);: s1 m, d4 m" F+ I5 V/ }1 P' \
  25. MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);5 V: ^9 U1 s0 L/ x
  26. /* - E3 `' y( \) a# d
  27. * 设置桌面窗口的回调函数% A% Z& @# ]# R- x2 A' }; H1 o* Z
  28. */9 n. k5 M# Y% s: d- {( K
  29. WM_SetCallback(WM_HBKWIN, _cbBkWin);
    $ p6 i7 _$ \/ a' ~/ C) D0 |8 @7 }
  30. /* 初始化 DSO */5 }9 c6 t, I  D8 |
  31. DSO_Init(1);; t; z) V* _5 S# `% w8 J
  32. /* 波形显示和处理 */
    $ k- f; V% H2 m: [/ M: j+ E  _* h
  33. DSO_Graph();          # q7 d6 V& S5 Y  j
  34. }
复制代码
这个函数里面最主要的就是DSO_Init(1)函数和DSO_Graph()两个函数。
l 函数DSO_Graph
    这个函数是示波器的主函数,示波器任何函数都是通过这个函数直接或者间接的进行调用。这个函数
主要有两个功能,一个是ADC数据的处理并在TFT上显示出来,另一个是按键消息的处理,详细大家看代码即可,代码注释已经比较详细。
l 函数 _Draw
    这个函数通过函数GUI_MEMDEV_Draw进行调用的,主要是实现绘制波形和波形区的虚线方框。
l 函数 _cbBkWin
    桌面窗口的回调函数,主要是用于示波器界面右侧8个按钮的回调消息处理,用来打开8个按钮所对应的的对话框。

7 W; }, N3 I# J( l
45.2.2 MainTask.h—所有DSO相关文件的头文件
    这个文件是所以DSO相关文件的头文件,方便各个文件进行调用,代码如下:
  1. /*
    3 F: r: [, y% N
  2. *********************************************************************************************************
    9 j$ I# i9 k3 y" ~8 i! l  X* u
  3. *                                          9 R0 D, r5 A7 `8 U
  4. *        模块名称 : GUI各个部分的总头文件2 T" E, o- W2 W+ [! H2 D6 _
  5. *        文件名称 : MainTask.c
    # M, U  G) l5 z5 j4 {% r
  6. *        版    本 : V1.0% j; U6 e" C4 b, x) h! N. o% v1 z$ R7 a
  7. *        说    明 : GUI界面主函数$ @% k! }. k/ U; c1 D. a- U- `! m
  8. *        修改记录 :$ a! @! L, j# K* S6 F  A
  9. *         版本号    日期          作者        说明
    1 ~* A" y1 x+ \+ p
  10. *         v1.0    2015-01-05    Eric2013      首发, l9 ?9 H' ?" }9 Y9 c  v
  11. *
    ! f  `( P1 Z9 P$ k: ^' A6 z
  12. *        Copyright (C), 2015-2016, 安富莱电子 www.armfly.com0 [3 n2 E/ F+ ?! M; y0 ?
  13. *- C0 f2 p* _4 f
  14. *********************************************************************************************************" ~; n4 a. A! D
  15. */
    & F4 T: M9 {% W. F
  16. . `6 J# H  D& i" |3 \* U/ c
  17. #ifndef __MainTask_H
    / B, _) y+ r& S2 Z
  18. #define __MainTask_H$ `3 D2 w* c5 E" V5 J, p
  19. % s2 y8 S: Z4 H! Z% \$ [5 |! ~
  20. #include "stdlib.h"8 `2 l8 g( ^, l# K
  21. #include "GUI.h"
    0 o# Z$ c. C% [/ f8 H' @2 K0 L. M8 _
  22. #include "DIALOG.h"
    7 r3 ~" V% v. j7 [5 N
  23. #include "WM.h": W7 |' T3 d2 |
  24. #include "BUTTON.h"
    3 e, U5 E3 L0 T, a. e9 K* G% G: E& L
  25. #include "CHECKBOX.h"
    " m2 y3 ]; m9 x  A$ S9 S* ?" H. n
  26. #include "DROPDOWN.h"; U" g. T! `  ~; }& n8 P
  27. #include "EDIT.h": N7 I5 h" C% D2 a
  28. #include "FRAMEWIN.h"  E$ v9 v; L* [. X5 S0 q
  29. #include "LISTBOX.h"$ B: d1 Q% a* }$ }3 x3 z- p
  30. #include "MULTIEDIT.h"( r( d! l! T8 O* Q
  31. #include "RADIO.h"
    7 f* h5 w. E, ?/ [; M. A& o8 S, S
  32. #include "SLIDER.h"" {( T4 g* `6 B( e0 Q( T
  33. #include "TEXT.h"7 s- A6 n3 W, |1 a+ U
  34. #include "PROGBAR.h"
    2 }# k+ s1 ~% M( p6 Z7 g
  35. #include "SCROLLBAR.h"1 W. I2 e1 Z3 y. ~5 r- }
  36. #include "LISTVIEW.h", m% W# Q2 [; l/ q
  37. #include "GRAPH.h"1 s9 c' K- v3 W0 L
  38. #include "MENU.h"+ o) Z& W# H, |  j7 X( J
  39. #include "MULTIPAGE.h"& _3 E( R& F5 C" Z# @
  40. #include "ICONVIEW.h"3 n! r1 P4 h) v
  41. #include "TREEVIEW.h"# _) G# C& _3 A( e1 s) L
  42. #include "MESSAGEBOX.h"+ Q* }) @$ p! A+ j* i

  43. ) m, {% M" i$ `( x$ f
  44. #include "ff.h"6 E5 C: T1 N6 I& @1 z" O
  45. #include "diskio.h"0 ?' e& Z& U$ Y1 e+ f
  46. " {2 M  |. |* {+ K; y
  47. #include "arm_math.h"& q7 H. i& a/ Z! P/ a* g$ t5 Q9 U
  48. #include "arm_const_structs.h"- J, U( L& F6 ]6 s% ~% u
  49. 8 X& T: ?0 u7 W- N  o! c. ]- p# l
  50. /*
    ! V/ p' v6 b( Y
  51. *********************************************************************************************************
    : \9 N, _$ D0 J! S4 J/ i
  52. *                                          宏定义. U! N' `5 O! B% Z
  53. *********************************************************************************************************
    * ?& ^$ c9 J- l7 e7 n
  54. */            8 n' `# c, v% s% x# j
  55. #define LCD_YSIZE 480, {$ e# C+ E' P6 z
  56. #define LCD_XSIZE 630
    " y0 f# f1 \1 `, J# i2 X( x3 x
  57. , `& L* ~! h9 T" @- }* D4 ^
  58. /* 定义波形的显示界面区域 600*400 */
    1 u" O, H5 |/ Z
  59. #define DSOSCREEN_STARTX     40     /* 波形显示的X起始位置 */
    % ?2 @$ O: Q: F% D2 ]* Y# k
  60. #define DSOSCREEN_STARTY     40            /* 波形显示的Y起始位置 */
    ( n# {( b; ~# i  j) ~7 _! F
  61. #define DSOSCREEN_ENDX      639     /* 波形显示的X结束位置 */
    ! i& k  A1 q! Y, L* o
  62. #define DSOSCREEN_ENDY      439     /* 波形显示的Y结束位置 */
    9 N  t4 L- o9 f. s8 }4 m2 F
  63. #define DSOSCREEN_LENGTH    600     /* 波形显示的Y结束位置 */
    0 H, Y; D# D$ f9 w0 ?
  64. ( {4 w2 d9 u2 N' X; W$ g* O$ ?
  65. #define ATT_COUNT                10      /* 定义支持的10种幅值单位 */  
    4 a. B" D0 T$ ]2 |4 s
  66. 0 T. X2 F. \+ k5 A  a6 c
  67. #define TIME_COUNT                21      /* 定义支持的21种采样率 */. Z5 f: C# Y$ f% w5 c# @
  68. / q! K5 I% [# _% {& E  }
  69. #define WM_TextUpDate  WM_USER + 1  /* 自定义一个回调函数的消息,用于界面数据的更新 */7 p2 J) g  S- M% E# o
  70. " B8 d1 o* @- E( X3 G$ t
  71. /*/ T! N8 k2 P  E/ y
  72. *********************************************************************************************************9 |* ~6 Z+ x( H4 g- v
  73. *                                          变量& r: o) L8 A' S
  74. *********************************************************************************************************
      S) b# m" C: q" o8 E- d4 v! J
  75. */' D6 P/ m# X3 Q: j- p  M  `
  76. extern const char *g_AttText[];                  /* 10种幅度单位 */
    # [/ i0 A* T3 A& r, P3 c
  77. extern const char *g_TimeTable[];                /* 采样率,从2Msps到1Ksps 对应的时基 */
    ; q! ^1 Q% ]: R: |
  78. extern const char *g_MeasureTable[];             /* 示波器当前实际支持的测量值 */
    $ @: f3 O/ f, z% ]8 K7 x
  79. extern const uint16_t g_CursorUintTable[][2];    /* 测量游标数据显示格式 */
    ; |6 g9 o% t% \* ~
  80. extern const uint16_t g_AttTable[ATT_COUNT][2];  /* 采样率衰减倍数表 */
    - z2 w+ z) K# [  \# p

  81. . h% X) E3 j6 l, ~6 z
  82. extern GUI_RECT rClient;       /* 用于显示示波器的logo */; h8 L4 t3 r2 @/ ?* b
  83. extern GUI_RECT rRunMode;      /* 用于显示运行状态,运行和暂停 */
    ) Y" }+ s! G2 o
  84. extern GUI_RECT rTrigMode;     /* 用于显示触发模式,自动触发和正常触发 */
    $ B( P. N/ f( l" i; I+ Q" R
  85. extern GUI_RECT rTrigValue;    /* 用于显示自动和正常的触发数组 */
    8 m+ J8 D' e7 F" `: p
  86. extern GUI_RECT rButState;     /* 当前按键需要调节的状态 */, u7 q* G' y$ B
  87. extern GUI_RECT rRefPos;       /* 示波器最左侧波形参考的位置区域 */
    6 i* p: j1 z8 s2 D
  88. extern GUI_RECT rTrigPos;      /* 6KB数据查询  */! M- x/ j7 F9 }3 J% m# `6 A
  89. 1 \/ ?2 D4 b( W/ t" H
  90. extern const GUI_POINT aPointsTrigBrowser[3];  /* 6k数据中,波形显示的起始位置 */
    1 W' b: Z+ n" U  Y9 O5 o
  91. extern const GUI_POINT aPointsTrig[7];         /* 波形显示区右侧边上触发值箭头 */
    + ]- {! R# s5 _4 x, y
  92. extern const GUI_POINT aPoints[5];             /* 波形显示区左侧边上波形显示的参考位置 */
    3 d' R+ F' K: c
  93. 9 B  @( r, U5 x
  94. extern uint8_t  g_ucLineStyle;  /* 默认是实线绘制波形 */
    * d' `3 ?& J0 |  S
  95. extern int8_t  Ch1AmpId;        /* 从g_AttText中选择每个方格表示的幅值 */            - L$ K! _' c3 I( C% p8 s
  96. extern int8_t  TimeBaseId;      /* 选择相应采样率 */
    ) ?" }) {  w  E4 J
  97. 0 a9 M- @+ x; E/ [% C4 w  C7 K: R
  98. extern uint8_t g_ucMeasureFlag[30];  /* 示波器支持的30种测量值标志 */
    0 j7 e( }1 k; u0 Q5 X

  99. * a& L; ~1 Y$ X8 Q% n
  100. /* 存储平均值,峰峰值,频率,最小值和最大值的变量 */
    , x8 I( B) m' }) `9 v3 A) G
  101. extern float32_t   g_WaveMean;
    % Z' B# z5 v  C
  102. extern float32_t   g_WavePkPk;
    7 i1 e! ~2 u3 _/ c
  103. extern float32_t   g_WaveFreq;
    . L6 K6 c, c( x% A. H1 k- B, [+ p
  104. extern float32_t   g_WaveMax;! N2 c4 I! c! D" M2 {
  105. extern float32_t   g_WaveMin;! L% Q7 O( f% {

  106. ) p& N! y5 V$ S: V" M* `
  107. /* 用于水平测量和垂直测量游标,下面是初始化的默认值 *// G2 p' b6 i! N3 }+ L# F, F
  108. extern uint16_t g_usCursorStep;$ ^& \8 O) l% `1 R8 E, ~' U% |
  109. extern int16_t  g_sCursorHA;- l$ z& y3 V1 P+ _4 N$ M4 b- t
  110. extern int16_t  g_sCursorHB;
    - F; h/ z9 K+ W' t! U
  111. extern int16_t  g_sCursorVA;2 F, o: W$ u) H. I( }( \/ h
  112. extern int16_t  g_sCursorVB;
    + }" z6 h+ J: n% W# v
  113. extern float32_t  g_WaveCursorA;. m& H$ q8 [* i1 G2 t% y2 r% x: V
  114. extern float32_t  g_WaveCursorB;
    7 K# O% H0 ^( u  x
  115. ; B3 [" d4 \: R4 R" e0 z
  116. extern uint8_t hWinRunStopFlag;  /* 0:表示运行,1:表示暂停 */
    , i2 z; \+ m# u% Q

  117. , H; Y, ]; [+ Z
  118. extern uint16_t TriggerFlag;     /* 0:用于自动触发,1,2:用于普通触发 */# {+ q: R# P/ t6 T+ P6 Z; T. u

  119. & j# m0 e% l8 `4 D
  120. /* 用于水平测量和垂直测量游标 */
    ( ?0 M4 U8 `) B5 I" p# I
  121. extern uint16_t  g_usTriPos;    + H( C5 `  y5 @0 o9 T
  122. extern uint16_t  g_usTriStep;
    / u- T# Y1 }1 B& ]  i* n2 E. B' n
  123. extern int16_t   g_usCurTriPos;$ o. T) w6 a# m) J5 N) }& D5 u: }, {
  124. extern int16_t   g_usCurTriStep;
    5 O5 h& ]/ k* c$ @& [$ R
  125. extern float32_t g_ufTrigValue;# b) b* a, \5 f! P" q' a# L1 q
  126. extern uint16_t  g_usTrigValue;  & T0 P% u( N. @) q, X+ L0 U
  127. extern uint32_t  g_ulTrigTimeLine;
    , V! K5 e- n$ w* V5 |7 s

  128. & i  }0 G. I- ^8 S+ m  P1 C

  129. / U% u, Q# ?$ H. I
  130. extern uint16_t  g_usRefPos;          /* 左侧的参考位置,默认开机后是中间位置 */8 I. ~' Z! L: n4 b& V, ]8 `8 G
  131. extern uint8_t hWinButStateFlag;      /* 8种按键功能状态 */( m8 d1 d0 Q* j. A/ }" k2 H0 c. {
  132. extern uint16_t g_usWaveBuf[1024*6];  /* 示波器缓存 */2 P$ q- s1 C5 Y0 L$ ?1 P
  133. extern uint16_t g_usWaveBuf1[1024*6];
    + D  V8 e6 ^  J# |) r
  134. / ~2 i2 F& j1 V! T% w
  135. extern uint8_t hWinCoursorFlag;     /* 0:不显示测量窗口,1:显示测量窗口 */& K9 G; K" p3 |
  136. extern uint8_t  g_ucFFTDispFlag;    /* FFT波形显示,0:表示显示,1:表示不显示 */
    0 L. A, J$ d; C  Y) b% S
  137. extern uint8_t  g_ucFirFlter_Step100KHz;   /* 0:表示不执行滤波,1:表示100KHz,2:表示200KHz,,以此类推 */
    6 e" Z) U! s% `7 S1 `
  138. extern uint8_t  g_ucFirFlter_Step10KHz;    /* 0:表示不执行滤波,1:表示10KHz, 2:表示20KHz,,以此类推 */
    " n9 [4 E6 g4 y& s8 c# G9 _. ?
  139. extern uint8_t  g_ucFirFlter_Step1KHz;     /* 0:表示不执行滤波,1:表示1KHz,  2:表示2KHz,,以此类推 */
    + d$ e6 n4 L& {3 b7 i; G: s
  140. extern uint8_t  g_ucWaveRefreshFlag;       /* 0:表示不执行波形区域的刷新,1:表示执行波形区域的刷新 */& s% ]! D$ R( t) x5 m- w
  141. /*% U1 c/ V( `9 Q' o# N
  142. *********************************************************************************************************1 {, c/ y* Y% i1 B. v9 p
  143. *                                          fatfs
    & S7 E; Q- w; g- h9 h
  144. *********************************************************************************************************
      m* v! E1 ]5 d9 ]
  145. */- {6 t! k7 ^* t* |8 F! C
  146. /* 供外部文件调用的fatfs变量 */' @8 }+ {' S6 ], T& [6 Z1 j
  147. extern FRESULT result;) v& a% G* O. [/ J5 l' N
  148. extern FIL file;
    " Y" N' V4 ?* y: Q9 X& @- \0 ?/ K
  149. extern FILINFO finfo;  n% g/ a( H3 z0 G
  150. extern DIR DirInf;! a% M% e7 t' _- @$ U/ ~' [- B
  151. extern UINT bw;% |- d( j' U0 }/ \! ~
  152. extern FATFS fs;$ e! g- r. Y& d2 N; d
  153. extern FATFS fs_nand;3 c$ I' H* g5 b3 b! g
  154. extern FATFS fs_usb;$ H  S7 g" B; K1 F: ?7 J2 w
  155. extern char *_acBuffer2;
    " r) i1 n5 Q% x. ^; a, ]9 [( Z# c
  156. " r/ n8 Q3 m6 |7 w
  157. /* BMP图片生成 */
    3 v. c1 @( X$ \1 ?- Q
  158. extern void _WriteByte2File(U8 Data, void * p);' ?& Z3 s# {( m
  159. & S' x5 }/ A4 w/ Q- p4 B
  160. /* 用于BMP图片的显示 */. h6 }# M& F, ]- i% f1 D3 d9 T& C
  161. uint8_t  _ShowBMP(const char * sFilename);
    0 i; a6 w4 R1 G+ E# a  Q

  162. - Z* B4 q* A  ^) @0 X
  163. /*
    1 L. j( g$ z- X# T$ a3 G/ V$ c
  164. *********************************************************************************************************0 ]3 ?4 I4 I; e" {3 _
  165. *                                          窗口句柄+ T) r8 D& A! o7 P4 f  m
  166. *********************************************************************************************************
    ! Y/ y& n% O. v& ^
  167. */
    1 @+ ]# D6 W+ A1 @
  168. extern WM_HWIN hWinAmp;         /* 用于显示幅度的窗口 */
    # v. s; k! k; V! {; G& w
  169. extern WM_HWIN hWinStatus;      /* 用于显示频率,平均值,峰峰值,最大值等信息 */5 c, t  r6 B9 u5 r( y) s5 y6 s4 |5 q
  170. extern WM_HWIN hWinScale;       /* 用于显示采样率 */- ^! [% L, z; K7 T5 q
  171. 1 N! _& r8 V' ~, e  I
  172. /* 8个按钮句柄 */
    $ e! @) _: U( l+ z
  173. extern BUTTON_Handle hButton0;
    . n5 ^+ [& C. M, {
  174. extern BUTTON_Handle hButton1;6 {0 r0 y. I! }: w& H
  175. extern BUTTON_Handle hButton2;9 v7 K/ [, j  g  T9 F
  176. extern BUTTON_Handle hButton3;! y+ E8 Z# N0 p! N3 Z, K/ h9 {( n. [) v
  177. extern BUTTON_Handle hButton4;
    7 k7 D6 P. m3 ^
  178. extern BUTTON_Handle hButton5;; b8 n1 G  X  p' I
  179. extern BUTTON_Handle hButton6;# L4 F0 u, V4 L, A
  180. extern BUTTON_Handle hButton7;0 s; j# h/ }- v
  181. : a# n, z+ N9 S3 Q
  182. /*
    + c: y# f& R8 N
  183. *********************************************************************************************************
    4 r- r- K9 _: l8 t
  184. *                                          供外部文件调用的函数$ H( N; A- h1 k7 U# ~
  185. *********************************************************************************************************
    0 q+ J( _" F  D/ H; I9 C$ t! O& Q
  186. */, G, V5 M" S5 b: n9 e0 r2 G
  187. /* 创建幅度,时基和状态窗口 */, Z# t, X4 e/ \" S, z
  188. extern WM_HWIN CreateWindowAmplitude(void);
    . t) w) ^; F. ]0 @' y( {8 X
  189. extern WM_HWIN CreateWindowScale(void);6 }( j, R7 g; K
  190. extern WM_HWIN CreateWindowStatus(void);
    + a# s1 Q7 A1 |  b

  191. + T- P7 q9 a0 J/ a( D
  192. /* 示波器界面初始化 */; I8 M# k8 h5 S* O
  193. extern void DSO_Init(uint8_t ucCreateFlag);& h; b! g# @! \; f! E; ]

  194. * l5 g8 P: k$ J8 ?8 F4 g. _% X
  195. /* 按钮创建的对话框 */. K7 _+ b$ p: }8 h
  196. extern WM_HWIN DSO_CreateMeasureDlg(void);- x( n& q8 v4 d+ a# ?7 x8 y
  197. extern WM_HWIN DSO_CreateInspectorDlg(void);
    + q' V9 P# h- \: s, t
  198. extern WM_HWIN DSO_CreateAcquireDlg(void);
    ' H& I6 F* ]6 g5 u2 W! ?1 Z" v3 Z
  199. extern WM_HWIN DSO_CreateTrigerDlg(void);) x7 |8 m# H1 N
  200. extern WM_HWIN DSO_CreateMathDlg(void);
    ; d+ {* c0 E  @# [1 J; W, P
  201. extern WM_HWIN DSO_CreateSettingsDlg(void);5 N# u0 a, {( y/ E
  202. extern WM_HWIN DSO_CreateDacDlg(void);
    0 T6 Y" {6 U9 ~) B" e- X
  203. extern WM_HWIN DSO_CreateReturnDlg(void);
    % D  c8 i! w! z- G" B

  204. ) ?+ u* q+ o5 g
  205. /* 示波器界面绘制 */
    % o4 y$ v& T) ?
  206. extern void DSO_DrawBakFrame(void);1 a& v, ^( m. i8 E. g7 O
  207. extern void DSO_DrawCursorH(void);' h6 j- m* W9 X" a0 V. Q  Z( y. W
  208. extern void DSO_DrawCursorV(void);0 J. N! g) j! j5 K% I' q: S) r5 ]
  209. " H7 J- a1 i3 ?" t- ~7 @
  210. /* Fir 滤波 */& N) _: ]3 Z2 \: Z) l/ p# N/ T
  211. extern void DSO_FirFilter_Step100KHz(void);
    ; F( n3 M1 D! f+ G
  212. extern void DSO_FirFilter_Step10KHz(void);
    2 x  o! V0 k" ^: p/ S5 x% [  a1 @
  213. extern void DSO_FirFilter_Step1KHz(void);
    & B( X; X2 J' ~. K- {
  214. #endif
    7 e  J7 d' C; r; \5 H

  215. 5 Q5 C! Y0 N& s9 n
  216. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码

6 s1 N! Q, ]2 y+ D& t: _$ I/ L
45.2.3 App_SysFunction.c—界面截图
这个文件主要是示波器界面截图。实现截图的主要函数如下:
  1. /*
    : V/ u- p- T# w* Z
  2. *********************************************************************************************************
    0 b$ r) h( L! W
  3. *        函 数 名: _WriteByte2File()
    4 j& i/ j6 n+ ?7 {* d% Q6 T
  4. *        功能说明: 写文件到SD卡或者其他存储介质1 Z  _! d2 K) e/ C
  5. *        形    参:Data 要写的数据, p 指向FIL类型变量      
    4 V* F( `* @7 [
  6. *        返 回 值: 无
    ( s2 g6 a$ t! E% j" B  @2 V; b
  7. *********************************************************************************************************
    + @# z' t6 F3 x6 u- d' S- b5 T% ]
  8. */
    ) o  q- t( m. D8 F! m5 m
  9. void _WriteByte2File(U8 Data, void * p) 7 J/ l8 a/ s. v" o$ H# e7 ~5 }; `( m
  10. {# t! j" u9 n) ~; H0 k
  11. result = f_write (p, &Data, 1, &bw);
    8 {) o1 [$ \  O: L; V9 o) p5 j
  12. }
复制代码
这个函数是被emWin函数GUI_BMP_Serialize所调用。

9 r/ x2 V* l! {4 J# Q

0 S/ Z3 Z- h$ D8 P
baiyongbin2009 回答时间:2015-5-6 11:27:31
45.2.4 DSO_Init.c—初始化
    这个文件里面的函数DSO_Init()主要是实现示波器整个界面的初始化,初始化内容如下:
  1. /*
    & q4 ]% f* n& j* s6 [+ x
  2. *********************************************************************************************************, X& ~  V' d, o$ p$ r2 ?
  3. *        函 数 名: DSO_Init
    1 a9 i! n; i+ }6 V) @3 v. u
  4. *        功能说明: 示波器主界面初始化
    5 h8 J7 c" b  P2 Y
  5. *        形 参:ucCreateFlag 1:表示需要创建按键和窗口等。$ ^$ Z, T0 ?* X1 I: C7 o
  6. * 0:不需要创建。
    4 N& l4 r6 K' e* r
  7. *        返 回 值: 无
    7 f' t. @% Z8 t$ N
  8. *********************************************************************************************************
    % B7 ?/ d) k6 J# A0 L2 ]
  9. */  J1 y% [; \7 n, F. K1 a( `. u+ g
  10. void DSO_Init(uint8_t ucCreateFlag); h& a- T1 n9 q3 \( f
  11. {( n, [% Z$ z& x6 A# T( X8 x' ^
  12. char buf[10];
    ; p: y9 x; ^* }* h. ?
  13. uint32_t ulTrigPos;
    " G3 M" `" l* {  ~: Z  d, c8 {
  14. /* 第1步:刷新背景*********************************************************************/9 c) Z+ E: ]- Q; P: n5 C! I1 [. G
  15. GUI_SetBkColor(0x905040);
    & G. j5 P3 T' n' \
  16. GUI_Clear();
    ! Q" f% `2 F$ a
  17. /* 第2步:显示基本的信息***************************************************************/
    * c* k% \, ?# z' F8 A  @( J9 Q
  18. GUI_SetColor(GUI_WHITE);
    1 b. f+ {+ |( g$ B. ?
  19. GUI_SetFont(&GUI_Font8x16x1x2);* q6 j8 z) t; y: ]
  20. GUI_DispStringInRect("Eric2013", &rClient, GUI_TA_HCENTER | GUI_TA_VCENTER);4 C% {4 U! \: g" i- G
  21. /* 按键K2 :设置波形显示运行或暂停 */
    3 r' T, W, R$ I  b/ w! X
  22. if(hWinRunStopFlag == 0). c. w3 I% r+ s8 ~- i! T' x
  23. {1 ~! l5 }7 @7 Y
  24. GUI_DispStringInRect("Run", &rRunMode, GUI_TA_HCENTER | GUI_TA_VCENTER);& B/ ^" W& r+ h9 V3 G1 N% q! s5 {
  25. }
    4 u; ]+ w0 E4 q* i
  26. else0 ^2 \  \) h7 s+ m
  27. {
    * g' K, z" W. c
  28. GUI_DispStringInRect("Stop", &rRunMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
    4 J6 C5 I! H  e) \
  29. }$ d  s1 c8 `; P) C8 \
  30. /* 按键K3 :设置普通触发方式或自动触发 */
    + ?+ H5 s. Z4 a  l; o5 r( ]# d
  31. if(TriggerFlag == 0)
    $ H9 M9 P3 B& L9 X
  32. {  I: `8 E( V7 `) f
  33. GUI_DispStringInRect("Auto", &rTrigMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
    0 r* j  D: {* ^8 b# m. H6 S
  34. }
    % q( _4 Q; N. Y9 J$ y& K, B
  35. else) l7 s( d( H( R# S- P
  36. {7 c2 X4 V% U3 {4 j/ D
  37. GUI_DispStringInRect("Trig", &rTrigMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
    ! L9 U6 J* q' d) f* c3 A
  38. }
    3 T9 m% j7 ~$ w/ S8 J6 `8 t9 R6 |# D
  39. /* 第3步:显示自动触发的触发电压**********************************************************/; g0 q6 |2 d- j! p6 e
  40. g_ufTrigValue = 240 - g_usTriPos;3 b4 F# C. [  `1 l# [
  41. g_ufTrigValue = g_ufTrigValue * g_AttTable[Ch1AmpId][1] / 50000;' ?% A- S, ]" u6 Y. Y. q
  42. sprintf(buf, "%5.3fV", g_ufTrigValue);
    1 `7 F: o, {0 |% Q6 h
  43. GUI_DispStringInRect(buf, &rTrigValue, GUI_TA_HCENTER | GUI_TA_VCENTER);5 @, `& \- j+ q4 R% N
  44. /* 显示上升沿触发的标志 */' {4 g: T& W. ~2 x% j+ E) y
  45. GUI_DrawHLine(rTrigValue.y1-10, rTrigValue.x0+10, rTrigValue.x0 + 19);# n" C- H2 V, D/ O* O
  46. GUI_DrawLine(rTrigValue.x0 + 19, rTrigValue.y1-10, rTrigValue.x0+30, rTrigValue.y0+8);
    2 |3 {: h5 }  m7 @) H7 i4 o
  47. GUI_DrawHLine(rTrigValue.y0+8, rTrigValue.x0+31, rTrigValue.x0 + 41);& u5 q0 Z: K; t! |& h
  48. /* 第4步:设置摇杆按键的调节状态,并将其显示出来******************************************/* [/ n% [, _! {0 x8 o/ _/ S' b
  49. if(hWinButStateFlag == 0)
    1 t. n. i) k* ]
  50. {
    , ]: {! l8 D9 D# O! A
  51. GUI_DispStringInRect("ChangeSampleFreq", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
    # H- N( N( I2 p/ [/ B
  52. }' y! U' j$ b, Y$ y; _+ g
  53. else if(hWinButStateFlag == 1)
    , z; Q. M# u! K* g$ a: U4 t
  54. {
    , Q" `5 {- P4 H: |* q, _4 d
  55. GUI_DispStringInRect("ChangeAmplitude", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);- C0 ?& h7 T. Y* B) [- L
  56. }
    5 x" e  q, r9 \+ v# _3 }& ~
  57. else if(hWinButStateFlag == 2)
    8 i9 ?0 j* a+ \' _1 M% j
  58. {
    ! q0 D8 w. T. L* s/ Z
  59. GUI_DispStringInRect("ChangeRefPos", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);1 W$ i3 x+ R7 i! t' G' Y
  60. }0 o) r1 c# q& P: O4 z5 Q- l
  61. else if(hWinButStateFlag == 3)- ~% Q4 {4 q) C7 I. c$ y
  62. {0 r# |# U: h' q) q8 ~" P9 I/ b( [
  63. GUI_DispStringInRect("ChangeCursorVA", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
    0 |# _8 }: N- T7 o1 x
  64. }- L) ?& G2 I& H3 V- s
  65. else if(hWinButStateFlag == 4)
    6 I! V- l6 s- T, l* _) s: e. R
  66. {
    ) q- j2 L. o4 k2 R* E. f! V
  67. GUI_DispStringInRect("ChangeCursorVB", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
    3 R4 Z% `3 |* D1 o4 h
  68. }
    5 W( P$ Z/ S4 d8 a$ N0 d5 c+ `( m5 V
  69. else if(hWinButStateFlag == 5)9 b8 [8 v6 ~1 K" o# F& B, |
  70. {& g. F3 c+ u: [) X1 R: s
  71. GUI_DispStringInRect("ChangeCursorHA", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);5 t* U; p& H7 f: \" G6 g$ h
  72. }
    " o) |4 ^* q4 W: T
  73. else if(hWinButStateFlag == 6)' s# g4 [$ U. N5 Q
  74. {; `1 r7 e  B5 z
  75. GUI_DispStringInRect("ChangeCursorHB", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
    & }3 f! r* C) U
  76. }
    * n- ^0 D% U( W1 E+ m7 J4 P: ]
  77. else if(hWinButStateFlag == 7)6 ~9 H5 v! v/ a
  78. {' @5 _1 B% j0 F* J6 }
  79. GUI_DispStringInRect("ChangeTrigger", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
    1 @7 N; G4 Y3 ?! L$ C6 ]
  80. }
    : d7 z, w, i% _
  81. /* 第5步:实现波形的放缩***************************************************************/
    ' m, ~: O- G; @- k( `7 }  m! e6 Q
  82. GUI_SetBkColor(GUI_BLACK);( k% S! J: {1 c) c4 ~
  83. GUI_ClearRect(210, 6, 470, 33);
    9 z) P$ O* n$ M& D
  84. GUI_SetColor(GUI_YELLOW);+ o4 b4 P( m$ p. i' r: m& v
  85. GUI_DrawHLine(20,220, 220+239);
    ' I8 u4 Z: h  x9 H4 I9 L- j2 I
  86. GUI_DrawHLine(21,220, 220+239);( }" N0 L/ i3 Y$ g: g8 k* u
  87. GUI_SetColor(0x0040f0);
    : i- `* G% j  g* y6 h4 E3 s  B6 h3 A
  88. /* 自动触发模式 */) v2 b; t* C- i  i4 y7 |; Y5 l9 j" X
  89. if(TriggerFlag == 0)1 I. p4 b' c- `: d: |7 ?
  90. {5 F# ?( F& j- `. f# E8 e( n
  91. ulTrigPos = (g_usCurTriStep + g_usCurTriPos) * 240;6 H, d. y" X, \
  92. }7 Y0 v' V. J! I% j9 m8 l
  93. /* 普通触发模式 */
      i* i( F- ]8 H
  94. else0 @+ z: O: Y# D- F
  95. {
    ! D) o5 A0 C- v* a, [: g2 D
  96. ulTrigPos = (2772 + g_usCurTriStep)*240;
    1 |: t; ^" H4 ]$ a
  97. }$ B0 P! g! [$ k2 |
  98. /* 根据上面求得数据的触发位置来更新屏上的触发图标位置 */, f2 b3 h/ @& z. f) P" B( t
  99. ulTrigPos = ulTrigPos / 6144;* z, x8 n2 m0 v. z, K1 b
  100. GUI_FillPolygon(&aPointsTrigBrowser[0], GUI_COUNTOF(aPointsTrigBrowser), ulTrigPos+220, 13);' [3 k# U9 J; I2 O6 J& h- N
  101. /* 记录专门的触发位置 */% H- r# C" o4 V& R4 M2 p; N
  102. GUI_SetColor(GUI_RED);
    4 O) _6 y: F5 I: l: b8 T
  103. GUI_DrawPixel(326, 20);5 H) |/ T# l+ f  H4 v
  104. GUI_DrawPixel(326, 21);
    % j) \4 d8 ~2 U
  105. GUI_DrawPixel(327, 20);
    % F5 A) L9 b- a6 w- {' y
  106. GUI_DrawPixel(327, 21);6 B1 o6 {& m, t" x, j
  107. GUI_DrawPixel(328, 20);
      S" ~- Q2 B+ x2 }+ T; p
  108. GUI_DrawPixel(328, 21);
    * T9 `9 d: B7 I3 H7 o
  109. GUI_DrawPixel(329, 20);
    $ w' ~% D! H. _( K% S* U- l
  110. GUI_DrawPixel(329, 21);$ c, t. ^6 A4 l' @
  111. GUI_DrawPixel(330, 20);
    ' F" o0 P* h1 T/ o2 K3 R
  112. GUI_DrawPixel(330, 21);2 b" s  J7 k. q
  113. 1 U3 r# o* w% e4 V
  114. /* 第6步:波形显示区的边框*************************************************************/
    , ]0 _  \& {8 m# P/ L3 C' c9 G
  115. GUI_SetColor(0XEBCD9E);
    , g5 X+ D3 J( X+ f4 T$ H' }
  116. GUI_DrawRect(DSOSCREEN_STARTX - 1, /* Upper left X-position. *// X* D4 D2 o3 D- Q5 P% ]/ {1 {
  117. DSOSCREEN_STARTY - 1, /* Upper left Y-position. */
    % U. q! @. z! [6 x9 X  D
  118. DSOSCREEN_ENDX + 1, /* Lower right X-position. */
    . z$ S. }: u: z9 O
  119. DSOSCREEN_ENDY + 1); /* Lower right Y-position. */
    3 i' l, ^, i- Q8 Q6 P
  120. ; s3 Y8 L( U  I. M" Y# A' ?
  121. GUI_SetColor(0XB37F63);. l/ ?5 D) F; K$ R
  122. GUI_DrawRect(DSOSCREEN_STARTX - 2, /* Upper left X-position. */' Z0 m1 e# n# @0 L( D
  123. DSOSCREEN_STARTY - 2, /* Upper left Y-position. */7 k& x% C  s5 a8 I& X- m
  124. DSOSCREEN_ENDX + 2, /* Lower right X-position. */* h  Z1 A* N) R
  125. DSOSCREEN_ENDY + 2); /* Lower right Y-position. */
    / u; z" S5 a+ Y4 B

  126.   r6 x: H( h# ]# l7 j2 A
  127. /* 根据需要是否需要重新创建按键和窗口 */
    . p+ ?* s' q6 f6 @" ^8 a2 D
  128. if(ucCreateFlag == 1)
    ( G2 Q: y" L9 ?9 r4 R6 k7 L2 D, z
  129. {
    + c: r$ S/ O8 h( f" O8 f. G& w9 |
  130. /* 第7步:创建状态窗口*************************************************************/
    : Z8 Y7 b5 ?4 u" i
  131. hWinAmp = CreateWindowAmplitude();
    0 e+ M5 Z* \2 I* P3 h; X/ d* O6 d
  132. hWinStatus = CreateWindowStatus();' `; T: q, {2 @3 X+ s
  133. hWinScale = CreateWindowScale();% ], J( w- b3 ]  W5 W& a
  134. /*
    6 @' V; f3 W* g$ U2 E
  135. * 创建定时器,其功能是经过指定周期后,向指定窗口发送消息。9 B1 {- [- D/ C
  136. * 该定时器与指定窗口相关联。
    2 e4 V4 [1 z' q6 m0 |
  137. */
    $ W+ i% ?9 C" {8 e7 ?$ v- D
  138. WM_CreateTimer(hWinStatus, /* 接受信息的窗口的句柄 */
    0 @) }- O! J4 L/ {
  139. 0, /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */# W: a  `5 x) Q2 s+ X
  140. 500, /* 周期,此周期过后指定窗口应收到消息*/% b# k1 z. g. T; m/ O: r9 V
  141. 0);         /* 留待将来使用,应为0 */% s1 V$ c, p0 c+ G* c- ?

  142. $ P. Y: q$ y' g
  143. /* 第6步:创建需要的按钮*************************************************************/6 @7 Z! b# n3 k# h. u/ X
  144. hButton0 = BUTTON_Create(670, 40, 100, 45, GUI_ID_BUTTON0, WM_CF_SHOW);" i1 S& {" v+ w1 @' [
  145. BUTTON_SetText(hButton0, "Measure");
    - U% s: ^- ^8 q; D! e  h, R
  146. BUTTON_SetFont(hButton0, &GUI_Font20B_ASCII);
    4 \9 E$ P. M! o6 @1 N3 ~

  147. % V2 U9 D1 \1 U: g, K
  148. hButton1 = BUTTON_Create(670, 90, 100, 45, GUI_ID_BUTTON1, WM_CF_SHOW);
    " o* Z( b! F) i2 Y$ ^# ?& Y  y) g% v
  149. BUTTON_SetText(hButton1, "Inspector");  ^  |1 `5 J. {2 b+ v+ [- q
  150. BUTTON_SetFont(hButton1, &GUI_Font20B_ASCII);
    & }/ f$ E2 j# S8 H* t

  151. ! f+ N) y1 r3 I- N9 d
  152. hButton2 = BUTTON_Create(670, 140, 100, 45, GUI_ID_BUTTON2, WM_CF_SHOW);
    ' j+ |4 z' n$ G5 h. `- q' L% w
  153. BUTTON_SetText(hButton2, "Acquire");
    5 [0 l2 S3 m! H9 @8 Q* L
  154. BUTTON_SetFont(hButton2, &GUI_Font20B_ASCII);
    ! c3 j2 |2 z- ?0 B& Z9 ]
  155. hButton3 = BUTTON_Create(670, 190, 100, 45, GUI_ID_BUTTON3, WM_CF_SHOW);
    ( a5 m6 f( X; t0 G. X* Z9 p: C
  156. BUTTON_SetText(hButton3, "Trigger");
    + F" J0 v2 }+ J6 C# @6 C
  157. BUTTON_SetFont(hButton3, &GUI_Font20B_ASCII);
    ! A6 O! |6 c3 o4 ], q  h; N

  158. ! ], i! I. Z# E) E
  159. hButton4 = BUTTON_Create(670, 240, 100, 45, GUI_ID_BUTTON4, WM_CF_SHOW);) \. n* I6 K3 Q* J8 E
  160. BUTTON_SetText(hButton4, "Math");
    - v' F) F9 Z3 d$ G5 F9 U
  161. BUTTON_SetFont(hButton4, &GUI_Font20B_ASCII);9 A& T" C3 j! o7 M, c
  162. hButton5 = BUTTON_Create(670, 290, 100, 45, GUI_ID_BUTTON5, WM_CF_SHOW);( U2 o+ ~" S1 J# i, `: }
  163. BUTTON_SetText(hButton5, "Settings");
    8 G5 s% N  H# Y5 H3 A3 W3 d; _
  164. BUTTON_SetFont(hButton5, &GUI_Font20B_ASCII);+ Q# ~, m( a: ]1 a1 M. G
  165. - u4 [# c) P: M- v& H) D  ]
  166. hButton6 = BUTTON_Create(670, 340, 100, 45, GUI_ID_BUTTON6, WM_CF_SHOW);- R/ ^: W* D8 ^
  167. BUTTON_SetText(hButton6, "DAC");
    + Z# d6 q" v# j3 l
  168. BUTTON_SetFont(hButton6, &GUI_Font20B_ASCII);
    ' N# z! f; L* L: d
  169. hButton7 = BUTTON_Create(670, 390, 100, 45, GUI_ID_BUTTON7, WM_CF_SHOW);
    ; F* `- M! z3 B: N# ?# b6 N
  170. BUTTON_SetText(hButton7, "Return");
    ' \1 Z5 D+ v1 N: e9 g3 b
  171. BUTTON_SetFont(hButton7, &GUI_Font20B_ASCII);4 B7 v7 T0 Y9 F3 w
  172. }
    # E) I: E, |" c
  173. /* 第8步:显示参考坐标*************************************************************/& p4 h1 W& o/ p/ f* D/ r# n( R
  174. GUI_SetColor(GUI_YELLOW);; {# c/ z+ a; h8 I- ^& H
  175. GUI_FillPolygon(&aPoints[0], GUI_COUNTOF(aPoints), 5, g_usRefPos);
    ( A; V4 ~8 j# j0 d% \2 e$ c0 S
  176. GUI_SetColor(GUI_BLACK);7 Y' f; d: X0 I  K8 j, s. v% L/ @
  177. GUI_SetFont(&GUI_Font24_ASCII);
    0 A# C9 D& s$ w0 L+ X$ O+ H7 H
  178. GUI_SetTextMode(GUI_TEXTMODE_TRANS);! }5 X1 `  o9 `& r0 t
  179. GUI_DispCharAt('1', 10, g_usRefPos - 10);$ i, f0 e$ V/ k* c; M
  180. }
复制代码
$ z2 b) T( t# {2 O; K6 j: \
baiyongbin2009 回答时间:2015-5-6 11:29:31
本帖最后由 baiyongbin2009 于 2015-5-6 11:30 编辑
1 Y9 m  p8 o2 Z# j+ R
. v7 f  Q! z& m) G45.2.5 DSO_MeasureDlg.c—测量对话框
    这个文件主要用创建如下对话框:
45.2.png
  N9 X% A- z- l$ [- V4 }2 J7 g
45.2.6 DSO_InspectorDlg.c—对话框
    这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.3.png

* T) n0 X2 e, ~
45.2.7 DSO_AcquireDlg.c—对话框
    这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.4.png

0 v9 R+ i1 u8 g/ I: Z5 ]) G7 r
45.2.8 DSO_TriggerDlg.c—对话框
    这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.5.png

8 h; m* m! U+ ]" P
45.2.9 DSO_MathDlg.c—Fir低通滤波器设置对话框
    这个文件主要用于Fir低通滤波器的截止频率配置,创建对话框如下:
45.6.png
: b0 {1 ^. q0 @" X8 J2 V
45.2.10 DSO_SettingsDlg.c—设置对话框
    这个文件主要用于设置对话框的创建。
45.7.png

) q6 q* Q7 W+ Y' b5 w  g
45.2.11 DSO_DacDlg.c—对话框
    这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.8.png

+ Y( ?" x8 x8 o4 c4 ?4 O2 b1 p3 l# c
45.2.12 DSO_ReturnDlg.c—对话框
    这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.9.png
6 k! a5 `% j$ W' [
45.2.13 DSO_DrawBakFrame.c—绘制波形区的虚线方格
    这个文件用于创建如下虚线方格(不包括波形显示):
45.10.png

" w7 M3 e6 i7 E$ X9 K) L3 i
45.2.14 DSO_DrawCursorH.c—水平测量游标
    这个文件用于创建如下水平测量游标:
45.11.png
( a! D/ w7 [0 l( b5 [
45.2.15 DSO_DrawCursorV.c—垂直测量游标
    这个文件用于创建如下垂直测量游标:
45.12.png

" B3 J) {- ?( ~. c9 ]+ X, O. `

45.2.16 DSO_AmplititudeWindow.c—幅值窗口
    这个文件用于创建如下窗口:
45.13.png
, A0 Z2 e- v! y

45.2.17 DSO_ScaleWindow.c—时基窗口
    这个文件用于创建如下窗口:
45.14.png

  W& \3 f! M  L7 Y

45.2.18 DSO_StatusWindow.c—测量值窗口
    这个文件用于创建如下窗口:
45.15.png

( b4 r3 y" Q: X( P* V! Z

45.2.19 DSO_FirFilter_Step1KHz—Fir低通滤波: A* U- N* ^5 g# l! s
0 @+ C& }$ H! ?! \3 b: Q5 E% U
45.2.20 DSO_FirFilter_Step10KHz—Fir低通滤波& h- ]5 q$ O) r8 W) m% D
8 C/ T) ^8 P6 x
45.2.21 DSO_FirFilter_Step100KHz—Fir低通滤波
    上面的三项主要用于Fir低通滤波器的实现。
# Q5 E, A2 \5 G
8 Y' u" @" c6 R' A% M; [3 v+ \! X
baiyongbin2009 回答时间:2015-5-6 11:32:42
45.3 DAC实现方波的输出
    DAC输出方波的配置要注意初始化的顺序,顺序错误了,方波是无法输出的,还有就是不用的MDK优化等级,DAC配置时的顺序也不一样,这个应该是DAC库的一个bug。
  1. /*1 k0 o, f$ k" |- p) K
  2. *********************************************************************************************************
    - J5 j& U; X: C  c+ N5 l4 `4 W
  3. *        函 数 名: bsp_InitDAC
    5 h+ @, Y+ I5 ?9 y+ }+ t& g+ `5 [
  4. *        功能说明: DAC初始化: M' ~: ^3 E  a, y5 W( \) }1 R, n
  5. *        形    参: 无
    0 S6 b( [# W1 L8 L7 p* X* w% U
  6. *        返 回 值: 无
    ) R3 n& q8 f4 y% B4 ~
  7. *********************************************************************************************************0 ^0 c6 H- U) s. @
  8. */5 V% f) X0 v1 _  e" T, X! K+ k
  9. void bsp_InitDAC(void)7 P" e0 i: d& D0 u
  10. {   2 r1 R% m  `; S7 b/ T8 L' _
  11.     uint8_t i;5 y! b' H9 \2 s1 n; N
  12. . }) o$ i: T( |$ b; \
  13. /* 用缓存放一个周期的方波 */
    * t# a; q0 \9 f5 ]+ z( W4 I
  14. for(i =0; i < 32; i++)6 a; G: A& Y9 F" o+ k
  15. {- b- q9 E2 J: a+ d$ d! H
  16. g_usWaveBuff[i] = 0;6 r# ^9 r5 E% y$ m! _% ~1 L# E
  17. }5 p! `+ H* X9 \& F
  18. for(i =0; i < 32; i++)0 L) Y" T4 T1 l6 |
  19. {
    4 W$ h7 t3 U4 U: q# }% O) l  h1 \
  20. g_usWaveBuff[i+32] = 2048;
    % S; o6 b1 Z2 X1 S0 s
  21. }
    , n4 d) K- P- _3 i$ b& n9 ]1 k
  22. /* MDK优化等级为1的时候,DAC初始化顺序,不同的优化等级,3 l& ]$ [" ~+ Z8 a) F* E
  23.    不同的输出顺序容易操作DAC无法输出波形。
    7 a$ o: A- S. ?4 Y3 q
  24.    这个问题要引起大家的特别注意!!。
    6 {; N& ?' a5 Q( g8 z
  25. */! n/ i1 w+ G, m
  26. DAC_Ch1_WaveConfig();
      i! D6 `1 R8 m$ j4 I* Q( K" B
  27. DAC_GPIOConfig();
    $ Z: Y2 u3 m) g. F: Y
  28.     TIM6_Config();
    6 C4 |$ m4 ^7 B
  29. }
复制代码
$ S8 Q. d9 [5 Z7 A) h+ }8 }5 |8 _% D
baiyongbin2009 回答时间:2015-5-6 11:35:12
45.4  ADC实现数据的采集
    ADC的驱动主要注意两个问题,一个是ADC数据采集的关闭或者开启一定要保证同步,要不会出现采集数据的混乱,还有就是由于没有使用官方的3ADC快速交替采样,官方的快速交替采用使用定时器触发采集出的数据效果不好,抖动较大(特别是使用定时改变不同的采样频率时) 。现在采用的每个ADC都是用定时器单独的触发,并把触发数据分开,分成三等分,每个时刻实现一个ADC的触发。
  1. /*8 u4 e7 O; y5 h3 G: O+ m. m% H
  2. *********************************************************************************************************# o8 p& A5 y" ]$ f( P; {+ b
  3. *        函 数 名: TIM1_Config
    2 a4 {% y' v/ h
  4. *        功能说明: 配置定时器1,用于触发ADC1,ADC2和ADC3。2 Y% B' u3 S! E: p" X3 y
  5. *             当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。. G1 a2 T+ I2 P  N
  6. *        形    参: 无
    . v  d% x* }' r) i$ i5 j0 W9 X# Y+ x, _
  7. *        返 回 值: 无3 R( ?9 j5 o/ ]4 r; i0 y5 M% S) Y
  8. *********************************************************************************************************
    2 Y1 y6 s8 f# M6 O# Y- [' T
  9. */
    6 n, v5 I; e& U5 k4 I0 C
  10. static void TIM1_Config(void)5 }6 Q/ ^6 x+ }/ n  ]
  11. {
    8 l3 J* e, C$ c- Y5 e8 Z
  12.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  H! h& g' h6 M$ c: K
  13.     TIM_OCInitTypeDef  TIM_OCInitStructure;/ s/ z# T% T8 q$ J+ b
  14.     5 f7 d7 v: l) F5 n2 _
  15. /* 使能定时器1 */9 w0 s  k% Q: }' d$ C$ G6 ?
  16.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);. t1 E9 r; u9 J" H4 B, M# P4 b
  17.     6 ?& \, A- F1 Z- R$ q
  18. /* 先禁能再配置 */  {* N- B+ m" s( L6 w% V
  19.     TIM_Cmd(TIM1, DISABLE);' ?# K% z* {; V' v3 Q& N
  20.     /*) W" f' `3 c  u% b2 @1 Y9 d
  21.      ********************************************************************************
    , v# V8 o" Q- y. f7 Y
  22.     system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:
      }$ r4 t" N) b

  23. ; Z" I& e" G+ A1 M" f# l
  24.     HCLK = SYSCLK / 1     (AHB1Periph)4 |6 w+ ]* n2 m' I; R
  25.     PCLK2 = HCLK / 2      (APB2Periph)
    1 ?' ]5 R  t, T1 ]; B$ p+ a
  26.     PCLK1 = HCLK / 4      (APB1Periph)  I, O$ K( B; p* C3 _3 B# f

  27. " V7 j3 H' B* x* [8 c
  28.     因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
    $ f. l- ^, E$ w! }& S! M' Y. X
  29.     因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;$ t& X% j; k5 _1 Z/ _' ]+ ?  _, k7 t
  30. 3 V# D  ^) H3 n1 |1 N" J  g
  31.     APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
    # u! N6 k5 j( m$ ?) g# W
  32.     APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
    4 l, e/ N; G# Q1 ^
  33.           % R, ]3 O( c) X& {* t. p  V
  34.     TIM1 更新周期是 = TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1)
    % C3 @: i6 F1 [: q
  35.     ********************************************************************************
    ; X. v% _; S, \0 X; k
  36.     */
    ; @0 s) |. k# n3 [$ s
  37.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);            //初始化定时器1的寄存器为复位值$ q0 D$ w; U5 y6 }+ l
  38.     TIM_TimeBaseStructure.TIM_Period =  168000000/g_SampleFreqTable[TimeBaseId][0] - 1;    TIM_TimeBaseStructure.TIM_Prescaler = g_SampleFreqTable[TimeBaseId][1]-1;    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                        //CR1->CKD时间分割值3 h$ o- t" f) m5 a+ A# u
  39.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //CR1->CMS[1:0]和DIR定时器模式 向上计数0 C9 h& ~9 x% T5 e  U$ z  S
  40.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    $ T- W  d  d( J+ t

  41. 1 P: k$ V3 i9 `; d
  42.     /**************ADC1的触发***********************************************/
    " V5 s, M+ B! G; H: }$ E
  43.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //CCER 输出使能         
    # n* M; p! t( R
  44.     TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/3;    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;               //CCER输出极性设置
    $ n5 O7 b% ~( R$ A' ~# c& u
  45.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);( z- Z/ L4 M; P' u2 a
  46. /**************ADC2的触发***********************************************/' C! E" }, f0 J
  47. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            . Y& T- @. t, `
  48.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     5 |& Q5 C% p" w' V! {! B
  49.     TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period*2/3;
    0 n# d+ V9 S" ?9 i" O( x7 A3 h
  50.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;              
    - Y/ Y3 a* ~) ~" T! n, G
  51.     TIM_OC2Init(TIM1, &TIM_OCInitStructure);
    ; S2 f* `; j4 S% q+ f
  52. /**************ADC3的触发***********************************************/. Q0 q" i8 |2 Q. d# t/ o% v  U4 ^
  53. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           
    ! c. ?/ {7 ^2 a2 m
  54.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     
    : x+ K3 e  H2 w: j: o( t
  55.     TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period-1;
    ' U- R( U7 g0 e" E
  56.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;              
    " z( O, c$ M: b# O# F) Y
  57.     TIM_OC3Init(TIM1, &TIM_OCInitStructure);
    - k5 t$ S) m5 V
  58.     //TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);         //CMR2 设置预装载使能  更新事件产生时写入有效
    5 p& p& b9 P7 [$ r8 x! X6 _
  59.     //TIM_ARRPreloadConfig(TIM1, ENABLE);                              //CR1  设置ARR自动重装 更新事件产生时写入有效' h. M- {! v, X9 ^+ W- {
  60.     TIM_Cmd(TIM1, ENABLE);% j- X% I  N2 Z
  61.     /* 使能PWM输出 */* M8 O% o1 _9 l% q4 A, u+ E$ _
  62.     TIM_CtrlPWMOutputs(TIM1, ENABLE);  & I* A5 i# F5 L
  63. }
复制代码
下面是DMA的开启和关闭,一定要保证按照如下的顺序进行,且这些函数不能省略一个,要不重新开启DMA数据将无法再次传输。
  1. /*3 L4 n( p5 v0 j- G( D  {
  2. *********************************************************************************************************
    - }/ u: D$ }. e. k
  3. *        函 数 名: DMA_Open1 w4 T9 J8 H, H8 K& d, [! h
  4. *        功能说明: 使能ADC1,ADC2,ADC3的DMA
    5 E. o# C' e# k. ^7 S
  5. *        形    参: 无! s4 ?& D1 a6 H  G
  6. *        返 回 值: 无
    # C7 ?; d% C' _) O! v6 P
  7. *********************************************************************************************************; W1 o; w) `) M+ ?4 j+ M
  8. */4 y2 K; d7 ]! ]+ H% r! S9 W! c
  9. void ADC_DMA_Open(void)
    ; {; B) r3 f% @# i, G" }
  10. {6 u1 i# y, i; N+ p. P% l( k0 W! B
  11.     DMA_InitTypeDef       DMA_InitStructure;+ @- @2 n! r. @+ |
  12. 7 a' x) l; w* I4 [6 z, j, g
  13. /* DMA2 Stream1 channel1 配置用于ADC3 **************************************/
    * Z! B' T% `( Z( X' p9 Y
  14.     DMA_DeInit(DMA2_Stream1);0 G1 j  Q! n8 g5 S$ g& t
  15. DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
    2 S4 h+ F1 Q3 D2 V7 \0 {
  16. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
    2 a3 q. i: S# n- G4 O5 }4 C
  17. DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;8 i0 N! t: M; u3 I# H1 L
  18. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
      j7 |. r7 c) n7 w
  19. DMA_InitStructure.DMA_BufferSize = 1024*10;
    : N( c+ y7 X1 v" n3 O, Y2 k$ B! o9 R
  20. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;3 ~. o3 {# m3 P! M/ y# c5 K1 i
  21. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    ! ^3 h3 ^, \4 c0 a3 l* I, u  I. p
  22. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    3 O1 L8 [. v. e5 d6 p! R1 o
  23. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;, u! Z& `+ x" x- e
  24. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;" l! {. y3 V. z+ o
  25. DMA_InitStructure.DMA_Priority = DMA_Priority_High;( F" f1 t8 D- T3 l: h# |1 \
  26. DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         8 q* H5 Q9 F! z9 ?+ G9 b
  27. DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    * `" B# \: G; O4 t# p% c. n
  28. DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;+ A9 @7 ~/ [& _. k# H8 p0 ]
  29. DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;2 y; X' h& ], P4 z7 [* `5 S1 _
  30. DMA_Init(DMA2_Stream1, &DMA_InitStructure);# d& A1 m+ k" \& _0 N
  31.     DMA_Cmd(DMA2_Stream1, ENABLE);% T) ^7 j0 D+ \# B+ |5 ^3 h3 W- L
  32. /* DMA2 Stream2 channel1 配置用于ADC2 **************************************/
    - ^3 [8 m* r: o0 ?2 S
  33.     DMA_DeInit(DMA2_Stream2);  /* 在DMA的DMA_Mode_Normal模式,一定要使用这个函数,循环模式可以不用 */
    * f  V0 f2 `. J! ^1 e
  34. DMA_InitStructure.DMA_Channel = DMA_Channel_1;  
    / g) M, P; [7 l+ _
  35. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC2_DR_ADDRESS;
    9 p; u$ K& o$ j+ }
  36. DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC2ConvertedValue;) e$ m' N% Z! z1 `9 s; D- h- k( p
  37. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;2 f% Z0 l, u# i' L  \
  38. DMA_InitStructure.DMA_BufferSize = 1024*10;
    7 l- A/ i& s% x8 j% i, L1 Q
  39. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    0 D4 C5 K  N5 y5 \" X1 F! {
  40. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    " N2 _* G' |+ d2 ~( x3 ]
  41. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;8 q( S3 T- Q0 w- [1 u$ f( c: N
  42. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
    ) N* F% N. k8 Y- B5 z0 s/ K
  43. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    , B1 D' A* {* s
  44. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    0 ^! K, h" k/ Z8 v0 L9 H5 L
  45. DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
    + _2 v( h9 A1 Q0 }1 l& `9 h2 A8 x
  46. DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    1 h. r* i7 R7 E) j; Y
  47. DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;  Y- s5 @3 h# i0 S
  48. DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    $ g$ o1 F7 C4 u( |: m- L
  49. DMA_Init(DMA2_Stream2, &DMA_InitStructure);1 [. _' C% Y2 C7 A3 @. C1 {, I
  50.     DMA_Cmd(DMA2_Stream2, ENABLE);
    7 Y; U" ^/ O, c2 `
  51. /* DMA2 Stream0 channel0 配置用于ADC1 **************************************/+ y, {+ a9 r8 ^: O6 ^  f& M
  52.     DMA_DeInit(DMA2_Stream0);3 _8 D: r  z9 W
  53. DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
    9 S% y, Q1 u5 M9 x" }
  54. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;, @5 Y3 {  k4 C. `# h/ r
  55. DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue;) F! h4 q" [8 Z% ^$ `
  56. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;: ]# e0 [/ e$ y; [4 \1 @" s- o
  57. DMA_InitStructure.DMA_BufferSize = 1024*10;
    , B! u( l% P5 ?, E
  58. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;* P" G# |2 D/ _  b% x6 e
  59. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;! y$ T/ h0 x* Z. @8 N* F2 z4 b5 T
  60. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;7 Q6 ]! U0 q  f) V
  61. DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
    " s; y( J/ k  B) v$ R5 p
  62. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    5 U; }  \, }) j1 |3 s' a$ L
  63. DMA_InitStructure.DMA_Priority = DMA_Priority_High;) e- j; g% @4 e/ X" |9 Z  v
  64. DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
    / v( S; n4 K2 Z& Y1 q: t6 b
  65. DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;  t1 k3 D& ^. e1 m  K' _0 i5 \
  66. DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    ( ^2 c6 L/ B% P8 x
  67. DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    # Y1 M3 ]4 X6 J) o& Y  G0 o9 Q
  68. DMA_Init(DMA2_Stream0, &DMA_InitStructure);: {# B4 _) |( M/ V# ^
  69.     DMA_Cmd(DMA2_Stream0, ENABLE);
    ! [& K! o; y5 M# p) R1 p

  70. ' t, X8 n; H! l) ^8 v
  71. ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
    ) ~1 Z" B( t6 S6 i/ b1 c

  72. - t; _  a  \0 L
  73. /* 使能 ADC3 --------------------------------------------------------------*/* ~" L; u( P1 v( D
  74. ADC_Cmd(ADC3, ENABLE);4 L5 I- H+ _$ f5 c) G2 E
  75. ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);4 q$ i9 v. d5 [( D! _) r
  76. 5 M7 `* i; M8 h7 `1 _* J6 U
  77. /* 使能 ADC2 --------------------------------------------------------------*/
    : S& E, I* u0 J! p
  78. ADC_Cmd(ADC2, ENABLE);& r- }, x- J: w5 u
  79. ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
    9 o; r1 F  e" t

  80. 4 k2 N) p; q' E
  81. /* 使能 ADC1 --------------------------------------------------------------*/
    - o' D) P  @2 Z& `
  82. ADC_Cmd(ADC1, ENABLE);
    " k3 s* P: v9 |9 S- C, w4 H
  83. % _6 [* v+ b# t, L3 o' J
  84. /**定时器配置,一定要重新的初始化从而保证同时触发 **/
    - ?0 c# E6 }$ O& l# Q9 }& d; x3 i
  85. TIM1_Config();8 c3 n; u2 p7 G+ F% J0 P

  86. $ s2 l6 m$ P  C. S# M
  87. /* 只有在普通触发模式在启动TIM8的计时功能 */
    ) K! b2 k* H2 E
  88. if(TriggerFlag != 0)
    7 C" A- i5 U- ]8 q
  89. {
    - A& ~; t; t$ f. E, H
  90. Time8Recorder();
    6 r6 P4 }! H% e" p6 g
  91. }
    8 N' T! ?9 F/ O* ^6 |
  92. }4 I4 V+ u& [: o& I( h. C
  93. , p% f- c! a) y4 t/ `+ u$ Z/ b
  94. /*- b( H( B3 b% R
  95. *********************************************************************************************************8 J' Q  G) X' ?1 u8 l
  96. *        函 数 名: DMA_Close, t! }! K7 k( C# X7 J
  97. *        功能说明: 关闭ADC1,ADC2,ADC3及其DMA
      u% T1 _  Q+ R7 b! H
  98. *        形    参: 无# S; b, X! S% M6 Q& R
  99. *        返 回 值: 无2 @: s4 i) y0 `' F# P) [  \3 a
  100. *********************************************************************************************************
    1 _1 _" \" J; m  V
  101. */
    " Y' u4 b* {" ^; B& k4 V! [- L
  102. void ADC_DMA_Close()4 a- @  `% v/ @" @
  103. {" d' C" R+ o( d/ G  s$ a( a' ]
  104. TIM_Cmd(TIM1, DISABLE);) c7 J1 q' [9 ?- f7 `/ ^
  105. DMA_Cmd(DMA2_Stream1, DISABLE);
    1 C# d& v* k8 D
  106. DMA_Cmd(DMA2_Stream0, DISABLE);7 x. d5 P) z8 o( D
  107. DMA_Cmd(DMA2_Stream2, DISABLE);: ^/ \1 T% D4 A5 S  Z
  108. /* 禁止 ADC1 ---------------------------------------------------------------------*/6 B  y" l, [- T! f. Q: E
  109. ADC_Cmd(ADC1, DISABLE);
    - \7 d, i; {4 S( E8 O0 h

  110. - S, k# e3 h' k
  111. /* 禁止 ADC2 ---------------------------------------------------------------------*/, ]3 {. n* f3 J+ Z" }$ Z+ D
  112. ADC_Cmd(ADC2, DISABLE);
    - b. \$ L" p8 Z' J$ ^: [0 Y
  113. /* 禁止 ADC3 ---------------------------------------------------------------------*/$ d; _9 }2 ?7 ~
  114. ADC_Cmd(ADC3, DISABLE);
    % U& D( |  S4 U* Z8 N
  115. }
复制代码
+ i  Z$ I3 S0 T# @( ^+ X
baiyongbin2009 回答时间:2015-5-6 11:35:32
45.5总结# w0 v: X, b2 \! Z
示波器的框架设计就跟大家讲解这么多,后续后推出示波器的详细设计教程。有兴趣的可以直接看源码即可,源码注释已经比较详细。

所属标签

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