第32卷第6期电子器件Vo1. 32 No.6 2009年12月Chinese JournalαElectron Devi回SDec.2009 The Design and Implementation of Virtual Oscillograph ßased on STM32铸DING Hongbin ,QIN Huibin铃,SUNShunyuan (Institute of Electron Device & Applicati棚•Hangzhou Dianzi University. Hangzhou 310018.αina) Abstract: U sing the STM32 MCU based on ARM Cortex-M3 as the core, the design and the detailed imple-mentation methods of a virtual oscillograph was presented through the USB interface, and the external sig-nal conditioning, collection, pretreatment and data transmission were achieved. Meanwhile, the USB drive and host computer applications were developed to realize a virtual oscilloscope data transmission, display and other basic functions Key words: ST孔132F103 x; USB; virtual oscillograph; dri verstudio; DDK EEACC: 7250G 基于STM32的虚拟示波器的设计与实现铃丁红斌,秦会斌铃,孙顺远(杭州电子科技大学新型电子器件与应用研究所,杭州310018)摘要:基于ARMCortex-M3内核的STM32微控制器为核心,介绍了通过USB接口进行数据传输的虚拟示波器的设计方案和具体实现方法。完成了对外部信号的调理、采集、预处理和数据传输,同时,对USB驱动及上位机应用程序进行了开发,实现了虚拟示波器数据传输、显示等基本功能。关键词:虚拟示波器;STM32F1 03x; USB; DriverStudio,DDK 中圈分类号:TN935.3文献标识码:文章编号:1005-9490(2009)06-1007-04示波器是电子测量行业最常用的测量仪器之计,有效地降低了系统接口的复杂度和系统开发的难一,主要用来测量并显示被测信号的波形等参数,在度田,在很大程度上提高了系统的稳定性。同时,结很多领域得到广泛的应用。虚拟示波器突破了传统合基于VC++开发平台对信号进行存储和显示。该示波器的性能局限,在功能和应用性上发生了根本系统体积小巧、简单易用,能够实现1MHz的采样速性变化。虚拟示波器不仅实现了传统示波器的功能,度,与PC机通信的最高速率达到1Mbyte/s。而且利用功能强大的微型计算机来完成信号的分析、处理,利用软件技术在屏幕上设计出逼真的仪器面板1 系统硬件设计并显示各种特征图形。计算机功能最大化地服务于根据系统的功能需求,系统结构图如图1所示,虚拟仪器,使仪器功能得到充分发展和完善归。主要包括:信号输入接口模块、信号调理模块、数据系统采用意法半导体公司开发的基于Cortex采集及缓存模块、USB2.0通信模块等[3J。工作流M3内核的新型32位微控制器S)'M32F103x作为程如下:系统通过USB接口接到主机上后获得5V主控芯片。该芯片内部集成了全速USB2.0设备接电源,微控制器STM32对硬件设备进行初始化,并口模块和16通道的12位高精度A/D转换器,单通过内部USB硬件控制器来完成USB设备的枚举芯片即可完成设计任务,避免了复杂的接口电路设工作。A/D转换器是通过定时器来触发采样的,以收稿日期:2009-08-15 修改日期:2009-09-10项目来源:浙江省自然科学基金资助(Y407133)作者简介:丁红斌(1985今,男,云南曲靖人,杭州电子科技大学在读研究生,硕士,电路与系统专业,从事新型电子器件设计及应用.ding_hongbin@163.com; 秦会斌(1961-).男,教授,博士生导师,从事新型材料与器件、抗电磁干扰技术研究。1008 电子器件第32卷保证其以恒定的时间间隔对模拟信号进行模数转换,在完成规定长度的采集工作之后,将数据存入高速数据存储器中(RAM)。在规定的触发条件满足时,数据采集系统中的控制电路使能DMA通道,将A/D所采集的数据传输至USB的缓冲区中,由USB接口电路将这些数据传输给上位机。信号输入及调理模块主要完成信号衰减,程控放大,叠加直流分量。衰减电路是为了保证在较大的信号输入时,能够在A/D采样的范围之内,避免回显时造成信号的失真或是损坏元器件。程控放大电路是将待测的小信号进行放大,血模拟开关CD1051、运放NE5532和可变电阻器构成,并通过MCU切换放大倍数,电路如图2所示。数据采集及缓存模块和USB2.0通信模块是由微控制器STM32F103x独自实现的。由于MCU内部自带的A/D无法对负电压进行采集,而待测信号往往又带有负压,这时需要电路将负压抬高到O电平以上,如图3所示。控制放大倍数图1系统硬件原理框图图2程控放大电路图3电压提升电路为了使示波器工作在触发模式,使A/D采样的波形能够稳定的显示,系统中需要有个触发电平,这里的触发电平由迟滞比较电路产生,如图4所示。且矗图4迟滞比较电路2 系统软件设计2.1 固件程序的开发设备的固件程序设计主要包括:系统时钟的配置、ADC模块配置、定时器模块配置和USB模块配置。总体流程如图5所示。图5系统总体程序流程图意法半导体公司针对ARM的32位STM32F103x系列MCU提供了固件库。该固件库提供了包括ADC在内的各种功能模块的软件使用接口,使用该固件库可以有效节省用户产品的开发和调试时间。利用该库,本设计中ADC的配置代码如下:AIX二InitStructure.ADC Mode = ADC Mode Inde-pendent; ADC_InitStructure. ADC_ScanConvMode= DISABLE; ADC InitStructure. AIX二ContinuousConvMode= DISA BLE; ADC _ lnitStructure. ADC _ ExternalTrigConv = ADC_ ExtemalTrigCon飞T2一CC2,ADC_lnitStructure. ADC_DataAlign = ADC_DataAlign_ 第6期丁红斌,秦会斌等:基于STM32的虚拟示波器的设计与实现1009 Right; 英文版的,可以减少不知名的错误。在DriverStuAIX二InitStructure.AOC _N brOfChannel = 1 ; AOC_InitCAOCldio安装过程中,选择安装其中的DriverWorks、, &AOC_InitStructure); Tools和SoftICE工具。DriverStudio安装之后,在根据USB2.0协议,当USB插入USB总线时,Visual C+十6.0编程工具栏里自动添加了一个菜USB控制器会自动为该USB设备分配一个数字来单DriverStudio。必须注意到.DriverStudio选项标示这个设备。另外,在设备的每个端点都有一个卡下面第三项DDKsetting要设置成C:\\数字来表明这个端点。USB设备驱动向USB控制Build WINDDK\\2600(如果DDK安装在C盘).然后要编器驱动请求的每次传输被称为一个事务(Transac译DriverStudio安装目录下DriverStudio\\Drivertion) .事务有四种类型,分别是BulkTransaction、Control Works\\source\\VdwLibs. dsw.以得到vdw_wdm.Transaction、InterruptTransaction和1-sochronous lib这个库文件。编译的时候会出现错误,因为用Transaction。每次事务都会分解成若干个数据包在USB总线上传输。每次传输必须历VC打开vdwlibs.dsw工程文件后,有两个工程,要先将VdwLibs工程设为当前Acti经两个或三个部分,第一部分是USB控制器向ve Proj ect .然后在工具栏上单击右键选择\"Build\",在弹出的编译工USB设备发出命令,第二部分是USB控制器和USB设备之间传递读写请求,其方向主要看第一部具栏中配置一下编译平台的设置:选择Win32分的命令是读还是写,第二部分有时候可以没有凶。WDM Checked平台,然后编译就可以了。至此,开本设计中数据传输方式采用批量传输,即Bulk发平台搭建完成。Transactiono这种事务传输的时候分为三部分。2.2.2 创建USB设备驱动程序框架第一部分是令牌包阶段,主机Host端发出一个利用DriverStudio的DriverWorks生成USBBulk的令牌请求。第二部分是数据包阶段,根据先设备驱动程序框架的步骤:①从VisualC+ + 6.0 前请求的令牌的类型,数据传输有可能是IN方向,工具栏中选择\"DriverStudio\"→\"DriverWizard\",然也有可能是OUT方向。传输数据的时候用DA后新建工程,选择C十十版本,这里工程名命名为TAO和DATA1令牌携带着数据交替传送。第三STM32。②选择驱动程序类型及是否需要C++部分是握手包阶段。如果数据是IN方向,握手信框架的支持,在此选择WDM型,需C十十框架的支号应该是Host端发出,如果是OUT方向,握手信持。③选择WDM驱动程序类型,这里选择WDM号应该是Device端发出。握手信号可以为ACK.功能驱动程序。④选择总线类型,填写USB设备芯表示正常响应,也可以是NAK表示没有正确传送。片VID<供应商ID)和PID(设备ID),我们选择STALL表示出现主机不可预知的错误。在本设计USB总线,在此VID和PID分别为0483、7540。⑤中,端点O为控制传输端点,实现USB设备上电后定义USB接口芯片端点,其中端点O默认为控制端的配置过程;端点1为OUT中断传输端点,用于接点,不需要定义,端点1定义为OUT中断传输方收上位机发送的命令,实现上位机对数据采集过程式;端点2为IN块传输端点。⑥选择设备操作,如的控制;端点2为IN块传输端点,将数据采集结果Close、Create、Read、Write等。⑦选择1/0端口读实时地传送到上位机,供上位机进行数据分析和处写方式,添加IOCTL接口(用于控制传输)。⑧创理。端点2的配置如下:建注册表项,这里我们不需要创建任何注册表项。SetEPType (ENDP2, EP _ BULK); SetEPTxAddr ⑨对WDM支持的电源管理选项进行选择,这里选(ENDP2, ENDP2 TXADDR); 择默认的\"ManagePower For This Device\"。⑩选SetEPTxCount(ENDP2, 64) ; 择是否支持WMI。接下来的Installation、AddiSetEPTxStatus(ENDP2, EP TX V ALID) ; tional和Summary3个对话框按默认方式。这样,SetEPRxStatusCENDP2, EP _RX_DIS) ; 就创建了一个USB设备驱动程序框架,接下来,在在设置端点2发送有效之后.USB模块可自动这个框架中添加所要实现功能的代码。完成端点2缓冲区的数据发送。2.2.3 USB设备驱动代码编写与实现2.2 USB设备驱动程序的开发以上由DriverWorks自动生成的USB设备驱2.2.1 开发平台的搭建时动程序框架主要由STM32Driver.cpp和首先依次安装MicrosoftVisual C+十6.0、MiSTM32Device. cpp两个源程序组成。其中,前者用crosoft Windows XP DDK、DriverStudio3. 2驱动于初始化驱动程序,它包括:人口函数DriverEntry、程序开发工具包。在安装过程中.VC6.0最好安装AddDevice和Unload函数;后者用于在WDM环境