,,,
(西安工程大學 電子信息學院,西安 710048)
USB設備因具備傳輸速率快,且通信較為穩定、抗擾能力強以及便于插拔等特性,成為電子通信設計、有線數據傳輸中首選的通信接口[1]。其中USB1.0協議的全速USB設備理論速率可達12 Mbps,USB2.0協議的高速USB設備理論速率可達480 Mbps。
目前市場上大多數微處理器都具備USB功能但不同芯片的集成度不同,主要分為USB芯片集成于處理器內部和需要外擴USB芯片兩種模式[2]。當芯片內部集成時,可以有效降低外部電路設計的復雜性[3]。故在數據傳輸速率要求不是很高的情況下,選用適當的設計方式可以有效提高設計效率[4]。但與此同時USB設備通信協議以及底層驅動設計的復雜性仍然是制約USB應用的主要原因[5],在傳統USB開發中不僅要針對USB從機進行相應的定義,還要在主機設備上編寫運行相應驅動才能最終實現通信[6-7]。
本設計方案以USB數據采集[8]為設計背景,采用ST(意法半導體)開發的基于HAL庫的STM32CubeMX快速完成USB從機端的通信協議配置[9-10],USB主機端使用LabVIEW編寫,并借助NI-VISA軟件生成USB驅動[11-13],完成USB鏈接,實現主機、從機之間的全速USB設計,從而極大節省開發中底層驅動及通信協議開發的時間,降低了USB通信開發的難度[14]。
本設計由作為數據采集核心的STM32F4x部分,以及在PC上由LabVIEW編寫的包括采集數據展示以及速率測試等功能的數據處理部分構成[15]。其中數據采集入口為STM32F4x本身所帶有的片上A/D轉換器來實現,通信部分由片上全速USB實現,無需進行外擴USB高速芯片電路設計[16],因而采集端主要由STM32F4x芯片以及相應的外圍電路和STM32CubeMX生成再由MDK keil5進行編譯的主程序構成[17]。PC端主要由LabVIEW編寫的可供鍵入采集指令以及進行后期數據展示的上位機程序和利用NI-VISA生成的用于識別接口的驅動構成[18-20]。其程序流程為通過PC端LabVIEW程序發送數據采集持續時間等指令,啟動采集端開始采集數據,經過A/D轉換后由DMA傳輸至待發送緩存區,通過全速USB反饋至PC端予以展示,同時對其傳輸速率等進行實時測定。其總體框圖如圖1所示。

圖1 基于STM32的全速USB通信模塊設計方案
本文提出的全速USB通信模塊的設計方案以基于STM32的USB數據采集器為設計背景,主要構成為STM32F4x的最小系統,因USB1.0傳輸協議傳輸帶寬為12 Mbps,即理想環境下傳輸速率最大可達1.5 MB/s,可滿足設計需求,故設計中無需外擴高速USB芯片,只需將全速USB引腳引出至USB接口即可,但實際電路設計中需注意USB中的D+、D-與STM32F4x的連接走線需遵循平行等長的原則,否則可能出現USB無法識別或識別為未知設備而無法通信等問題。實際電路原理如圖2所示。

圖2 USB通信模塊從機原理圖
本設計中軟件部分包括以LabVIEW編寫的PC端程序,以及基于STM32CubeMX生成初始代碼再經過MDK編譯的采集端程序。最后通過二者之間的通信來共同完成USB數據采集器的設計。
本部分程序主要包括作為STM32F4x的數據處理程序以及USB通信程序。首先利用STM32CubeMX進行硬件初始化程序配置,從而完成原始代碼生成。其配置過程為:首先在STM32CubeMX中新建STM32F4x的工程,本設計選用的芯片型號為STM32F4IGT6,在新建工程時根據微處理器的型號進行選擇,系列 Series 中選擇STM32F4,引腳Lines中STM32F407/417,封裝中Package選擇STM32F407IGTx,由此完成硬件的選擇;之后使能相關引腳并完成引腳定義,如使能全速USB功能引腳PA11、PA12,以及其它功能引腳。
根據設計需求在時鐘樹中通過分頻以及倍乘等工具完成時鐘的配置,之后對所用到的引腳進行初始狀態的定義,例如對GPIO口的輸入/輸出設計,以及ADC入口的狀態等進行定義,隨后利用報告生成模塊生成整體配置的報告文件,進行核對確認無誤后即可生成基于HAL庫的初始代碼。
STM32CubeMX可生成支持EWARM、MDK等多個編譯器,此處選擇MDK編譯器生成工程。系統開始運行后首先進行初始化操作,硬件中間層代碼在STM32CubeMX配置中已經生成,在MDK中主要完成主程序的編寫。主程序主要包含STM32F4x的硬件初始化、采集數據緩存處理、USB通信程序三個部分。
STM32F4x初始化主要包括:重置所有外設,初始化Flash的HAL_Init()函數,系統時鐘配置SystemClock_Config()函數,以及初始化I/O的MX_GPIO_Init()函數等。同時需要進行USB協議棧初始化,包括初始化設備庫、添加支持類和啟動設備庫。完成初始化設置之后即可進行USB發送程序編寫,首先設置1024字節的緩存區UserTxBuffer[1024],對緩存區進行按位清零,判定USB接收標志位(USB_FS_Receive_Flag)是否為0,若不為0,則進行清零操作,當標志位清零后,開始通過庫函數CDC_Transmit_FS進行數據的發送,傳輸過程借鑒乒乓傳輸模式,將傳輸緩存區按順序分為前后兩段,每段設置為512,發送過程中每存滿512長度即進行一次傳輸,同時另半區繼續進行緩存操作以提高程序運行效率。最后進行發送數據量的判斷,若發送數據幀數滿足預設值,則發送幀計數清零,程序跳回,判斷USB標志位操作重新開始下一循環,若規定時間內未發滿設定幀數,則回到USB標志清零處進行單次發送以滿足條件。其程序流程如圖3所示。

圖3 采集端USB通信主程序流程圖
主機端程序由LabVIEW編寫,由前面板和后面板兩部分構成,其中前面板主要用于用戶操作。具體包含數據幀計數模塊、數據計數模塊、采集器選擇模塊、各通道采集持續時間定義模塊以及波形顯示模塊。本設計PC端系統選用的是Windows10操作系統,數據采集端所選用的通信方式為USB虛擬串口,故連接時需借助NI-VISA工具生成對應驅動以供PC端程序識別[16],此外后面板設計中需要用到的VISA函數如表1所列。
為了滿足數據通信的要求,首先應保證LabVIEW程序能夠成功鏈接到USB設備中,這部分通過表1中的VISA打開函數實現,在選定USB設備后通過創建數組函數以及VISA函數寫入采集持續時間等常量,隨后通過VISA讀取函數讀取數據采集器返回數據,并按照對應幀格式進行幀計數和數據計數。在讀取數據完成后,通過對數據進行隊列操作和數據類型轉換,最后通過數組創建函數生成波形數據,并通過波形顯示模塊予以展示。最后設置VISA關閉函數,當持續時間滿足鍵入值或通信出現錯誤時,關閉VISA函數停止數據采集。

表1 VISA函數
本設計中的USB通信測試是基于STM32CubeMX設計的數據采集下位機程序發送數據到基于LabVIEW編寫的PC端程序的傳輸速率測試。方案設計速率要求為400 kbps。首先連接USB數據采集器至PC機,在設備管理器中可見NI-VISA設備,若所選設備的識別碼與采集端程序預設相同,鏈接成功;接下來發送采集命令給采集端。
測試通過在順序結構中設置兩個時間獲取控件來獲得傳輸開始到結束所用的時間,通過數據讀取計數模塊來統計數據個數,最后通過除法運算計算傳輸速率。因硬件干擾等產生的傳輸誤差導致速率波動過大,測速過程中為避免這種情況導致偶然性,故在LabVIEW上位機設計中采用了雙循環結構進行設計,其中內循環次數默認設計為100,即每傳輸100幀數據利用除法運算求出傳輸速率,并利用波形圖表予以顯示;最后利用LabVIEW中統計樣板中的Mean函數計算整體傳輸過程中的速率均值并通過顯示模塊展示,其中運行150 000 ms的測試結果如圖4所示,經過10次不同時長測試得出的傳輸速率如表2所列,從而使得使用者能夠清晰直觀地觀測傳輸過程中的速率情況。此外,實時速率的圖表顯示也方便了使用者對干擾原因的定位以及修改驗證。

圖4 速率測試結果
由于該方案是基于STM32的官方庫函數實現的,相比于直接針對寄存器的開發來說,庫函數版本具有開發便捷、操作難度小等特點,同時也有代碼量較大、程序運冗余較大而導致的程序運行時間較長等缺點,因而本方案實驗結果還存在優化可能,使用寄存器直接開發既可提升代碼效率也可獲取更高的效率。

表2 運行時間及平均速率
本文給出的設計方案以STM32F4IGT6為例,以8位數據采集器位應用背景,提出了一種基于STM32CubeMX的USB通信模塊設計方法,能夠高效、便捷地完成STM32微處理器與PC端 LabVIEW程序之間USB通信。

鄧鑫(研究生在讀),主要研究方向為信號與信息處理、嵌入式硬件設計。