特别说明:完整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 Y7 k4 @3 Y3 S; d0 D2 J4 U: ^ - *********************************************************************************************************
- M5 x. |5 ~- [/ j- K3 X( ~/ P - * 函 数 名: AppTaskStart
! }2 X+ y3 u8 S, u! u - * 功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器(在BSP_Init中实现)! y; H3 w& P8 w: e( e) y
- * 形 参: p_arg 是在创建该任务时传递的形参5 A- R9 L- e4 l8 }9 z- e* I6 R
- * 返 回 值: 无
: o4 W+ ?( i5 s6 v5 y - 优 先 级: 2
! ]3 x2 R9 H( V9 i. M O - *********************************************************************************************************) V# ]- h8 j5 A
- */, g; o( v' L" z, Y" U
- static void AppTaskStart (void *p_arg) f. t4 R, P0 C( b) a$ d9 U3 s
- {+ W' ~9 Q# c' \" m) z) G( ?0 o/ y: n
- OS_ERR err;
1 @! a* N$ ~1 V+ q/ p6 u - uint8_t ucCount = 0;. J6 p& a6 O& D' Q
- (void)p_arg;) k8 ]% d0 N$ k6 Y$ u/ Q
- bsp_Init();
# N2 a8 k. j& @- P& ] - CPU_Init();7 ]. W! q& A8 v& e) k* G
- BSP_Tick_Init();
+ M) f& O2 p$ b' J: C - 4 p, B3 x$ P' Z% | ]: j# ~
- #if OS_CFG_STAT_TASK_EN > 0u
' @! s( C& {# i - OSStatTaskCPUUsageInit(&err); + i1 d t3 H$ S5 |; Z# j* `
- #endif
8 g; @' Z/ N) k( T# O! J. u/ w -
( V- O% U" Y4 \+ h0 r7 C- U$ V - #ifdef CPU_CFG_INT_DIS_MEAS_EN
; j2 u/ ]4 L$ u - CPU_IntDisMeasMaxCurReset();
" b% B {5 h+ n# L2 x/ ~8 r- @ - #endif
; p' N D5 a% y - $ V4 F0 l( p, ^2 L( C/ u9 a
- AppObjCreate(); 7 P- Q7 q# ^& {; P% f; n
- AppTaskCreate(); : E( `& Q% S! f9 j; [
- while (1)
4 f' [# |8 a) X" b; h; c - { 1 J: k5 e& A: h0 B
- /* 1ms一次触摸扫描 */
k4 ~# U; h0 x& p: ?2 @ - TOUCH_Scan();; K# k }+ T! L
- /* 5ms一次按键检测 */2 Q* z: ^9 p" z' w
- ucCount++;
! @& T6 z5 r) v4 b - if(ucCount == 5)
* r6 X% P- X5 v. b+ N7 p - {& O+ v$ j* } d( _* M) F1 @
- ucCount = 0;
& L6 B% \; k2 u8 N - bsp_KeyScan();% B' f' B: Z' y8 u
- }
2 m( ?* h/ p! ?* f; X" g9 p - BSP_OS_TimeDlyMs(1);- R' F6 j( i" X" l% l$ h
- }+ C3 F! t' J8 l* |" k" F" A( S5 S% c6 t) a+ {
- }
复制代码
2 t, x- b0 Q+ `. u1 q& T8 L) k45.1.2 AppTaskGUIUpdate—界面截图任务 界面截图任务主要用于界面的截图并将图片以BMP格式保存到SD卡中。 - /*
' d/ v0 a0 S( W8 N2 F - *********************************************************************************************************
7 v6 b2 O. l$ `0 g; @7 I, Z - * 函 数 名: AppTaskGUIUpdate
* }# W: P9 y5 e6 S6 |% G/ a - * 功能说明: 此任务主要实现截图功能.
1 s' z0 m* Z0 F - * 形 参: p_arg 是在创建该任务时传递的形参
; W$ B; x- T9 g" g* I - * 返 回 值: 无
! N; i% g, y! `- g - 优 先 级: 33 m$ ` z) K t7 g: _( [
- *********************************************************************************************************
8 f) k1 t8 V1 b: C0 F& g( B - */9 |! r3 p) l; x& o
- static void AppTaskGUIUpdate(void *p_arg)& @5 ]! c. E: k& J* r8 M
- {; g" h, |$ x' ^# s1 U) }% U
- OS_ERR err;
- Z7 A; ?/ @/ m/ }% j! y - uint8_t Pic_Name = 0;
- V `" c3 n: m" I2 q9 ~ - char buf[20];
0 r( E1 f [/ m( Q1 J( D - CPU_BOOLEAN SemFlag;
0 k2 p; z1 o& E -
) a5 A$ ]4 u# z9 j. \ - (void)p_arg;
# _0 t- O$ V. P% E, m -
* F, S Y/ A# {$ B# a5 f; h - while(1)
6 P$ ~' `2 G. N. A$ Y5 y& T, w5 l - {$ f4 n9 ~2 a5 d2 y& v$ g
- SemFlag = BSP_OS_SemWait(&SEM_SYNCH, 0);
' _$ Z& i/ E8 @+ ^* D* X - if(SemFlag == DEF_OK)6 g- ~# Q/ ?( w4 \* E W" }
- {
7 b; p' v; X$ p* }8 @2 c - sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);
. l% x( k9 y3 b- |* E! Y# B3 w - OSSchedLock(&err);+ h; r% W2 x$ p7 `% R; c% }
- /* 如果SD卡中没有PicSave文件,会进行创建 */, i$ k& t2 `. m! ^: d
- result = f_mkdir("0:/PicSave");( g( ?5 Y; d5 c E- y
- /* 创建截图 */ l1 q/ V& Q- Q& W
- result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);. J) X$ R% V" P5 ^( c0 Y
- /* 向SD卡绘制BMP图片 */7 E8 m8 y0 u( g [6 u. ~
- GUI_BMP_Serialize(_WriteByte2File, &file);
# V: a/ r. |6 M1 G9 i. e - /* 创建完成后关闭file */) v! f' o, k; d. P7 a. n) ?0 l5 o: @
- result = f_close(&file);
3 i1 D3 _) M7 \% g* G4 | G - OSSchedUnlock(&err);
/ c0 g9 V4 p1 w - Pic_Name++;
# f6 }7 }8 \, B! ?6 \# H - } 0 t D) v7 M* A5 G" |5 I. U
- } 9 K, i1 [( ?! R' H
- }
复制代码 ( c! _) v# n4 z4 e
45.1.3 AppTaskGUI—GUI任务 这个任务是示波器设计中最重要的任务,代码如下: - /*( \9 y5 A E: S/ t
- *********************************************************************************************************) u' O$ ?4 m; _" N# l" j" B
- * 函 数 名: AppTaskGUI
/ V6 j% g/ b5 H/ d* Q2 I/ ~ - * 功能说明: GUI任务 : S: i. w; B& r& m9 U/ m g8 [$ ]
- * 形 参:p_arg 是在创建该任务时传递的形参
4 [: R$ m' ^4 `1 f6 @ - * 返 回 值: 无/ T# R" g) t) h# @' A% @
- * 优 先 级:OS_CFG_PRIO_MAX - 4u
# y9 Y8 I3 k/ L - *********************************************************************************************************5 B( {; C0 f8 R
- */$ g/ ^# b3 L- ]6 q) M) K( R
- static void AppTaskGUI(void *p_arg)5 G: R7 s% {; T. q
- {( z% Z) G8 l7 c0 T) I( `" k- U6 Z
- (void)p_arg; /* 避免编译器告警 */3 j$ T$ X! h" W# @ |
- while (1) i- c" j. m6 V% [# u6 c2 O
- {1 d4 ?; r* C% B, x
- MainTask(); ; I0 j2 v; N+ Q/ O" j$ n: a) o/ W
- }
4 b/ v! d+ ]8 y& f6 q - }
复制代码
8 E! K! i' W2 F# x45.1.4 AppTaskGUIRefresh—Led闪烁任务 这个任务主要通过LED的闪烁来指示系统的运行,代码如下: - /** Q( _3 K+ F# E w. n5 E
- *********************************************************************************************************! H# P# w" I+ y! k, u- k( N
- * 函 数 名: AppTaskGUIRefresh
# d* `8 s' L3 R0 L6 U3 @ - * 功能说明: Led闪烁任务,表示系统运行 8 v4 e' ?& j: D0 p% m7 T( f* X
- * 形 参: p_arg 是在创建该任务时传递的形参! c' Y& f. r0 N* _+ _( ^6 w$ H
- * 返 回 值: 无
) T, }* Q7 e$ {& V0 }' W' r - * 优 先 级: OS_CFG_PRIO_MAX - 5u
3 r$ r1 q3 X+ B; ~0 z# P - *********************************************************************************************************
6 B, r4 c8 \; I! c. T - */
) f6 S% d2 o- @ - static void AppTaskGUIRefresh(void *p_arg)
" g+ Y3 J" ?2 w$ o. m - {) U. d" C8 D% M7 _! L( ^
- (void)p_arg; /* 避免编译器告警 */7 T: E: s0 q- V- E3 g$ r, B5 b/ y* }
- ( e: P) Q0 X1 q* r) y* o
- while (1) 7 Y3 U; D* T! t+ l" m
- {' C( \4 i2 J5 L
- BSP_OS_TimeDlyMs(200);
" A' h6 V+ \# `) E - bsp_LedToggle(2);
" _+ o- g3 s- ~7 l - } 3 E2 C) y6 D& O8 c! n
- }
复制代码 ' i0 s7 o# f% P3 |- s- q: L; {
45.1.5 其余任务 剩下的两个任务留着以后升级使用。 - /*
1 e5 S3 q+ M8 t& \3 H - *********************************************************************************************************
3 _8 V! E- Z8 u - * 函 数 名: AppTaskCom
& f- s" j, ~# |: M2 s5 t, ]- |8 \ - * 功能说明: 留待以后使用, C" i7 w6 A: A/ b/ N
- * 形 参:p_arg 是在创建该任务时传递的形参, x) d5 Y1 j4 Z3 }
- * 返 回 值: 无
+ C9 f; o [# P6 J/ E/ n* l+ M - 优 先 级:3
+ {2 b( z4 G A, B# P3 [ - *********************************************************************************************************$ J6 I7 ?3 E0 l9 p* _9 {
- */6 u0 H8 J3 X/ N. P( s
- static void AppTaskCOM(void *p_arg)
. f, y* J' T9 {! {& \3 E/ T( K - {2 T6 e& S2 g) D- |
- (void)p_arg;; `5 b0 Y& |/ k
- 3 ?2 k( W5 b: z
- while(1)6 v7 `- [+ v/ C. x3 V- o
- { W/ |! Y! H9 U& r
- /* 100s执行一次 */7 Z/ j! g- U. f9 c! ] Q
- BSP_OS_TimeDlyMs(1000000);
/ I. J. ?) J! P' v4 C$ @" B. O4 p" j - }
( V$ S# H$ D3 ?' v5 O+ `6 c1 m - }
0 Q! l" Z- |$ \9 F( T3 V- m+ T2 T - 3 k9 A' ?6 `' j6 d4 |6 l
- /*5 B+ Q- ]2 l$ `
- *********************************************************************************************************
$ ? d% w" \1 \4 Q. ?* [ - * 函 数 名: AppTaskUserIF5 h$ j' b7 j# R7 a8 |
- * 功能说明: 留待以后使用。+ c! U t0 I) I9 u0 p; t
- * 形 参: p_arg 是在创建该任务时传递的形参
" P( }9 r m+ B/ f - * 返 回 值: 无+ E" T$ `- `& [: t& R: L; h' t
- 优 先 级: 2
$ c& c; D8 j3 f/ }9 V9 v' O% S# o - *********************************************************************************************************: a4 L* W9 y' n3 E* ]
- */
7 x$ [ L1 m/ g - static void AppTaskUserIF(void *p_arg)
; T; Z4 f6 x" O7 R5 Q0 F; k - {
" H1 \6 A7 W3 @( B0 T& A4 S - (void)p_arg; /* 避免编译器报警 */! \* H; G. T% k: Q% M
-
& b1 l9 `& A# v0 i+ y0 {- c# E$ O - while (1)
' T5 f/ t, h+ \7 {1 D! _, B) P - { ( z7 K" k4 C4 O0 C8 v! {* v
- /* 100s执行一次 */
; X0 O/ R" i/ H z" w' j; f0 g - BSP_OS_TimeDlyMs(1000000);
& ^7 |5 z. v5 D8 t' Y - }
+ z- X. a; A6 ?8 B& @# O3 V1 Z I - }
复制代码
1 {$ Y9 O3 {( o1 A% l |
5 V5 ?8 I& g* P |3 v7 e) z* j
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—垂直测量游标
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低通滤波
8 Y' u" @" c6 R' A% M; [3 v+ \! X
示波器的框架设计就跟大家讲解这么多,后续后推出示波器的详细设计教程。有兴趣的可以直接看源码即可,源码注释已经比较详细。