特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
第45章 示波器设计—系统框架
本章节主要是对示波器的系统框架做一个简单的介绍,后面会推出示波器的详细设计分析。示波器的的源码注释已经很详细,对框架有个了解之后看源码即可。 45.1 ucos-iii任务分配 45.2 示波器核心任务 45.3 DAC实现方波的输出 45.4 ADC实现数据的采集 45.5 总结
45.1 uCOS-III任务分配 主要创建了如下6个用户任务: l AppTaskStart----启动任务 l AppTaskGUIUpdate---界面截图任务 l AppTaskCOM----留待以后升级使用 l AppTaskUserIF---留在以后升级使用 l AppTaskGUI------emWin任务 l AppTaskGUIRefresh---Led闪烁任务 下面主要对启动任务,界面截图任务,emWin任务,Led闪烁任务做一个介绍。
45.1.1 AppTaskStart—启动任务 启动任务用于硬件驱动的初始化,系统滴答时钟的初始化以及触摸扫描和按键扫描,代码如下: - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskStart
- * 功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器(在BSP_Init中实现)
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 2
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg)
- {
- OS_ERR err;
- uint8_t ucCount = 0;
- (void)p_arg;
- bsp_Init();
- CPU_Init();
- BSP_Tick_Init();
-
- #if OS_CFG_STAT_TASK_EN > 0u
- OSStatTaskCPUUsageInit(&err);
- #endif
-
- #ifdef CPU_CFG_INT_DIS_MEAS_EN
- CPU_IntDisMeasMaxCurReset();
- #endif
-
- AppObjCreate();
- AppTaskCreate();
- while (1)
- {
- /* 1ms一次触摸扫描 */
- TOUCH_Scan();
- /* 5ms一次按键检测 */
- ucCount++;
- if(ucCount == 5)
- {
- ucCount = 0;
- bsp_KeyScan();
- }
- BSP_OS_TimeDlyMs(1);
- }
- }
复制代码
45.1.2 AppTaskGUIUpdate—界面截图任务 界面截图任务主要用于界面的截图并将图片以BMP格式保存到SD卡中。 - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUIUpdate
- * 功能说明: 此任务主要实现截图功能.
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 3
- *********************************************************************************************************
- */
- static void AppTaskGUIUpdate(void *p_arg)
- {
- OS_ERR err;
- uint8_t Pic_Name = 0;
- char buf[20];
- CPU_BOOLEAN SemFlag;
-
- (void)p_arg;
-
- while(1)
- {
- SemFlag = BSP_OS_SemWait(&SEM_SYNCH, 0);
- if(SemFlag == DEF_OK)
- {
- sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);
- OSSchedLock(&err);
- /* 如果SD卡中没有PicSave文件,会进行创建 */
- result = f_mkdir("0:/PicSave");
- /* 创建截图 */
- result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);
- /* 向SD卡绘制BMP图片 */
- GUI_BMP_Serialize(_WriteByte2File, &file);
- /* 创建完成后关闭file */
- result = f_close(&file);
- OSSchedUnlock(&err);
- Pic_Name++;
- }
- }
- }
复制代码
45.1.3 AppTaskGUI—GUI任务 这个任务是示波器设计中最重要的任务,代码如下: - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUI
- * 功能说明: GUI任务
- * 形 参:p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级:OS_CFG_PRIO_MAX - 4u
- *********************************************************************************************************
- */
- static void AppTaskGUI(void *p_arg)
- {
- (void)p_arg; /* 避免编译器告警 */
- while (1)
- {
- MainTask();
- }
- }
复制代码
45.1.4 AppTaskGUIRefresh—Led闪烁任务 这个任务主要通过LED的闪烁来指示系统的运行,代码如下: - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUIRefresh
- * 功能说明: Led闪烁任务,表示系统运行
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级: OS_CFG_PRIO_MAX - 5u
- *********************************************************************************************************
- */
- static void AppTaskGUIRefresh(void *p_arg)
- {
- (void)p_arg; /* 避免编译器告警 */
-
- while (1)
- {
- BSP_OS_TimeDlyMs(200);
- bsp_LedToggle(2);
- }
- }
复制代码
45.1.5 其余任务 剩下的两个任务留着以后升级使用。 - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCom
- * 功能说明: 留待以后使用
- * 形 参:p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级:3
- *********************************************************************************************************
- */
- static void AppTaskCOM(void *p_arg)
- {
- (void)p_arg;
-
- while(1)
- {
- /* 100s执行一次 */
- BSP_OS_TimeDlyMs(1000000);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskUserIF
- * 功能说明: 留待以后使用。
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 2
- *********************************************************************************************************
- */
- static void AppTaskUserIF(void *p_arg)
- {
- (void)p_arg; /* 避免编译器报警 */
-
- while (1)
- {
- /* 100s执行一次 */
- BSP_OS_TimeDlyMs(1000000);
- }
- }
复制代码
|
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低通滤波
示波器的框架设计就跟大家讲解这么多,后续后推出示波器的详细设计教程。有兴趣的可以直接看源码即可,源码注释已经比较详细。