概述
随着科学技术的发展,电子服务产品正在向人性化、智能化方向发展,以提供给用户最满意的服务。现在越来越多的产品会提供给用户一定的可定制空间,用户可根据自己的习惯和行为方式对产品的部分功能进行定制,以满足人们的个性化需求。
STM32F103x是意法半导体公司生产的基于ARM CortexM3处理器核的微控制器。CortexM3是基于ARM v7M体系结构的32位标准处理器内核,具有低功耗、少门数、短中断延迟、低调试成本等众多优点。它是专门为在微控制器系统、汽车电控系统、工业控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域实现高系统性能而设计的,大大简化了编程的复杂性,集高性能、低功耗、低成本于一体。
STM32F103x微控制器采用了先进的CortexM3内核结构,具有丰富的性能出众的片上外设,包括16通道的12位A/D转换器、7通道的DMA控制器、16位定时器、USART接口、CAN总线接口和USB 2.0全速接口(12 Mbps)等[1]。
STM32F103x系列微控制器的内置Flash具有可编程特性,利用这一特性,可通过USB接口将上位机传送过来的设定值存入Flash之中,在程序中使用这些设定值,这样便可实现系统的可定制化。
2 方案论证
2.1 上位机与下位机的通信方式选择
目前,PC与下位机的通信方式主要采用串口通信或USB通信。串口通信因其通信接口简单、操作方便、价格低廉,被广泛地应用于工业领域微控制器之间的通信。
USB(Universal Serial Bus,通用串行总线)不是一种新的总线标准,而是应用在PC领域的接口技术。经过多年的发展,到现在USB已经发展为3.0版本,成为目前电脑中的标准扩展接口。USB具有传输速度快(USB 1.1是12 Mbps,USB 2.0是480 Mbps,USB 3.0是5 Gbps),使用方便,支持热插拔,连接灵活,独立供电等优点。
考虑到下位机与PC连接的便利性,以及所需辅助硬件的成本,这里选择USB通信方式。对于STM32F103x处理器,它支持符合USB 2.0全速设备技术规范的USB接口,且意法半导体公司提供USB的开发固件库,这给STM32F103x处理器的USB应用开发带来很大的便利,仅需很少的外围器件便可实现方便可靠的通信。因此,对于需要与PC进行信息交互的开发项目来说,USB越来越受到人们的钟爱。
2.2 下位机定制参数的存储与加载
对于提供参数定制功能的产品,通常的做法是给MCU外扩一片EEPROM,将定制参数存储在EEPROM中。当程序需要使用设定值时,只需将EEPROM中的值读出来即可。采用外扩EEPROM的方式虽然简单,却会增加硬件成本,不利于成本控制要求较高的产品开发。
对于具有IAP功能的STM32F103x处理器,其Flash存储空间具有可编程特性,可以使用微控制器支持的任一种通信接口(如I/O端口、USB、CAN总线、UART等)下载数据到存储器中。为了降低系统成本,节省元件空间,可以利用STM32F103x的Flash来模拟EEPROM的功能,用来存储代码和数据[2]。通过编程保留出一段Flash存储空间,专门用来存储设置数据,从而实现定制参数的存储。
在系统上电初始化时,将Flash中的定制数据加载SRAM中,这样在程序中便可以使用这些定制值,从而实现产品的可定制化。
3 系统设计实现
3.1 PC与下位机的USB通信程序设计
人机接口设备(Human Interface Device,HID)用于管理和控制大多数计算机的人工输入设备,比如鼠标、键盘和游戏杆等,是USB的标准设备类之一。主机上的USB软件一般分为4个类型,即USB主控制器驱动程序、USB核心驱动程序、USB设备驱动程序和用户程序。其中,前两者属于USB的系统软件,而USB设备驱动程序是基于USB类协议的软件部分。
从Windows 98开始,HID一直是Windows操作系统支持较为完善的USB设备类。操作系统中不仅提供了完整的USB系统软件,而且直接提供HID的设备驱动程序。这样,开发USB HID设备时,就无需在PC上编写驱动程序,只需调用Windows提供的HID类的接口函数直接编写用户软件。这样就大大降低了开发的难度,节省了开发时间[3]。因此,本类系统应用中确定USB的设备类型采用HID设备。
下位机以STM32F103x为控制核心,利用意法半导体公司提供的USB开发固件库将其定义成HID设备类。包括端点0在内,共使用3个端点。端点0为控制传输端点,实现USB设备上电后的配置过程;端点1为OUT中断传输端点,用于接收上位机发送的命令,实现上位机对参数定制单元的读写控制;端点2为IN块传输端点,根据接收到的上位机指令,将原设定参数或确认信息传送到上位机,供上位机进行数据分析和处理[4]。
各端点的配置代码如下:
/* 初始化端点 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);
/* 初始化端点 1 */
SetEPType(ENDP1, EP_INTERRUPT);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, nReportCnt);
SetEPRxStatus(ENDP1, EP_RX_VALID);
/* 初始化端点 2 */
SetEPType(ENDP2, EP_INTERRUPT);
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
SetEPTxCount(ENDP2, nReportCnt);
SetEPTxStatus(ENDP2, EP_TX_NAK);
USB应用服务程序由低优先级端点传输成功中断服务子函数CTR_LP()完成。
上位机PC端,使用MFC开发应用程序界面,完成参数的调整及存储、与下位机的信息交互等功能。Windows用来与HID设备通信的API函数,包含在hid.dll、setupapi.dll、kernel32.dll 3个dll文档中,分别起到与HID设备通信、寻找与识别设备、交换数据的作用。所使用的典型Windows API如下:
◆ CreateFile
◆ ReadFile
◆ WriteFile
◆ HidD_SetFeature
◆ HidD_GetFeature
◆ HidD_SetOutputReport
◆ HidD_GetInputReport
其中,CreateFile用于打开设备;ReadFile、HidD_GetFeature、HidD_GetInputReport用于设备到主机方向的数据通信;WriteFile、HidD_SetFeature、HidD_SetOutputReport用于主机到设备方向的数据通信。
3.2 定制参数的存储与加载
STM32F103x的Flash寿命是10 000次,可以满足多数的应用。对STM32F103x主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理,编程与擦除的高电压由内部产生。复位后,FPEC模块是被保护的,对Flash的擦除与写入是非法的。要想对Flash进行擦写操作,需要先解除闪存锁定,通过调用固件库中的FLASH_Unlock()函数来解除闪存锁[5]。
STM32F103x用户Flash的起始地址为0x08000000,按照不同容量,存储器组织成32个1 KB/页(小容量)、128个1 KB/页(中容量)、256个2 KB/页(大容量)的主存储器块和一个信息块。根据需要设置参数的多少,确定实际需要使用的页的多少。对于闪存的擦除必须按页进行,因此在写入设定值时,即使有部分设定值不需要修改,也要先将该部分设定值读出来,待擦除完毕后与其他设定值一同写入。
需要注意的是,对Flash主存储器块的编程操作只能以半字(16位)方式写入,写入任何非半字的数据,FPEC都会产生总线错误。因此,当设定值以字节方式存储时,可以将两个相邻数据合并成一个半字(16位),通过固件库函数Flash_ProgramHalfWord(),将定制数据连续存储到Flash中,方便数据的加载。
对于设定值的加载,是在开机初始化中完成的,通常初始化程序对时间的要求不太严格,程序可以直接访问其在Flash中的存储地址来获取设定值。
对于对时序要求严格的应用系统,可以使用DMA方式,将设定值按一定的格式统一加载到SRAM中,加快程序的访问速度。要更好地实现数据的加载,可以充分利用开发工具所提供的便利条件。
在GCC和RealView MDK(即Keil)开发工具中,允许定义变量时手工指定其地址,如:volatile u8var __attribute__((at(0x20002000)));
这样,将保存设定值的这些变量按顺序连续存储,在加载数据时,只要指定目标变量的起始地址以及需要加载的变量个数,即可以一种地址指针累加的方式,循环读出所有的设定值,简化了读取操作的程序功能实现。
3.3 参数定制服务的整机设计实现
为了降低功耗,下位机的USB接口只有在与PC相连接时才能打开,并且可随时由应用程序将其连接断开。在系统第一次启动时,将设定的默认值写入Flash,并置位参数值已写入标志,这样系统下次启动时,检测该写入标志,来决定是否需要写Flash。通过PC写入设定值时,同时也重新将该写入标志写入,以便于下位机的上电查询。整机系统实现流程图如图1所示。
图1 参数定制服务实现流程图
结语
该方案将下位机定制成USB HID设备,方便了上位机应用程序的开发,将数据保存到STM32F103x的Flash中,实现了产品参数的可定制化。硬件电路简单,成本低,便于操作和维护。