STM32/STM8技术论坛
直播中

硬汉Eric2013

10年用户 1035经验值
擅长:嵌入式技术
私信 关注
[经验]

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

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

回帖(8)

硬汉Eric2013

2015-7-22 11:26:45
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—启动任务
启动任务用于硬件驱动的初始化,系统滴答时钟的初始化以及触摸扫描和按键扫描,代码如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskStart
  4. *    功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器(在BSP_Init中实现)
  5. *    形    参: p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7.      优 先 级: 2
  8. *********************************************************************************************************
  9. */
  10. static  void  AppTaskStart (void *p_arg)
  11. {
  12.      OS_ERR   err;
  13.      uint8_t  ucCount = 0;
  14.    
  15.      (void)p_arg;
  16.      bsp_Init();
  17.     CPU_Init();
  18.      BSP_Tick_Init();                       

  19. #if OS_CFG_STAT_TASK_EN > 0u
  20.      OSStatTaskCPUUsageInit(&err);  
  21. #endif

  22. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  23.     CPU_IntDisMeasMaxCurReset();
  24. #endif

  25.     AppObjCreate();                                          
  26.     AppTaskCreate();                                          
  27.     while (1)
  28.      {                                                
  29.          /* 1ms一次触摸扫描 */
  30.          TOUCH_Scan();
  31.         
  32.          /* 5ms一次按键检测 */
  33.          ucCount++;
  34.          if(ucCount == 5)
  35.          {
  36.               ucCount = 0;
  37.               bsp_KeyScan();
  38.          }
  39.          BSP_OS_TimeDlyMs(1);
  40.     }
  41. }

45.1.2  AppTaskGUIUpdate—界面截图任务
界面截图任务主要用于界面的截图并将图片以BMP格式保存到SD卡中。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskGUIUpdate
  4. *    功能说明: 此任务主要实现截图功能.   
  5. *    形    参: p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7.      优 先 级: 3
  8. *********************************************************************************************************
  9. */
  10. static void AppTaskGUIUpdate(void *p_arg)
  11. {
  12.      OS_ERR      err;
  13.      uint8_t       Pic_Name = 0;
  14.      char buf[20];
  15.      CPU_BOOLEAN SemFlag;

  16.      (void)p_arg;
  17.          
  18.      while(1)
  19.      {   
  20.          SemFlag = BSP_OS_SemWait(&SEM_SYNCH, 0);
  21.         
  22.          if(SemFlag == DEF_OK)
  23.          {   
  24.               sprintf(buf,"0:/PicSave/%d.bmp",Pic_Name);
  25.               OSSchedLock(&err);
  26.             
  27.               /* 如果SD卡中没有PicSave文件,会进行创建 */
  28.               result = f_mkdir("0:/PicSave");
  29.               /* 创建截图 */
  30.               result = f_open(&file,buf, FA_WRITE|FA_CREATE_ALWAYS);
  31.               /* 向SD卡绘制BMP图片 */
  32.               GUI_BMP_Serialize(_WriteByte2File, &file);
  33.             
  34.               /* 创建完成后关闭file */
  35.              result = f_close(&file);
  36.             
  37.               OSSchedUnlock(&err);
  38.               Pic_Name++;      
  39.          }                                                                                                                  
  40.      }  
  41. }

45.1.3  AppTaskGUI—GUI任务
这个任务是示波器设计中最重要的任务,代码如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskGUI
  4. *    功能说明: GUI任务                           
  5. *    形    参:p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7. *   优 先 级:OS_CFG_PRIO_MAX - 4u
  8. *********************************************************************************************************
  9. */
  10. static void AppTaskGUI(void *p_arg)
  11. {
  12.     (void)p_arg;       /* 避免编译器告警 */
  13.         
  14.      while (1)
  15.      {
  16.          MainTask();                     
  17.      }
  18. }

45.1.4  AppTaskGUIRefresh—Led闪烁任务
这个任务主要通过LED的闪烁来指示系统的运行,代码如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskGUIRefresh
  4. *    功能说明: Led闪烁任务,表示系统运行                  
  5. *    形    参: p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7. *   优 先 级: OS_CFG_PRIO_MAX - 5u
  8. *********************************************************************************************************
  9. */
  10. static void AppTaskGUIRefresh(void *p_arg)
  11. {
  12.      (void)p_arg;       /* 避免编译器告警 */
  13.          
  14.      while (1)
  15.      {
  16.         BSP_OS_TimeDlyMs(200);
  17.          bsp_LedToggle(2);
  18.     }                           
  19. }

45.1.5  其余任务
剩下的两个任务留着以后升级使用。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskCom
  4. *    功能说明: 留待以后使用     
  5. *    形    参:p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7.      优 先 级:3
  8. *********************************************************************************************************
  9. */
  10. static void AppTaskCOM(void *p_arg)
  11. {   
  12.    (void)p_arg;
  13.       
  14.      while(1)
  15.      {   
  16.          /* 100s执行一次 */
  17.          BSP_OS_TimeDlyMs(1000000);
  18.      }                                                                                                     
  19. }

  20. /*
  21. *********************************************************************************************************
  22. *    函 数 名: AppTaskUserIF
  23. *    功能说明: 留待以后使用。
  24. *    形    参: p_arg 是在创建该任务时传递的形参
  25. *    返 回 值: 无
  26.      优 先 级: 2
  27. *********************************************************************************************************
  28. */
  29. static void AppTaskUserIF(void *p_arg)
  30. {
  31.      (void)p_arg;  /* 避免编译器报警 */

  32.      while (1)
  33.      {  
  34.          /* 100s执行一次 */
  35.         BSP_OS_TimeDlyMs(1000000);      
  36.      }
  37. }

举报

硬汉Eric2013

2015-7-22 14:49:43
45.2  示波器核心任务
    emWin部分是示波器设计的核心任务,主要包括以下几个文件:
                              
45.1.png
下面把这几个文件及其之间的关系做一个简单的说明。

45.2.1        MainTask.c—GUI主任务文件
    这个文件是示波器代码的核心文件,这个文件里面几个函数的关系搞清楚了,示波器的整体设计也就搞清楚了。下面把这个文件里面的几个函数简单的梳理下:
l  函数void MainTask(void)
代码如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: MainTask
  4. *    功能说明: GUI主函数
  5. *    形    参:无         
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void MainTask(void)
  10. {
  11.      /* 开启所有窗口使用内存设备 */
  12.      WM_SetCreateFlags(WM_CF_MEMDEV);
  13.      GUI_Init();
  14.    
  15.      /* 设置皮肤色 *************************************************************/
  16.      PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  17.      FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  18.      PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  19.      BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  20.      CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  21.      DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  22.      SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  23.      SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  24.      HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  25.      RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  26.      MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
  27.    
  28.      /*
  29.      * 设置桌面窗口的回调函数
  30.      */
  31.      WM_SetCallback(WM_HBKWIN, _cbBkWin);
  32.    
  33.      /* 初始化 DSO */
  34.      DSO_Init(1);
  35.    
  36.      /* 波形显示和处理 */
  37.      DSO_Graph();                                                                                                            
  38. }
这个函数里面最主要的就是DSO_Init(1)函数和DSO_Graph()两个函数。
l  函数DSO_Graph
    这个函数是示波器的主函数,示波器任何函数都是通过这个函数直接或者间接的进行调用。这个函数
主要有两个功能,一个是ADC数据的处理并在TFT上显示出来,另一个是按键消息的处理,详细大家看代码即可,代码注释已经比较详细。
l  函数 _Draw
    这个函数通过函数GUI_MEMDEV_Draw进行调用的,主要是实现绘制波形和波形区的虚线方框。
l  函数_cbBkWin
    桌面窗口的回调函数,主要是用于示波器界面右侧8个按钮的回调消息处理,用来打开8个按钮所对应的的对话框。

45.2.2        MainTask.h—所有DSO相关文件的头文件
    这个文件是所以DSO相关文件的头文件,方便各个文件进行调用,代码如下:
  1. /*
  2. *********************************************************************************************************
  3. *                                    
  4. *    模块名称 : GUI各个部分的总头文件
  5. *    文件名称 : MainTask.c
  6. *    版    本 : V1.0
  7. *    说    明 : GUI界面主函数
  8. *    修改记录 :
  9. *        版本号    日期          作者        说明
  10. *        v1.0    2015-01-05    Eric2013      首发
  11. *   
  12. *    Copyright (C), 2015-2016, 安富莱电子 www.armfly.com
  13. *
  14. *********************************************************************************************************
  15. */

  16. #ifndef __MainTask_H
  17. #define __MainTask_H

  18. #include "stdlib.h"
  19. #include "GUI.h"
  20. #include "DIALOG.h"
  21. #include "WM.h"
  22. #include "BUTTON.h"
  23. #include "CHECKBOX.h"
  24. #include "DROPDOWN.h"
  25. #include "EDIT.h"
  26. #include "FRAMEWIN.h"
  27. #include "LISTBOX.h"
  28. #include "MULTIEDIT.h"
  29. #include "RADIO.h"
  30. #include "SLIDER.h"
  31. #include "TEXT.h"
  32. #include "PROGBAR.h"
  33. #include "SCROLLBAR.h"
  34. #include "LISTVIEW.h"
  35. #include "GRAPH.h"
  36. #include "MENU.h"
  37. #include "MULTIPAGE.h"
  38. #include "ICONVIEW.h"
  39. #include "TREEVIEW.h"
  40. #include "MESSAGEBOX.h"

  41. #include "ff.h"
  42. #include "diskio.h"

  43. #include "arm_math.h"
  44. #include "arm_const_structs.h"

  45. /*
  46. *********************************************************************************************************
  47. *                                      宏定义
  48. *********************************************************************************************************
  49. */                                 
  50. #define LCD_YSIZE 480
  51. #define LCD_XSIZE 630

  52. /* 定义波形的显示界面区域 600*400 */
  53. #define DSOSCREEN_STARTX     40     /* 波形显示的X起始位置 */
  54. #define DSOSCREEN_STARTY     40      /* 波形显示的Y起始位置 */
  55. #define DSOSCREEN_ENDX      639     /* 波形显示的X结束位置 */
  56. #define DSOSCREEN_ENDY      439     /* 波形显示的Y结束位置 */
  57. #define DSOSCREEN_LENGTH    600     /* 波形显示的Y结束位置 */

  58. #define ATT_COUNT          10      /* 定义支持的10种幅值单位 */

  59. #define TIME_COUNT         21      /* 定义支持的21种采样率 */

  60. #define WM_TextUpDate  WM_USER + 1  /* 自定义一个回调函数的消息,用于界面数据的更新 */

  61. /*
  62. *********************************************************************************************************
  63. *                                      变量
  64. *********************************************************************************************************
  65. */
  66. extern const char *g_AttText[];                  /* 10种幅度单位 */
  67. extern const char *g_TimeTable[];                /* 采样率,从2Msps到1Ksps 对应的时基 */
  68. extern const char *g_MeasureTable[];             /* 示波器当前实际支持的测量值 */
  69. extern const uint16_t g_CursorUintTable[][2];    /* 测量游标数据显示格式 */
  70. extern const uint16_t g_AttTable[ATT_COUNT][2];  /* 采样率衰减倍数表 */

  71. extern GUI_RECT rClient;       /* 用于显示示波器的logo */
  72. extern GUI_RECT rRunMode;      /* 用于显示运行状态,运行和暂停 */
  73. extern GUI_RECT rTrigMode;     /* 用于显示触发模式,自动触发和正常触发 */
  74. extern GUI_RECT rTrigValue;    /* 用于显示自动和正常的触发数组 */
  75. extern GUI_RECT rButState;     /* 当前按键需要调节的状态 */
  76. extern GUI_RECT rRefPos;       /* 示波器最左侧波形参考的位置区域 */
  77. extern GUI_RECT rTrigPos;      /* 6KB数据查询  */

  78. extern const GUI_POINT aPointsTrigBrowser[3];  /* 6k数据中,波形显示的起始位置 */
  79. extern const GUI_POINT aPointsTrig[7];         /* 波形显示区右侧边上触发值箭头 */
  80. extern const GUI_POINT aPoints[5];             /* 波形显示区左侧边上波形显示的参考位置 */

  81. extern uint8_t  g_ucLineStyle;  /* 默认是实线绘制波形 */
  82. extern int8_t  Ch1AmpId;        /* 从g_AttText中选择每个方格表示的幅值 */           
  83. extern int8_t  TimeBaseId;      /* 选择相应采样率 */

  84. extern uint8_t g_ucMeasureFlag[30];  /* 示波器支持的30种测量值标志 */

  85. /* 存储平均值,峰峰值,频率,最小值和最大值的变量 */
  86. extern float32_t   g_WaveMean;
  87. extern float32_t   g_WavePkPk;
  88. extern float32_t   g_WaveFreq;
  89. extern float32_t   g_WaveMax;
  90. extern float32_t   g_WaveMin;

  91. /* 用于水平测量和垂直测量游标,下面是初始化的默认值 */
  92. extern uint16_t g_usCursorStep;
  93. extern int16_t  g_sCursorHA;
  94. extern int16_t  g_sCursorHB;
  95. extern int16_t  g_sCursorVA;
  96. extern int16_t  g_sCursorVB;
  97. extern float32_t  g_WaveCursorA;
  98. extern float32_t  g_WaveCursorB;

  99. extern uint8_t hWinRunStopFlag;  /* 0:表示运行,1:表示暂停 */

  100. extern uint16_t TriggerFlag;     /* 0:用于自动触发,1,2:用于普通触发 */

  101. /* 用于水平测量和垂直测量游标 */
  102. extern uint16_t  g_usTriPos;   
  103. extern uint16_t  g_usTriStep;
  104. extern int16_t   g_usCurTriPos;
  105. extern int16_t   g_usCurTriStep;
  106. extern float32_t g_ufTrigValue;
  107. extern uint16_t  g_usTrigValue;
  108. extern uint32_t  g_ulTrigTimeLine;


  109. extern uint16_t  g_usRefPos;          /* 左侧的参考位置,默认开机后是中间位置 */
  110. extern uint8_t hWinButStateFlag;      /* 8种按键功能状态 */
  111. extern uint16_t g_usWaveBuf[1024*6];  /* 示波器缓存 */
  112. extern uint16_t g_usWaveBuf1[1024*6];

  113. extern uint8_t hWinCoursorFlag;     /* 0:不显示测量窗口,1:显示测量窗口 */
  114. extern uint8_t  g_ucFFTDispFlag;    /* FFT波形显示,0:表示显示,1:表示不显示 */
  115. extern uint8_t  g_ucFirFlter_Step100KHz;   /* 0:表示不执行滤波,1:表示100KHz,2:表示200KHz,,以此类推 */
  116. extern uint8_t  g_ucFirFlter_Step10KHz;    /* 0:表示不执行滤波,1:表示10KHz, 2:表示20KHz,,以此类推 */
  117. extern uint8_t  g_ucFirFlter_Step1KHz;     /* 0:表示不执行滤波,1:表示1KHz,  2:表示2KHz,,以此类推 */
  118. extern uint8_t  g_ucWaveRefreshFlag;       /* 0:表示不执行波形区域的刷新,1:表示执行波形区域的刷新 */
  119. /*
  120. *********************************************************************************************************
  121. *                                      fatfs
  122. *********************************************************************************************************
  123. */
  124. /* 供外部文件调用的fatfs变量 */
  125. extern FRESULT result;
  126. extern FIL file;
  127. extern FILINFO finfo;
  128. extern DIR DirInf;
  129. extern UINT bw;
  130. extern FATFS fs;
  131. extern FATFS fs_nand;
  132. extern FATFS fs_u***;
  133. extern char *_acBuffer2;

  134. /* BMP图片生成 */
  135. extern void _WriteByte2File(U8 Data, void * p);

  136. /* 用于BMP图片的显示 */
  137. uint8_t  _ShowBMP(const char * sFilename);

  138. /*
  139. *********************************************************************************************************
  140. *                                      窗口句柄
  141. *********************************************************************************************************
  142. */
  143. extern WM_HWIN hWinAmp;         /* 用于显示幅度的窗口 */
  144. extern WM_HWIN hWinStatus;      /* 用于显示频率,平均值,峰峰值,最大值等信息 */
  145. extern WM_HWIN hWinScale;       /* 用于显示采样率 */

  146. /* 8个按钮句柄 */
  147. extern BUTTON_Handle hButton0;
  148. extern BUTTON_Handle hButton1;
  149. extern BUTTON_Handle hButton2;
  150. extern BUTTON_Handle hButton3;
  151. extern BUTTON_Handle hButton4;
  152. extern BUTTON_Handle hButton5;
  153. extern BUTTON_Handle hButton6;
  154. extern BUTTON_Handle hButton7;

  155. /*
  156. *********************************************************************************************************
  157. *                                      供外部文件调用的函数
  158. *********************************************************************************************************
  159. */
  160. /* 创建幅度,时基和状态窗口 */
  161. extern WM_HWIN CreateWindowAmplitude(void);
  162. extern WM_HWIN CreateWindowScale(void);
  163. extern WM_HWIN CreateWindowStatus(void);

  164. /* 示波器界面初始化 */
  165. extern void DSO_Init(uint8_t ucCreateFlag);

  166. /* 按钮创建的对话框 */
  167. extern WM_HWIN DSO_CreateMeasureDlg(void);
  168. extern WM_HWIN DSO_CreateInspectorDlg(void);
  169. extern WM_HWIN DSO_CreateAcquireDlg(void);
  170. extern WM_HWIN DSO_CreateTrigerDlg(void);
  171. extern WM_HWIN DSO_CreateMathDlg(void);
  172. extern WM_HWIN DSO_CreateSettingsDlg(void);
  173. extern WM_HWIN DSO_CreateDacDlg(void);
  174. extern WM_HWIN DSO_CreateReturnDlg(void);

  175. /* 示波器界面绘制 */
  176. extern void DSO_DrawBakFrame(void);
  177. extern void DSO_DrawCursorH(void);
  178. extern void DSO_DrawCursorV(void);

  179. /* Fir 滤波 */
  180. extern void DSO_FirFilter_Step100KHz(void);
  181. extern void DSO_FirFilter_Step10KHz(void);
  182. extern void DSO_FirFilter_Step1KHz(void);
  183. #endif

  184. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

45.2.3        App_SysFunction.c—界面截图
    这个文件主要是示波器界面截图。实现截图的主要函数如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: _WriteByte2File()
  4. *    功能说明: 写文件到SD卡或者其他存储介质
  5. *    形    参:Data 要写的数据, p 指向FIL类型变量     
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void _WriteByte2File(U8 Data, void * p)
  10. {
  11.      result = f_write (p, &Data, 1, &bw);
  12. }
这个函数是被emWin函数GUI_BMP_Serialize所调用。

45.2.4        DSO_Init.c—初始化
    这个文件里面的函数DSO_Init()主要是实现示波器整个界面的初始化,初始化内容如下:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DSO_Init
  4. *    功能说明: 示波器主界面初始化
  5. *    形    参:ucCreateFlag  1:表示需要创建按键和窗口等。
  6. *                           0:不需要创建。
  7. *    返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. void DSO_Init(uint8_t ucCreateFlag)
  11. {
  12.      char buf[10];
  13.      uint32_t ulTrigPos;
  14.    
  15.    
  16.      /* 第1步:刷新背景*********************************************************************/
  17.      GUI_SetBkColor(0x905040);
  18.      GUI_Clear();
  19.    
  20.      /* 第2步:显示基本的信息***************************************************************/
  21.     GUI_SetColor(GUI_WHITE);
  22.     GUI_SetFont(&GUI_Font8x16x1x2);
  23.      GUI_DispStringInRect("Eric2013", &rClient, GUI_TA_HCENTER | GUI_TA_VCENTER);
  24.    
  25.       /* 按键K2 :设置波形显示运行或暂停 */
  26.      if(hWinRunStopFlag == 0)
  27.      {
  28.          GUI_DispStringInRect("Run", &rRunMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
  29.      }
  30.      else
  31.      {
  32.          GUI_DispStringInRect("Stop", &rRunMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
  33.      }
  34.    
  35.      /* 按键K3 :设置普通触发方式或自动触发 */
  36.      if(TriggerFlag == 0)
  37.      {
  38.          GUI_DispStringInRect("Auto", &rTrigMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
  39.      }
  40.      else
  41.      {
  42.          GUI_DispStringInRect("Trig", &rTrigMode, GUI_TA_HCENTER | GUI_TA_VCENTER);
  43.      }
  44.    
  45.      /* 第3步:显示自动触发的触发电压**********************************************************/
  46.      g_ufTrigValue = 240 - g_usTriPos;
  47.      g_ufTrigValue = g_ufTrigValue * g_AttTable[Ch1AmpId][1] / 50000;
  48.      sprintf(buf, "%5.3fV", g_ufTrigValue);
  49.    
  50.      GUI_DispStringInRect(buf, &rTrigValue, GUI_TA_HCENTER | GUI_TA_VCENTER);
  51.    
  52.      /* 显示上升沿触发的标志 */
  53.      GUI_DrawHLine(rTrigValue.y1-10, rTrigValue.x0+10, rTrigValue.x0 + 19);
  54.      GUI_DrawLine(rTrigValue.x0 + 19, rTrigValue.y1-10, rTrigValue.x0+30, rTrigValue.y0+8);
  55.      GUI_DrawHLine(rTrigValue.y0+8, rTrigValue.x0+31, rTrigValue.x0 + 41);
  56.    
  57.      /* 第4步:设置摇杆按键的调节状态,并将其显示出来******************************************/
  58.      if(hWinButStateFlag == 0)
  59.      {
  60.          GUI_DispStringInRect("ChangeSampleFreq", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  61.      }
  62.      else if(hWinButStateFlag == 1)
  63.      {
  64.          GUI_DispStringInRect("ChangeAmplitude", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  65.      }
  66.      else if(hWinButStateFlag == 2)
  67.      {
  68.          GUI_DispStringInRect("ChangeRefPos", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  69.      }
  70.      else if(hWinButStateFlag == 3)
  71.      {
  72.          GUI_DispStringInRect("ChangeCursorVA", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  73.      }
  74.      else if(hWinButStateFlag == 4)
  75.      {
  76.          GUI_DispStringInRect("ChangeCursorVB", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  77.      }
  78.      else if(hWinButStateFlag == 5)
  79.      {
  80.          GUI_DispStringInRect("ChangeCursorHA", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  81.      }
  82.      else if(hWinButStateFlag == 6)
  83.      {
  84.          GUI_DispStringInRect("ChangeCursorHB", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  85.      }
  86.      else if(hWinButStateFlag == 7)
  87.      {
  88.          GUI_DispStringInRect("ChangeTrigger", &rButState, GUI_TA_HCENTER | GUI_TA_VCENTER);
  89.      }
  90.    
  91.     /* 第5步:实现波形的放缩***************************************************************/
  92.      GUI_SetBkColor(GUI_BLACK);
  93.      GUI_ClearRect(210, 6, 470, 33);
  94.      GUI_SetColor(GUI_YELLOW);
  95.      GUI_DrawHLine(20,220, 220+239);
  96.      GUI_DrawHLine(21,220, 220+239);
  97.    
  98.      GUI_SetColor(0x0040f0);
  99.    
  100.      /* 自动触发模式 */
  101.      if(TriggerFlag == 0)
  102.      {
  103.          ulTrigPos = (g_usCurTriStep + g_usCurTriPos) * 240;
  104.      }
  105.      /* 普通触发模式 */
  106.      else
  107.      {
  108.          ulTrigPos = (2772 + g_usCurTriStep)*240;
  109.      }
  110.    
  111.      /* 根据上面求得数据的触发位置来更新屏上的触发图标位置 */
  112.      ulTrigPos = ulTrigPos / 6144;   
  113.      GUI_FillPolygon(&aPointsTrigBrowser[0], GUI_COUNTOF(aPointsTrigBrowser), ulTrigPos+220, 13);
  114.    
  115.      /* 记录专门的触发位置 */
  116.      GUI_SetColor(GUI_RED);
  117.      GUI_DrawPixel(326, 20);
  118.      GUI_DrawPixel(326, 21);
  119.    
  120.      GUI_DrawPixel(327, 20);
  121.      GUI_DrawPixel(327, 21);
  122.    
  123.      GUI_DrawPixel(328, 20);
  124.      GUI_DrawPixel(328, 21);
  125.    
  126.      GUI_DrawPixel(329, 20);
  127.      GUI_DrawPixel(329, 21);
  128.    
  129.      GUI_DrawPixel(330, 20);
  130.      GUI_DrawPixel(330, 21);

  131.      /* 第6步:波形显示区的边框*************************************************************/
  132.      GUI_SetColor(0XEBCD9E);
  133.      GUI_DrawRect(DSOSCREEN_STARTX - 1,   /* Upper left X-position. */
  134.                     DSOSCREEN_STARTY - 1,  /* Upper left Y-position. */
  135.                    DSOSCREEN_ENDX + 1,    /* Lower right X-position. */
  136.                    DSOSCREEN_ENDY + 1);   /* Lower right Y-position. */

  137.      GUI_SetColor(0XB37F63);
  138.      GUI_DrawRect(DSOSCREEN_STARTX - 2,   /* Upper left X-position. */
  139.                     DSOSCREEN_STARTY - 2,  /* Upper left Y-position. */
  140.                    DSOSCREEN_ENDX + 2,    /* Lower right X-position. */
  141.                    DSOSCREEN_ENDY + 2);   /* Lower right Y-position. */
  142.                     
  143.      /* 根据需要是否需要重新创建按键和窗口 */
  144.      if(ucCreateFlag == 1)
  145.      {
  146.          /* 第7步:创建状态窗口*************************************************************/
  147.          hWinAmp = CreateWindowAmplitude();
  148.          hWinStatus = CreateWindowStatus();
  149.          hWinScale = CreateWindowScale();
  150.         
  151.          /*
  152.           * 创建定时器,其功能是经过指定周期后,向指定窗口发送消息。
  153.           * 该定时器与指定窗口相关联。
  154.           */
  155.          WM_CreateTimer(hWinStatus,   /* 接受信息的窗口的句柄 */
  156.                           0,             /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
  157.                           500,          /* 周期,此周期过后指定窗口应收到消息*/
  158.                           0);            /* 留待将来使用,应为0 */

  159.         
  160.          /* 第6步:创建需要的按钮*************************************************************/
  161.          hButton0 = BUTTON_Create(670, 40, 100, 45, GUI_ID_BUTTON0, WM_CF_SHOW);
  162.          BUTTON_SetText(hButton0, "Measure");
  163.          BUTTON_SetFont(hButton0, &GUI_Font20B_ASCII);

  164.          hButton1 = BUTTON_Create(670, 90, 100, 45, GUI_ID_BUTTON1, WM_CF_SHOW);
  165.          BUTTON_SetText(hButton1, "Inspector");
  166.          BUTTON_SetFont(hButton1, &GUI_Font20B_ASCII);

  167.          hButton2 = BUTTON_Create(670, 140, 100, 45, GUI_ID_BUTTON2, WM_CF_SHOW);
  168.          BUTTON_SetText(hButton2, "Acquire");
  169.          BUTTON_SetFont(hButton2, &GUI_Font20B_ASCII);
  170.         
  171.          hButton3 = BUTTON_Create(670, 190, 100, 45, GUI_ID_BUTTON3, WM_CF_SHOW);
  172.          BUTTON_SetText(hButton3, "Trigger");
  173.          BUTTON_SetFont(hButton3, &GUI_Font20B_ASCII);

  174.          hButton4 = BUTTON_Create(670, 240, 100, 45, GUI_ID_BUTTON4, WM_CF_SHOW);
  175.          BUTTON_SetText(hButton4, "Math");
  176.          BUTTON_SetFont(hButton4, &GUI_Font20B_ASCII);
  177.         
  178.          hButton5 = BUTTON_Create(670, 290, 100, 45, GUI_ID_BUTTON5, WM_CF_SHOW);
  179.          BUTTON_SetText(hButton5, "Settings");
  180.          BUTTON_SetFont(hButton5, &GUI_Font20B_ASCII);

  181.          hButton6 = BUTTON_Create(670, 340, 100, 45, GUI_ID_BUTTON6, WM_CF_SHOW);
  182.          BUTTON_SetText(hButton6, "DAC");
  183.          BUTTON_SetFont(hButton6, &GUI_Font20B_ASCII);
  184.         
  185.          hButton7 = BUTTON_Create(670, 390, 100, 45, GUI_ID_BUTTON7, WM_CF_SHOW);
  186.          BUTTON_SetText(hButton7, "Return");
  187.          BUTTON_SetFont(hButton7, &GUI_Font20B_ASCII);
  188.      }
  189.    
  190.      /* 第8步:显示参考坐标*************************************************************/
  191.      GUI_SetColor(GUI_YELLOW);
  192.      GUI_FillPolygon(&aPoints[0], GUI_COUNTOF(aPoints), 5, g_usRefPos);
  193.    
  194.      GUI_SetColor(GUI_BLACK);
  195.     GUI_SetFont(&GUI_Font24_ASCII);
  196.      GUI_SetTextMode(GUI_TEXTMODE_TRANS);                  
  197.      GUI_DispCharAt('1', 10, g_usRefPos - 10);
  198. }

45.2.5        DSO_MeasureDlg.c—测量对话框
    这个文件主要用创建如下对话框:
45.2.png


举报

硬汉Eric2013

2015-7-22 14:52:35
45.2.6        DSO_InspectorDlg.c—对话框
这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
                              
45.3.png
45.2.7        DSO_AcquireDlg.c—对话框
这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.4.png
45.2.8        DSO_TriggerDlg.c—对话框
这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.5.png
45.2.9        DSO_MathDlg.c—Fir低通滤波器设置对话框
这个文件主要用于Fir低通滤波器的截止频率配置,创建对话框如下:
45.6.png
45.2.10        DSO_SettingsDlg.c—设置对话框
这个文件主要用于设置对话框的创建。
45.7.png

举报

硬汉Eric2013

2015-7-22 14:54:55
45.2.11        DSO_DacDlg.c—对话框
这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.8.png
                              
45.2.12        DSO_ReturnDlg.c—对话框
这个文件主要用创建如下对话框,此文件实现的对话框还未开发,留待以后升级使用:
45.9.png
45.2.13        DSO_DrawBakFrame.c—绘制波形区的虚线方格
这个文件用于创建如下虚线方格(不包括波形显示):
45.10.png
45.2.14        DSO_DrawCursorH.c—水平测量游标
这个文件用于创建如下水平测量游标:
45.11.png
45.2.15        DSO_DrawCursorV.c—垂直测量游标
这个文件用于创建如下垂直测量游标:
45.12.png

举报

硬汉Eric2013

2015-7-22 14:57:05
45.2.16         DSO_AmplititudeWindow.c—幅值窗口
    这个文件用于创建如下窗口:
45.13.png

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



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



45.2.19        DSO_FirFilter_Step1KHz—Fir低通滤波


45.2.20        DSO_FirFilter_Step10KHz—Fir低通滤波

45.2.21        DSO_FirFilter_Step100KHz—Fir低通滤波
    上面的三项主要用于Fir低通滤波器的实现。


举报

硬汉Eric2013

2015-7-22 14:58:41
45.3  DAC实现方波的输出
    DAC输出方波的配置要注意初始化的顺序,顺序错误了,方波是无法输出的,还有就是不用的MDK优化等级,DAC配置时的顺序也不一样,这个应该是DAC库的一个bug。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_InitDAC
  4. *    功能说明: DAC初始化
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_InitDAC(void)
  10. {  
  11.     uint8_t i;

  12.      /* 用缓存放一个周期的方波 */
  13.      for(i =0; i < 32; i++)
  14.      {
  15.          g_usWaveBuff[i] = 0;
  16.      }
  17.    
  18.      for(i =0; i < 32; i++)
  19.      {
  20.          g_usWaveBuff[i+32] = 2048;
  21.      }
  22.    
  23.      /* MDK优化等级为1的时候,DAC初始化顺序,不同的优化等级,
  24.         不同的输出顺序容易操作DAC无法输出波形。
  25.         这个问题要引起大家的特别注意!!。
  26.      */
  27.      DAC_Ch1_WaveConfig();
  28.      DAC_GPIOConfig();
  29.     TIM6_Config();
  30. }

举报

硬汉Eric2013

2015-7-22 14:59:56
45.4  ADC实现数据的采集
    ADC的驱动主要注意两个问题,一个是ADC数据采集的关闭或者开启一定要保证同步,要不会出现采集数据的混乱,还有就是由于没有使用官方的3ADC快速交替采样,官方的快速交替采用使用定时器触发采集出的数据效果不好,抖动较大(特别是使用定时改变不同的采样频率时) 。现在采用的每个ADC都是用定时器单独的触发,并把触发数据分开,分成三等分,每个时刻实现一个ADC的触发。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: TIM1_Config
  4. *    功能说明: 配置定时器1,用于触发ADC1,ADC2和ADC3。
  5. *             当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。
  6. *    形    参: 无
  7. *    返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. static void TIM1_Config(void)
  11. {
  12.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  13.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  14.    
  15.      /* 使能定时器1 */
  16.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
  17.    
  18.      /* 先禁能再配置 */
  19.     TIM_Cmd(TIM1, DISABLE);
  20.    
  21.     /*
  22.      ********************************************************************************
  23.     system_stm32f4xx.c 文件中 void SetSysClock(void) 函数对时钟的配置如下:

  24.     HCLK = SYSCLK / 1     (AHB1Periph)
  25.     PCLK2 = HCLK / 2      (APB2Periph)
  26.     PCLK1 = HCLK / 4      (APB1Periph)

  27.     因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
  28.     因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 = SystemCoreClock;

  29.     APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
  30.     APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
  31.          
  32.     TIM1 更新周期是 = TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1)
  33.     ********************************************************************************
  34.     */
  35.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);        //初始化定时器1的寄存器为复位值
  36.     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时间分割值
  37.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //CR1->CMS[1:0]和DIR定时器模式 向上计数
  38.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  39.     /**************ADC1的触发***********************************************/
  40.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //CCER 输出使能         
  41.     TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/3;    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;       //CCER输出极性设置
  42.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  43.    
  44.       /**************ADC2的触发***********************************************/
  45.      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                  
  46.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     
  47.     TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period*2/3;
  48.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;      
  49.     TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  50.    
  51.      /**************ADC3的触发***********************************************/
  52.      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                  
  53.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   
  54.     TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period-1;
  55.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;      
  56.     TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  57.     //TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);      //CMR2 设置预装载使能  更新事件产生时写入有效
  58.     //TIM_ARRPreloadConfig(TIM1, ENABLE);                    //CR1  设置ARR自动重装 更新事件产生时写入有效
  59.     TIM_Cmd(TIM1, ENABLE);
  60.    
  61.     /* 使能PWM输出 */
  62.     TIM_CtrlPWMOutputs(TIM1, ENABLE);         
  63. }

下面是DMA的开启和关闭,一定要保证按照如下的顺序进行,且这些函数不能省略一个,要不重新开启DMA数据将无法再次传输。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: DMA_Open
  4. *    功能说明: 使能ADC1,ADC2,ADC3的DMA
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void ADC_DMA_Open(void)
  10. {
  11.     DMA_InitTypeDef       DMA_InitStructure;

  12.      /* DMA2 Stream1 channel1 配置用于ADC3 **************************************/
  13.     DMA_DeInit(DMA2_Stream1);
  14.      DMA_InitStructure.DMA_Channel = DMA_Channel_2;
  15.      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  16.      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
  17.      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  18.      DMA_InitStructure.DMA_BufferSize = 1024*10;
  19.      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  20.      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  21.      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  22.      DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
  23.      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  24.      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  25.      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;        
  26.      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  27.      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  28.      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  29.      DMA_Init(DMA2_Stream1, &DMA_InitStructure);
  30.     DMA_Cmd(DMA2_Stream1, ENABLE);
  31.    
  32.      /* DMA2 Stream2 channel1 配置用于ADC2 **************************************/
  33.     DMA_DeInit(DMA2_Stream2);  /* 在DMA的DMA_Mode_Normal模式,一定要使用这个函数,循环模式可以不用 */
  34.      DMA_InitStructure.DMA_Channel = DMA_Channel_1;
  35.      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC2_DR_ADDRESS;
  36.      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC2ConvertedValue;
  37.      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  38.      DMA_InitStructure.DMA_BufferSize = 1024*10;
  39.      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  40.      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  41.      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  42.      DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
  43.      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  44.      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  45.      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;        
  46.      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  47.      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  48.      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  49.      DMA_Init(DMA2_Stream2, &DMA_InitStructure);
  50.     DMA_Cmd(DMA2_Stream2, ENABLE);
  51.    
  52.      /* DMA2 Stream0 channel0 配置用于ADC1 **************************************/
  53.     DMA_DeInit(DMA2_Stream0);
  54.      DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  55.      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
  56.      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue;
  57.      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  58.      DMA_InitStructure.DMA_BufferSize = 1024*10;
  59.      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  60.      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  61.      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  62.      DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
  63.      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  64.      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  65.      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;        
  66.      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  67.      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  68.      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  69.      DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  70.     DMA_Cmd(DMA2_Stream0, ENABLE);

  71.      ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);

  72.      /* 使能 ADC3 --------------------------------------------------------------*/
  73.      ADC_Cmd(ADC3, ENABLE);
  74.    
  75.      ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);

  76.      /* 使能 ADC2 --------------------------------------------------------------*/
  77.      ADC_Cmd(ADC2, ENABLE);
  78.    
  79.      ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);

  80.      /* 使能 ADC1 --------------------------------------------------------------*/
  81.      ADC_Cmd(ADC1, ENABLE);

  82.      /**定时器配置,一定要重新的初始化从而保证同时触发 **/
  83.      TIM1_Config();

  84.      /* 只有在普通触发模式在启动TIM8的计时功能 */
  85.      if(TriggerFlag != 0)
  86.      {
  87.          Time8Recorder();
  88.      }
  89. }

  90. /*
  91. *********************************************************************************************************
  92. *    函 数 名: DMA_Close
  93. *    功能说明: 关闭ADC1,ADC2,ADC3及其DMA
  94. *    形    参: 无
  95. *    返 回 值: 无
  96. *********************************************************************************************************
  97. */
  98. void ADC_DMA_Close()
  99. {
  100.      TIM_Cmd(TIM1, DISABLE);
  101.    
  102.      DMA_Cmd(DMA2_Stream1, DISABLE);
  103.    
  104.      DMA_Cmd(DMA2_Stream0, DISABLE);
  105.    
  106.      DMA_Cmd(DMA2_Stream2, DISABLE);
  107.    
  108.      /* 禁止 ADC1 ---------------------------------------------------------------------*/
  109.      ADC_Cmd(ADC1, DISABLE);

  110.      /* 禁止 ADC2 ---------------------------------------------------------------------*/
  111.      ADC_Cmd(ADC2, DISABLE);
  112.    
  113.      /* 禁止 ADC3 ---------------------------------------------------------------------*/
  114.      ADC_Cmd(ADC3, DISABLE);
  115. }

举报

硬汉Eric2013

2015-7-22 15:00:37
45.5  总结
    示波器的框架设计就跟大家讲解这么多,后续后推出示波器的详细设计教程。有兴趣的可以直接看源码即可,源码注释已经比较详细。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分