特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接, c( d ], X7 |- ~# |6 M
第45章 示波器设计—系统框架 1 v0 C2 |( [6 o b% D0 ]) l
本章节主要是对示波器的系统框架做一个简单的介绍,后面会推出示波器的详细设计分析。示波器的的源码注释已经很详细,对框架有个了解之后看源码即可。 45.1 ucos-iii任务分配 45.2 示波器核心任务 45.3 DAC实现方波的输出 45.4 ADC实现数据的采集 45.5 总结
" Z. N1 e) M( G8 O) g# ~( k0 ~1 Q45.1 uCOS-III任务分配 主要创建了如下6个用户任务: l AppTaskStart----启动任务 l AppTaskGUIUpdate---界面截图任务 l AppTaskCOM----留待以后升级使用 l AppTaskUserIF---留在以后升级使用 l AppTaskGUI------emWin任务 l AppTaskGUIRefresh---Led闪烁任务 下面主要对启动任务,界面截图任务,emWin任务,Led闪烁任务做一个介绍。
+ _9 [0 [! H: ~ G& d2 w1 N q45.1.1 AppTaskStart—启动任务 启动任务用于硬件驱动的初始化,系统滴答时钟的初始化以及触摸扫描和按键扫描,代码如下: - /*; d" v/ y, R& @+ Y1 A. j: ~1 v
- *********************************************************************************************************' _- A/ i, x1 }# H
- * 函 数 名: AppTaskStart
8 \( |5 c% Q: N: R& M5 S - * 功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器(在BSP_Init中实现)! x8 ^# V9 X* w
- * 形 参: p_arg 是在创建该任务时传递的形参5 t: c& Z' S6 x8 B" W# V0 w
- * 返 回 值: 无3 [ e2 y, k) P- X+ e3 ?8 z
- 优 先 级: 2
; D6 v3 U: y- a% J0 B4 A2 J - *********************************************************************************************************
( C2 P/ J. q) F4 w% k- P& c - */# F6 f4 i4 L" @ r4 ]3 r
- static void AppTaskStart (void *p_arg)
t/ o$ A2 R) a7 o6 P - {
2 x! ?! F; l) B1 E" S! ?' v0 {5 M - OS_ERR err;
6 e! k( G( [8 R* e" k) s, x - uint8_t ucCount = 0;
& Q( U1 i1 D" Y - (void)p_arg;
0 F k8 I! o& |& H5 T - bsp_Init();
$ ]9 X4 D5 @( }) r - CPU_Init();6 h6 v; E& L4 @' t# i6 l
- BSP_Tick_Init(); 1 u- t# y+ Y7 Y: I0 T
-
; Y. f6 B$ q# R& W - #if OS_CFG_STAT_TASK_EN > 0u
' S& c! F' T5 o% L W4 p - OSStatTaskCPUUsageInit(&err);
; X2 T7 s" c" ^( ] - #endif
( ~/ S, k8 @. x- U- a4 { - ) |6 [# X1 G5 j$ R
- #ifdef CPU_CFG_INT_DIS_MEAS_EN
, S" x" j0 b& J9 y2 H: F) R - CPU_IntDisMeasMaxCurReset();* B }( ^5 X$ v+ h% V5 j7 u |
- #endif
! Z$ N. F6 }$ R5 P' [ - / X9 h/ g3 g4 H" ^ j0 c' f: }
- AppObjCreate();
% n8 u7 M2 {9 f! V - AppTaskCreate(); ( }& w- R& M+ o1 F, @* Y) |
- while (1)
9 p& a: O# {# X& @3 U4 ] - { $ u2 \ |; s4 k5 l8 ]
- /* 1ms一次触摸扫描 */5 ^: k9 l5 e; ^6 v! v+ j# U$ h
- TOUCH_Scan();* K! ?8 _- v: q6 `7 q
- /* 5ms一次按键检测 */$ r5 s6 C+ @0 m5 H: p- j
- ucCount++;5 h" w) S' B; K! [9 M. \6 U" W
- if(ucCount == 5)# G3 r7 E3 o3 H- O) J$ |6 K' s
- {
3 j2 g& H, h; p4 R4 X - ucCount = 0;
. v" e+ C# ]! @. D. j% u - bsp_KeyScan();# V9 O& R4 u7 _7 t/ P9 K! a. m8 m
- }6 r: X k# E8 ?( Z
- BSP_OS_TimeDlyMs(1); \+ {2 k( |+ n1 P% u4 i- R. _
- }; {( w& }* J8 |7 ~3 k0 j7 R
- }
复制代码 - u, Y9 F F! w7 o6 p; E
45.1.2 AppTaskGUIUpdate—界面截图任务 界面截图任务主要用于界面的截图并将图片以BMP格式保存到SD卡中。 - /*4 ]3 }* Y2 y& K0 p
- *********************************************************************************************************8 N0 V" C; A1 m& k6 g" c+ B: z/ [
- * 函 数 名: AppTaskGUIUpdate: b/ Y9 H/ N+ r! e7 Z3 w! ^
- * 功能说明: 此任务主要实现截图功能.
' g# ~0 e9 @0 J! z+ R - * 形 参: p_arg 是在创建该任务时传递的形参
3 T/ o8 o' S9 W% c - * 返 回 值: 无
: t1 p- J& N* @. O3 w - 优 先 级: 3
. B. C0 R- ^1 U9 Z7 e* V6 C+ A - *********************************************************************************************************
0 `' e1 t/ U* u$ l - */
( M: b/ E/ Q& C. t - static void AppTaskGUIUpdate(void *p_arg)& ]7 ~- ^8 B* d/ q
- {( F6 C5 V- S- k- |& {8 }
- OS_ERR err;2 Z. S4 p& n6 F' L" s- s0 d. Y
- uint8_t Pic_Name = 0;: U E- w; e& [7 n5 r) l7 o$ P
- char buf[20];
) H* r# }5 \9 Z! W - CPU_BOOLEAN SemFlag;
9 _% R, m/ u" |, q* _ - 2 W/ N; l( |& h
- (void)p_arg;/ G; k6 x3 [# P6 m2 g: |* V
-
, h" y( l9 |4 i# b - while(1)/ q4 P+ P6 T9 O+ R% [0 u
- {! z J& i& Z+ h" T+ d" r
- SemFlag = BSP_OS_SemWait(&SEM_SYNCH, 0);$ l8 c* d( q7 m# d' q3 L) D/ I: K/ c
- if(SemFlag == DEF_OK)
. Q E. e8 E0 F* G8 o k3 a! H - {7 X' ~' _( A. v0 q" l5 |4 |) f
- sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);" r2 | s6 R* i
- OSSchedLock(&err);
- N/ y" P, s- z* a9 i9 o% W - /* 如果SD卡中没有PicSave文件,会进行创建 */
H' {. ?" ~. L" p - result = f_mkdir("0:/PicSave");
H* L. I! u1 m! P/ @; V - /* 创建截图 */9 K5 K5 _2 v! B( Z/ Y0 v. I) S& v
- result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);
$ z/ g' }' E, G$ C0 d& K - /* 向SD卡绘制BMP图片 */
4 D# x! `: x* |1 k8 L: X6 j9 Q) P - GUI_BMP_Serialize(_WriteByte2File, &file);5 S0 F& F! `7 r3 c$ f7 V. w* g
- /* 创建完成后关闭file */2 U0 G# L3 a1 P5 z0 i! [
- result = f_close(&file);# z% z: n& _; }( @5 U1 D
- OSSchedUnlock(&err);; r0 y6 M& X6 l2 S" u: i; @
- Pic_Name++;
& @4 U: x2 y# h/ F - } 3 T6 f6 ]+ T4 C& `. c/ _7 C( U+ ^
- } & M7 N3 I1 n# E3 ~
- }
复制代码
0 v2 t$ v: D. e/ `! _: Q45.1.3 AppTaskGUI—GUI任务 这个任务是示波器设计中最重要的任务,代码如下: - /*: Y4 U) v2 }- w% }. N
- *********************************************************************************************************1 x+ ~0 @# }* t1 D+ v6 _
- * 函 数 名: AppTaskGUI
; B9 k: K' ~# o) o- G, N - * 功能说明: GUI任务 $ _. [. m% `6 _: a3 C3 {
- * 形 参:p_arg 是在创建该任务时传递的形参% C( U$ L+ d3 a0 c2 D4 u
- * 返 回 值: 无 D4 y% E% Z+ J& q0 ]# o1 }; D+ g! Q
- * 优 先 级:OS_CFG_PRIO_MAX - 4u- S& `1 a( f# B. K& i
- *********************************************************************************************************
4 A3 b( p) n) d( M, K, T - */
3 p! n3 r8 I( |, P" y& P - static void AppTaskGUI(void *p_arg) t! {; y: G+ ~7 B0 U
- {
# U# M5 }" E( P - (void)p_arg; /* 避免编译器告警 *// c9 h) k9 C- M8 @1 J$ A5 t
- while (1) . _% r9 C' f/ F! W* |, E
- {8 B1 W! ^/ G3 x, p8 k% j N4 h7 S
- MainTask(); $ D: e4 B% Q5 `6 Q" C
- }
; O% J$ M; K) g/ g& { - }
复制代码
5 i* m' f f. I45.1.4 AppTaskGUIRefresh—Led闪烁任务 这个任务主要通过LED的闪烁来指示系统的运行,代码如下: - /*, \# T' k# j5 g( X+ R ?
- *********************************************************************************************************/ Q3 G& I: ]' I
- * 函 数 名: AppTaskGUIRefresh
7 F5 J. H* {( ?" x7 ~# p0 Y6 P - * 功能说明: Led闪烁任务,表示系统运行 0 A8 y$ ^$ J& f3 ?6 B' W
- * 形 参: p_arg 是在创建该任务时传递的形参
6 `3 ^) ~1 K4 F `, ^" O - * 返 回 值: 无4 {4 O/ Q/ f g7 D6 ^/ e ~/ Q
- * 优 先 级: OS_CFG_PRIO_MAX - 5u& k" d/ l7 I: {
- *********************************************************************************************************
3 c* z: ] ^/ a# r# V - */! l" E/ V1 E* i* b) U
- static void AppTaskGUIRefresh(void *p_arg)
1 B, Z4 }4 F6 o" I$ X W - {% m9 i2 p) u4 E
- (void)p_arg; /* 避免编译器告警 */
' |% U$ u$ j# u7 B* ~/ } - # s6 b5 R( |- M# T
- while (1)
8 U& r4 P. w# X, { - {
) V/ Q+ r6 q+ L - BSP_OS_TimeDlyMs(200); 8 t7 ]! ?" F. h h: d
- bsp_LedToggle(2);! o* \. D$ n2 J! d8 R
- } 9 m! j: D1 p: a/ N
- }
复制代码
8 j: j% Z$ x# x45.1.5 其余任务 剩下的两个任务留着以后升级使用。 - /*
$ f$ z% e1 W0 {- A! I: s4 d: v - *********************************************************************************************************$ {' [, u+ w X* Y
- * 函 数 名: AppTaskCom" T* R; q( S! c2 I; L2 d, p4 Q5 r
- * 功能说明: 留待以后使用) a7 h, i& R$ e# }# p% }7 Z/ b
- * 形 参:p_arg 是在创建该任务时传递的形参
5 H' I X7 d: p7 @- _ - * 返 回 值: 无. n r6 k7 G, L+ i
- 优 先 级:3
5 n4 p. h9 v- {, ?; K' G' q - *********************************************************************************************************7 r! D% }- c: t7 ?
- */
$ o' p: ]4 \9 A3 G. p! o8 G' M - static void AppTaskCOM(void *p_arg)
. ~ ~+ ?! B; v3 {7 T - {
: M0 H% H1 b) `: { e; |. t V - (void)p_arg;+ [2 Z. |/ ^1 F% y4 S: G
-
4 Q( a) B! N& m - while(1)
* t/ P' U- `6 t; }2 ?: i - {& f1 ]& m! U% H; u1 M8 c7 @
- /* 100s执行一次 */6 g/ W6 ?- I& b" g# V; s. V
- BSP_OS_TimeDlyMs(1000000);
3 P: g$ ` v3 ?5 v6 G2 E - } 3 k+ T- D4 |' V
- }
$ l0 ~3 G# I0 o1 z/ Z- | -
, r+ w" a. h8 s; N* {- N - /*$ S5 X3 w+ {' u) j. P4 [0 Y
- *********************************************************************************************************8 Z3 }+ c4 u6 R% @* X9 m
- * 函 数 名: AppTaskUserIF5 M% D6 D1 Y" \
- * 功能说明: 留待以后使用。& d: w9 N/ y3 v: C
- * 形 参: p_arg 是在创建该任务时传递的形参/ t( u+ z. u* @8 I, t: n
- * 返 回 值: 无
i% N7 T+ K8 ` _- R: Z& U9 D - 优 先 级: 2
6 _3 n7 t! Z9 T2 l6 A - *********************************************************************************************************
3 t' r8 ~& x2 g" d% D - */
( I0 ^/ P: ^% B1 t" n% ~) Q - static void AppTaskUserIF(void *p_arg)
2 h; f6 V, J0 e4 Y1 u! a+ B% g - {9 Y9 J+ n6 p D9 X2 K, @5 m
- (void)p_arg; /* 避免编译器报警 */2 K: j* u% W3 P7 F1 r& `# [/ d
- 6 g/ U' h# ]$ T& \7 z
- while (1) ; |& A$ C, l/ p- o# W
- { $ A3 w3 L0 P+ I- }+ C1 l$ ~
- /* 100s执行一次 */
3 |& o" B A2 E' y8 b- R4 l5 l; \ - BSP_OS_TimeDlyMs(1000000);
7 W0 F- A( L2 F+ i - }+ f7 W( y2 J( ?" o8 L: T6 P, x
- }
复制代码 $ O% @2 U& g" S7 z
|
! u) Q8 c P& Z1 Y7 _' [5 o6 r
45.2 示波器核心任务
45.2.1 MainTask.c—GUI主任务文件
45.2.2 MainTask.h—所有DSO相关文件的头文件
45.2.3 App_SysFunction.c—界面截图
45.2.5 DSO_MeasureDlg.c—测量对话框
45.2.6 DSO_InspectorDlg.c—对话框
45.2.7 DSO_AcquireDlg.c—对话框
45.2.8 DSO_TriggerDlg.c—对话框
45.2.9 DSO_MathDlg.c—Fir低通滤波器设置对话框
45.2.10 DSO_SettingsDlg.c—设置对话框
45.2.11 DSO_DacDlg.c—对话框
45.2.12 DSO_ReturnDlg.c—对话框
45.2.13 DSO_DrawBakFrame.c—绘制波形区的虚线方格
45.2.14 DSO_DrawCursorH.c—水平测量游标
45.2.15 DSO_DrawCursorV.c—垂直测量游标
45.2.20 DSO_FirFilter_Step10KHz—Fir低通滤波
45.2.21 DSO_FirFilter_Step100KHz—Fir低通滤波
( s2 H* U; I# H
示波器的框架设计就跟大家讲解这么多,后续后推出示波器的详细设计教程。有兴趣的可以直接看源码即可,源码注释已经比较详细。