控制/MCU
基于STM32的MIT-BIH心电数据D/A回放设计,对整体设计方案、硬件组成、软件设计等进行了介绍。通过读取心电数据将其进行D/A转换,输出波形与原始波形进行比较,较好地实现了回放功能。由此可见,该系统的性能指标达到了设计要求。能很好地实现心电数据回放,为一系列心电算法的仿真实践及实时心电监护仪的研制打好了基础。
心电信号是人类最早开展研究并应用于临床医学的生物电信号之一,通过对心电信号的分析处理能有效地预测心脏疾病。如何利用心电数据开发研究相关的医疗设备是对科研人员至关重要。心电数据的回放就是将原有的存储的MIT-BIH心电数据,根据其存储的格式,利用设计的系统通过D/A转换最终从终端回放出模拟信号。本文介绍基于ARM Cortex-M3内核的STM32微控制器作为主控嵌入式芯片的心电信号数据回放的设计方法。
上位机应用程序读取心电数据库中一文件,利用设备驱动程序与D/A回放模块设备进行通信。通过USB总线不断向硬件设备发送数据,设备接收到的原始数据,利用DMA传输方式,连续、不丢失地传送到DAC模块中,在定时器的触发下,DAC模块完成数据的D/A转换,最后在终端设备即示波器上回放出模拟信号。
D/A回放硬件结构框图如图1所示。
1.1 STM32F103XX微处理器简介
系统硬件采用意法半导体公司开发的基于Cortex-M3内核的新型32位微控制器STM32F103RE作为主控芯片,工作频率高达72 MHz,内部集成了RAM、全速USB 2.0设备接口模块和双通道的12位高精度D/A转换模块等丰富的外设。在结合了高性能、低功耗和低电压的同时,保持了高度的集成性能和简易的开发特性。应用开发时,只需连接少量的外围电路即可使电路结构简单紧凑。
1.2 D/A转换模块
D/A转换模块(DAC)是12位数字输入,电压输出的D/A转换器。DAC可以配置成8位或12位模式,也可以与DMA控制器配合使用。DAC有2个输出通道,每个通道都有单独的转换器,可以工作在双DAC模式下,DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放,即可直接驱动外部负载。DAC转换可以选择外部事件触发(定时器计数器,外部中断线)和软件触发。
使能DAC通道后,STM32F103XX相应的GPIO管脚(PA4或PA5)会自动与DAC的模拟输出相联系。为避免寄生干扰和额外功耗,管脚PA4和PA5配置成模拟输入(AIN),如图2所示。
1.3 USB全速设备接口
USB外设接口实现了USB 2.0全速总线和APB1总线间的接口,为PC主机和微控制器所实现的功能之间提供了符合USB规范的通信连接。PC主机和微控制器之间通过共享USB端点缓冲区来实现数据的传输。
STM32芯片内部集成了USB外设,大大减轻了USB电路的设计负担,只需设计USB接口电路,就可以实现STM32芯片的电路板的USB通信设计。D/A回放系统选用的USB硬件接口电路如图3所示:USB上拉电压接在D+线上,所以本设计USB实现全速通信,PC机为USB接口供电。USB+连接在GPIO管脚PA11,USB-连接在GPIO管脚PA12,如图2所示:
固件程序是运行于USB设备中的程序代码,用于辅助硬件完成USB的功能。该系统固件程序选用的是STM提供的The USB-FS-DevICe Libra ry固件程序库。主要完成如下功能:一是处理USB标准请求和用户自定义请求;二是根据USB规范设置设备的各种描述符;三是初始化系统得各级中断和内部端点的配置。在Keil编译环境下,利用现成固件程序框架函数,根据设备需求在STM提供的固件程序的框架中添加相应的程序代码,完成本回放系统的功能目的。
2.1 STM32F103xxUSB固件程序库简介
STM32F103xxUSB固件程序库是意法半导体公司专为STM32F103XX系列ARM微处理器提供的固件程序库,主要分为内核层和应用接口层,结构框图如图4所示。
内核层:该层管理使用USB IP硬件与USB标准协议两者间的直接通信。USB库内核遵从USB 2.0标准并和标准的STM32F103XX固件库分离。
应用程序接口层:该层为用户提供了内核和最终应用程序之间的完整接口。应用接口层和最终应用与固件库通信来管理应用的硬件需求。
2.2 固件程序的设计
在本系统的开发中,没有对内核层进行深入研究和修改,仅对应用接口层进行完成设备功能需要的设计。应用层的开发主要包括:系统初始化,主要开启系统和所用外设的时钟;USB时钟配置,设置并使能USB时钟,为48 MHz;USB初始化主要是完成USB设备的枚举;定时器模块配置、DAC和DMA模块配置主要是完成所用外设的初始化;最后配置好标志位后等待上位机发送数据。所有代码都是用库函数来完成的,主程序流程图如图5所示。
插入USB设备时,主机轮回查询各个USB端口,检测到D+和D-之间有电压差,会识别出有USB设备的插入,然后对设备进行枚举。在设计的D/A回放系统中,枚举过程的实现主要是对USB设备的设备描述符、配置描述符、端口描述符和端点描述符的配置来实现的。USB设备枚举的过程就是通过读取各个描述符来获取USB设备的信息,然后将它配置为其中的一种功能。
D/A回放系统模块设计中,共使用了3个端点,分别为端点0,2和3。端点0为USB设备默认的控制端点,采用了控制传输方式,主要完成设备的枚举。端点2、3均为批量传输端点,数据传输采用的是批量传输方式,分别接收上位机发送来的心电信号数据和呼吸信号数据。定时器是一节拍发生器,作为DAC的外部事件触发源。定时时钟的预装载值和时钟分频系数由原数字信号的抽样频率来决定。在D/A回放系统中,使用了两个通用定时器3,4,分别作为心电信号和呼吸信号数据DA数模转换的触发源。DAC的配置为12位数据右对齐输入,电压输出的双通道模式。其中,通道1完成心电信号数据的D/A,通道2完成呼吸信号数据的D/A,选择定时器作为外部事件触发源,在一个定时周期内完成一次数据的DA实现。DMA模块主要是完成数据的转移,USB模块接收端点中断接受的数据,利用DMA方式从端点缓存中送入DAC的DAC_DHRyyD寄存器中,经过相应的移位后,写入的数据被转存到DHR1和DHR2寄存器中,随后通过定时器的外部事件触发传输到DORx寄存器中,在经过时间tsetting后,输出即有效。在数据传输过程中,采用了双缓冲机制,在RAM中开辟了2个缓存buffer,USB模块接收数据放在一个buffer中,DMA传输即DAC阶段,处理的数据是另一个buffer中的数据,这样,使接收数据和处理数据并行进行,保证了转换后波形的连续不间断性。双缓冲的实现大致如下(以心电信号数据为例):初始化空闲buffer位为buffer1,DMA源初始化配置为buffer1。端点2接收一数据包放入buffer1中,判断是否为第一次接收数据,如果是第一次接收,改变空闲buffer位为buffer2,并允许下一数据包的接收;如果不是第一次,中断直接返回。继续接收第二个数据包,放入buffer2中,判断是否第一次DMA传输,如果是,改变空闲buffer位为buffer1,开启DMA传输,并使能定时器;如果不是,中断返回。当DMA传输完成进入中断时,首先判断空闲buffer位,再重新配置DMA,包括DMA源和传输数目的改变,最后改变空闲buffer位,并允许端点的继续接收。心电信号数据接收处理流程图如图6所示。对于呼吸信号数据,做同样的处理。
本系统的USB驱动程序采用WDM模型,选用的开发工具是Windows XP DDK(Build 2600),Driver Studio 3.2和VC 6.0。驱动程序开发平台搭建成功后,根据实际需要,用DriverWorks自带的DriverWizard生成驱动程序框架和Read,Write函数,在DevICeIoControl函数中添加设备控制程序,完成自定义的功能。
上位机应用程序是采用VC 6.0创建的一个基于MFC的多文档界面应用程序,主要分为数据管理模块,回放模块等基本模块。Win32应用程序与设备驱动程序之间的通信是通过接口(API)函数来实现的,应用程序不需要为了和USB设备通信去了解复杂的USB协议,把USB接口当做文件来操作,从而轻而易举的实现USB接口通信。
按照固件程序的设计写入USB设备,插入主机并加载相应的驱动程序,打开上位机程序,读取数据库中220.dat文件,传输到STM32完成D/A,原始心电信号波形与示波器回放波形的比较如图7所示。
D/A模块较好的完成了回放功能。通过示波器实时分析,回放波形周期及幅度亦满足要求,即时序性满足要求。
基于STM32的MIT-BIH心电数据D/A回放的设计,在硬件和固件应用程序两方面实现了比较完美的结合,对原始数据的D/A回放取得了良好的运行效果。同时主控芯片STM32F103RE内部集成的丰富的功能模块,降低了开发的难度。
全部0条评论
快来发表一下你的评论吧 !