APP下载

基于ARM的DCS专用工业键盘研究与实现

2012-02-28孙旭华姜铁梅

网络安全与数据管理 2012年9期
关键词:描述符端点中断

蒙 艳,孙旭华,姜铁梅

(上海自动化仪表股份有限公司技术中心,上海 200072)

随着工业控制现场中分散控制系统(DCS)的发展,需要特定的DCS操作员键盘对系统进行控制。该键盘使操作员能对系统的操作更加直观、操作方法更加简捷,以降低对操作员的操作技能要求,进一步减少误操作的可能,从而提高整个生产线的自动化能力。DCS操作员键盘正是基于这个目的产生的。该键盘在功能上除了兼容标准PC键盘的功能外,增加了DCS功能扩展区和用户自定义扩展区。在该键盘按键壳体上印刷按键功能,如逻辑开、逻辑关、手动、自动、报警、输出步长等等,一旦有按键动作,键盘立刻响应并将按键编码发给主机,主机根据接收到的按键编码调用相应的子函数来完成响应功能。同时该键盘支持目前广泛流行的USB接口的标准PC键盘通信协议。USB协议专门为人机交互设备提供了接口描述,即HID设备类。用户可以按照HID设备类的协议设计通用键盘,也可以根据自己的需要设计特殊的键盘,以满足不同的应用场合。USB通信协议的设备一旦接入主机USB接口,主机调用底层驱动自动完成USB设备的枚举,实现方便快捷的即插即用。另外该键盘可记挂标准PC键盘,即便在DCS操作员键盘故障或在高级工程师操作管理模式下,可使用标准PC键盘做进一步的操作。在基本功能上与标准PC键盘保持一致,可相互控制Capslock状态。本文描述的正是这样一个基于ARM的DCS专用工业键盘的研究与实现。

1 系统硬件实现

该键盘硬件主要由ARM MCU、USB HUB等控制电路以及矩阵式键盘组成。

1.1 ARM MCU 控制电路和矩阵式键盘

ARM MCU控制电路主要负责与主机的通信,完成USB通信建立、按键扫描、键码确认以及发送。ARM其他部分电路包括JTAG调试电路接口、复位模块、晶振介入电路等常规电路。另外还有一个GPIO端口做指示灯,用于指示键盘CAPS键。

本设计微处理器选用ST公司的STM32F103R6T6。STM32F103R6T6是ARM公司具有突破性的Cortex-M3内核的STM32系列32 bit闪存微控制器的增强型产品。具有高性能、低功耗、实时应用且具有竞争力价格等多项优点,其工作频率为72 MHz,1.25 DMIPS/MHz;片上集成了32 KB的Flash代码存储器和10 KB的SRAM用户数据存储器;通过APB总线连接丰富和增强的外设和I/O;集成3个定时器、51个快速 I/O端口以及SPI、I2C、USART、CAN等多种标准通信接口[1];嵌入了一个支持全速USB2.0总线的USB外设,实现了全速(12 Mb/s)功能接口;可通过软件配置端点,也可以通过软件控制挂起/恢复;时钟来自内部PLL产生的48 MHz专用时钟源。

该电路主要用于检测键盘矩阵上的按键情况,并处理包括特殊功能键在内的数据传输,具体功能由软件编程实现。本设计中键盘需要支持86个按键,接口部分为矩阵式键盘,列线通过电阻接正电源,用MCU的11个I/O口做通用输出口,作为键盘扫描信号的输出口;行线用8个I/O口做通用输入口,作为键盘反馈信号的输入口。这样总共使用19个I/O端口即可控制多达11×8=88个按键,减少了I/O口的占用,满足了86个按键的需要。将全部列线置低电平输出,然后读行线有无低电平出现。当没有按键按下时,所有的输入端都是高电平,代表无键按下;一旦有键按下,则输入线就会被拉低,这样通过读入输入线的状态就可得知是否有键按下。

此外本项目采用IAR System公司为ARM微处理器开发的一个集成开发环境IAR EWARM,需要配套的IAR J-LINK仿真器。J-LINK一端通过PC机USB口与PC连接,另一端通过标准20芯JTAG插头与目标板连接,并将目标板的电源接上,即可进行应用程序的在线调试。

单片机控制设计电路如图1所示。

1.2 USB HUB部分

USB HUB控制电路主要是为该键盘作冗余,将USB数据分成两路,一路接收和发送键盘的数据,另一路作为独立的USB口,可与其他的标准USB 2.0设备通信(如标准PC键盘),以防工业现场恶劣环境下键盘故障。USB HUB芯片采用赛普拉斯的CYC765621,主要接口是 1路和上位机通信的 USB接口(D-、D+),另 2路为HUB分出来的2路USB接口,其中一路作为外接USB口,另一路则接到ARM作为键盘通信的数据传输口(DD1-DD1+DD2-DD2+)。另有 MIC2026-2YM的电源保护关断芯片,作为保护电路与CYC765621相连。

1.3 电源部分电路

电源部分电路采用USB供电。USB为5 V供电,通过LM1117MPX-3.3的线性电源芯片转换为3.3 V电源,为USB HUB和ARM芯片供电。

2 系统软件设计

本设计中软件主要是对硬件电路的驱动,实现与USB口的通信以及键盘的响应功能。首先对ARM MCU进行系统初始化,包括系统时钟设置、GPIO口的初始化设置;其次对USB模块中断配置与使能,中断包括USB低优先级中断、USB唤醒中断、按键控制中断等,并对USB模块时钟设置和使能,然后初始化。对定时器TIM2进行设置,之后进入循环任务函数。循环任务函数有两个:一是主机枚举响应;另一个是使用定时器中断方式实现键盘任务。键盘主程序流程图如图2所示。

图2 键盘主程序流程图

2.1 USB任务处理设计

USB键盘是HID类设备的一种,遵循着USB设备启动过程。即每次设备接入总线,先进入设备检测状态,总线对设备进行总线复位;其次是设备枚举过程,在这里USB设备将被枚举为标准的HID类键盘。主机通过默认端点0发送SETUP包,得到设备描述符,然后给设备分配新的地址,分配成功后,主机将通过新的设备地址向设备依次发送标准USB请求来获取设备的配置信息,即获得设备描述符、配置描述符、接口描述符、端点描述符、HID描述符和报表描述符。通过设备的这些描述符,主机就知道了设备的详细信息,并根据设备的配置情况对设备的端点进行操作。这些操作包括:初始化端点数目,分配各端点所需使用的Packet Buffer;初始化所使用的端点,配置端点的传输类型、传输方向、Packet Buffer地址和初始状态。在需要发送数据或接收数据的时候,使能端点;并在该端点的中断回调函数中处理数据,如果需要则使能下一次传输。以上便是实现USB键盘设备的步骤。

USB设备描述符如下:

在实际设计与开发中,由于STM32提供丰富的USB标准函数库,充分使用该函数库会加快开发进程。下面是一段对IN端点的初始化和使能以及IN传输的关键代码:

2.2 键盘任务处理设计

图3 键盘任务处理函数keyboard()流程图

键盘任务处理函数keyboard()流程图如图3所示。先对按键进行扫描,若无按键按下,则每隔10 ms扫描一次。若有按键按下,记录下按键所处键盘的位置代码,转向消抖处理。所按下按键若通过消抖处理,则确认其位置代码,进入到按键处理阶段,将位置代码转换为按键HID码并发送。否则释放其位置代码,转到按键扫描处重新扫描。发送完其HID码的按键再进行消抖处理判断其释放否。若按键未释放则继续等待,若已释放则转向按键扫描处重新扫描。

在具体设计中引入状态转移分析法和定时器中断。将按键的所有状态分为4种:状态0为按键扫描,状态1为按键消抖处理并确认,状态2为按键键码转换并发送,状态3为等待按键释放状态。以上的函数流程实际上是在这4个状态中转移,如图4所示。设置一个状态标志位key_state来表示按键所处的不同状态,采用多分支结构swich-case,可以很方便地实现。

图4 按键状态转移图

定时器中断是使MCU的TIM2定时器产生10 ms的定时中断。主程序每隔 10 ms中断调用 keyboard()函数一次。当无按键按下时,key_state=0,执行case0,即实现了每10 ms执行一次键盘扫描。若有按键按下,则定位其按下按键的位置代码,并使key_state=1。当10 ms后再次调用 keyboard()函数,这时 key_state=1而进入 case1,在case1中对前面所定位的按键位置再次进行确认,若还在,则再次确定其位置代码,并使key_state=2。如此时按键已经释放,说明为假按键,则使key_state=0,返回按键扫描。这里巧妙利用了两次定时中断的10 ms间隔实现按键的消抖处理。若key_state=2,10 ms后再次调用keyboard()函数时则进入 case2,这里将已确认的按键位置代码转化为按键代码以及最终的HID码,建立键盘报表并发送给主机,然后使key_state=3。当下一个10 ms,key_state=3则进入csae3,等待按键释放状态,此时再次扫描前面已确定按键的位置,若按键已释放,则key_state=0,下一个 10 ms来临则进入case0重新按键扫描;否则仍然key_state=3,继续等待释放。这里也巧妙地利用了这10 ms进行按键释放时的去抖动处理。

另外在多键(含双键)、特殊功能键和复合键的实现中,该软件也设计了比较好的实现方法。譬如多键,设置内部缓存器,在逐行扫描中将每个按下按键在矩阵键盘中的位置代码存入其中。之后的消抖处理等操作的对象便是缓存器中的按键位置代码值。系统处理的普通键数最多为6个,超过则为溢出。对于特殊功能键,其形式上是单键,实际实现的是多键的功能。只要将单键在发送前转换成需要的多键HID码,即可方便实现。对于复合键,理论上是两个以上按键同时按下所完成的功能,实际情况很难实现真正的“同时按下”,它们的时间差别可能长达50 ms。譬如对引导键SHIFT键的设计,需设置专门标志位Shiftkey_flag,有SHIFT按下则 Shiftkey_flag=1,否则为0。在第一次检测出SHIFT单按键时,改变状态标志位为1。随后的按键扫描中,若再无其他按键按下,则key_state=0,直到有其他按键按下,key_state=1。这在软件中实际上是对状态0的细化。同理,在各个状态中,因为该键的特殊性,也有相应的细化过程。

从以上分析可见,这样的软件设计不仅结构清晰,代码简洁、实现便捷,而且使得当无按键按下,键盘每10 ms扫描一次;当有确定非复合按键按下(即通过消抖处理),则键盘响应速度在30 ms以内,如此的响应速度大大提高了键盘的灵敏度。

DCS系统是目前工业控制领域的核心系统,其专用键盘是提高整个生产线自动化能力的关键一环。该专用键盘的设计避免了现有键盘电路特殊按键实现复杂、软硬件成本高的情况。本文研究开发的基于ARM的DCS专用工业键盘,实现了对多达86个按键的控制。采用STM32芯片及有效率的软件开发大大提高了产品开发的速度。经过实验结果与实际应用证明,该专用键盘易用性、可靠性达到了工业要求,并可产生很大的经济效益。

[1]王永虹,徐炜,郝立平.STM32系列 ARM Cortex-M3微控制器原理与实践[M].北京:北京航天航空大学出版社,2008.

[2]马潮.AVR单片机嵌入式系统原理与应用实践 [M].北京:北京航天航空大学出版社,2007.

[3]刘荣.圈圈教你玩USB[M].北京:北京航天航空大学出版社,2009.

[4]廖济林.USB2.0应用系统开发实例精讲[M].北京:电子

工业出版社,2006.

猜你喜欢

描述符端点中断
非特征端点条件下PM函数的迭代根
基于结构信息的异源遥感图像局部特征描述符研究
不等式求解过程中端点的确定
Linux单线程并发服务器探索
跟踪导练(二)(5)
千里移防,卫勤保障不中断
参数型Marcinkiewicz积分算子及其交换子的加权端点估计
利用CNN的无人机遥感影像特征描述符学习
基丁能虽匹配延拓法LMD端点效应处理
AT89C51与中断有关的寄存器功能表解