羅洋坤
(湖南汽車工程職業(yè)學(xué)院,湖南 株洲 412001)
隨著汽車行業(yè)朝向物聯(lián)網(wǎng)方向發(fā)展和應(yīng)用,其車聯(lián)網(wǎng)的終端設(shè)備性能至關(guān)重要。普通的51單片機(jī)已經(jīng)無(wú)法滿足車聯(lián)網(wǎng)高速數(shù)據(jù)處理需求,在性能方面也存在較大的不穩(wěn)定性,因此研究應(yīng)用一種廉價(jià)和性能滿足數(shù)據(jù)處理需求的終端設(shè)備成為關(guān)鍵。白昊等采用串口模塊,使串口設(shè)備以無(wú)線形式接入網(wǎng)絡(luò)[1];李曉丹設(shè)計(jì)的嵌入式網(wǎng)關(guān)系統(tǒng)由STM32通過串口與網(wǎng)絡(luò)模塊實(shí)現(xiàn)遠(yuǎn)程控制[2];余歡等以STM32為硬件平臺(tái)開發(fā)了一套針對(duì)科研人員使用的農(nóng)業(yè)環(huán)境數(shù)據(jù)采集終端系統(tǒng),采集數(shù)據(jù)實(shí)時(shí)傳輸?shù)竭h(yuǎn)端服務(wù)器的同時(shí)也保存至TF卡[3-4];陳振亞等采用STM32F407作為主控芯片實(shí)現(xiàn)與智慧社區(qū)綜合管理平臺(tái)服務(wù)器的數(shù)據(jù)處理[5]。由于在構(gòu)建的車聯(lián)網(wǎng)系統(tǒng)中存在遠(yuǎn)程傳輸數(shù)據(jù)的實(shí)時(shí)性,因此終端必須在很短的時(shí)間內(nèi)完成大量連續(xù)數(shù)據(jù)的串口傳輸和內(nèi)部批量處理數(shù)據(jù)[6]。
設(shè)計(jì)中采用STM32F407芯片強(qiáng)大的處理速度和高性能的外設(shè)為車聯(lián)網(wǎng)終端性能提供硬件保證,充分利用DMA和SPI技術(shù)相互結(jié)合發(fā)揮出STM32在終端數(shù)據(jù)處理性能,并使得遠(yuǎn)程數(shù)據(jù)的傳輸過程更加穩(wěn)定[7]。
在考慮車聯(lián)網(wǎng)終端設(shè)計(jì)成本和性能整體因素后選擇STM32F407芯片作為終端設(shè)備處理芯片。STM32F407芯片基于ARM Cortex-M3架構(gòu),基于STM32F407芯片設(shè)計(jì)終端控制電路,STM32核心電路圖,如圖1所示。STM32F407擁有完善的時(shí)鐘啟動(dòng)機(jī)制,在啟動(dòng)時(shí)選擇系統(tǒng)時(shí)鐘,復(fù)位時(shí)內(nèi)部8 MHz晶振作為CPU時(shí)鐘,可使用多個(gè)預(yù)比較器用于配置AHB頻率,包括高速APB2和低速APB1,高速APB2最高頻率為72 MHz,低速APB1最高頻率為36 MHz,這種時(shí)鐘模式和啟動(dòng)機(jī)制完全滿足車聯(lián)網(wǎng)終端設(shè)備的要求,其時(shí)鐘頻率較高,保證了整個(gè)車聯(lián)網(wǎng)終端設(shè)備的運(yùn)行速度。
STM32外圍接口豐富,時(shí)鐘頻率更快,模塊化程序結(jié)構(gòu)。STM32F407除了在硬件方面性能卓越外,其精髓之一在于其擁有自己的庫(kù)。使用查找表的方式非常麻煩,其往往通過查閱來操作相關(guān)寄存器的配置是因?yàn)?或者0,這種方式的弊端在于使用頻繁造成巨大的時(shí)間消耗,會(huì)給進(jìn)行二次開發(fā)帶來巨大壓力,方便進(jìn)行二次開發(fā)才是最重要的規(guī)劃[8]。
STM32提供的許多函數(shù)接口,直接調(diào)用這些函數(shù)接口就可以配置STM32的寄存器,不用挖空心思去了解庫(kù)底層的寄存器操作,而且對(duì)于寄存器的操作根據(jù)函數(shù)接口和調(diào)用參數(shù)非常清晰。
在車聯(lián)網(wǎng)終端中STM32F407與多個(gè)SPI設(shè)備相連,必然要分清楚哪個(gè)SPI設(shè)備有效,于是SPI總線必然有一根片選信號(hào)線。SPI信號(hào)線選擇分析如圖1所示,可以看到MCU連接了3個(gè)SPI設(shè)備,獨(dú)立的片選信號(hào)SS1、SS2和SS3誰(shuí)是低電平?jīng)Q定了哪個(gè)設(shè)備可以開始SPI通信。而SCK、MOSI和MISO這3個(gè)信號(hào)線則是被3個(gè)SPI設(shè)備共用。SCK是時(shí)鐘信號(hào)線(Serial Clock),STM32F407決定了時(shí)鐘頻率,MOSI是STM32F407控制芯片輸出輸入信號(hào)線,從STM32控制終端輸出數(shù)據(jù),由其他接收設(shè)備接收。MISO是主機(jī)輸入從機(jī)輸出信號(hào)線,數(shù)據(jù)從從機(jī)輸出,由主機(jī)接收[9]。

圖1 SPI信號(hào)線選擇分析圖
SPI在通信數(shù)據(jù)傳輸中其模式由時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)配置,2*2=4,意味著有4種模式。CPOL影響的是4根信號(hào)線之中的SCK信號(hào)線,CPOL=0時(shí)SCK=0;CPOL=1時(shí)SCK=1。CPOL的值決定了SPI通信設(shè)備處于空閑狀態(tài)時(shí)SCK信號(hào)線是高電平還是低電平。CPHA就是指是奇數(shù)邊沿采樣還是偶數(shù)邊沿采樣,其中的MOSI和MISO這2個(gè)信號(hào)線采樣[10]。使用SPI協(xié)議通信時(shí),主機(jī)和從機(jī)的時(shí)序要保持一致,意味著主機(jī)和從機(jī)有一樣的SPI模式。STM32方面的用SPI來支持車聯(lián)網(wǎng)終端性能,這樣是為了使用DMA功能來提高數(shù)據(jù)傳輸和處理的實(shí)時(shí)性能,單次傳輸可選擇為8或16位,波特率預(yù)分頻系數(shù)(最大為FPCLK/2),時(shí)鐘極性(CPOL)和相位(CPHA)可編程設(shè)置,數(shù)據(jù)順序的傳輸順序可進(jìn)行編程選擇,MSB在前或LSB 在前,可觸發(fā)中斷的專用發(fā)送和接收標(biāo)志,使用DMA進(jìn)行數(shù)據(jù)傳輸操作。
當(dāng)從車聯(lián)網(wǎng)終端的外設(shè)接收數(shù)據(jù)時(shí),MISO數(shù)據(jù)線接收信號(hào)通過移位寄存器處理發(fā)送到接收緩沖區(qū),直接讀取接收緩沖區(qū)變量,當(dāng)發(fā)數(shù)據(jù)給車聯(lián)網(wǎng)終端設(shè)備的其他外設(shè)時(shí),先把數(shù)據(jù)寫入發(fā)送緩沖區(qū)變量,通過硬件用移位寄存器處理,再輸出到MOSI數(shù)據(jù)線。CPU先花時(shí)間把ADC外設(shè)寄存器的數(shù)據(jù)讀取回內(nèi)存,也就是程序里面設(shè)定變量去存儲(chǔ)這些數(shù)據(jù),然后CPU花時(shí)間對(duì)變量進(jìn)行運(yùn)算處理。問題在于怎樣不讓CPU花時(shí)間在把ADC外設(shè)的寄存器的數(shù)據(jù)讀取回內(nèi)存這個(gè)過程上。在車聯(lián)網(wǎng)終端設(shè)備中STM32F407和其他外設(shè)以及內(nèi)存之間的關(guān)系非常緊密,因此聯(lián)系它們的總線顯得至關(guān)重要,而數(shù)據(jù)要在內(nèi)存和外設(shè)之間進(jìn)行傳輸,或者外設(shè)直接互相傳輸,這樣的工作由DMA去做。
在STM32中,DMA是以外設(shè)的身份被添加到Cortex內(nèi)核之外的。STM32的系統(tǒng)結(jié)構(gòu)如圖2所示。內(nèi)核Cortex通過DCODE經(jīng)過總線矩陣協(xié)調(diào),把數(shù)據(jù)再存放到SRAM中,這個(gè)過程非常浪費(fèi)CPU,使用DMA的優(yōu)勢(shì)在于,其DMA總線與矩陣協(xié)調(diào),AHB把車聯(lián)網(wǎng)終端設(shè)備的外設(shè)ADC數(shù)據(jù)經(jīng)過DMA通道之后,自動(dòng)保存到內(nèi)存SRAM中[11]。該過程獨(dú)立于STM32F407內(nèi)核,數(shù)據(jù)轉(zhuǎn)移的同時(shí)CPU可以做其他事情,此時(shí)的CPU已經(jīng)告別了中轉(zhuǎn)站的身份。DMA直接存儲(chǔ)器存取中的“直接”就體現(xiàn)在點(diǎn)到點(diǎn)的數(shù)據(jù)轉(zhuǎn)移[12-13]。

圖2 STM32的系統(tǒng)結(jié)構(gòu)
通過結(jié)合SPI和DMA的優(yōu)勢(shì),使得車聯(lián)網(wǎng)終端設(shè)備中STM32F407可以發(fā)揮出其最佳性能,通過測(cè)試,STM32F407可以高速處理目前車聯(lián)網(wǎng)的終端數(shù)據(jù)信息,車聯(lián)網(wǎng)終端數(shù)據(jù)延時(shí)過長(zhǎng)得到了根本改善,性能也非常穩(wěn)定,連續(xù)測(cè)試20天沒有出現(xiàn)死機(jī)和數(shù)據(jù)丟失的情況。
程序在軟件程序的改進(jìn)優(yōu)化方面,通過以下過程實(shí)現(xiàn)了SPI和DMA技術(shù)結(jié)合的最佳軟件性能。其中,main函數(shù)首先調(diào)用了USART1_Config()、DMA_Config()及LED_GPIO_Config()分別配置串口和DMA。在進(jìn)行DMA傳輸?shù)倪^程中CPU還在控制著其他車聯(lián)網(wǎng)程序過程。需要特別主意的是USART_DMACMD(USART1,USART_DMAREQ_TX,ENABLE)是庫(kù)函數(shù),調(diào)用這個(gè)庫(kù)函數(shù)就實(shí)現(xiàn)了允許車聯(lián)網(wǎng)終端串口外設(shè)向DMA發(fā)出請(qǐng)求,請(qǐng)求DMA傳輸數(shù)據(jù)。調(diào)用這個(gè)函數(shù)之后,DMA開始響應(yīng)串口的請(qǐng)求,根據(jù)DMA配置把數(shù)組中的數(shù)據(jù)一個(gè)個(gè)地轉(zhuǎn)移到終端車聯(lián)網(wǎng)設(shè)備的串口數(shù)據(jù)寄存器,并由串口向外發(fā)送這些數(shù)據(jù)。
前面車聯(lián)網(wǎng)終端串口向DMA發(fā)出數(shù)據(jù)傳輸請(qǐng)求,那么需要對(duì)串口的DMA初始化配置。為了開啟外設(shè)的DMA時(shí)鐘,填充要進(jìn)行DMA傳輸?shù)某跏蓟Y(jié)構(gòu)體,使能DMA功能。外設(shè)地址是數(shù)據(jù)寄存器的地址,通過DMA把內(nèi)存數(shù)組里的數(shù)據(jù)轉(zhuǎn)移保存到這個(gè)數(shù)據(jù)寄存器中,串口直接按照串口協(xié)議自動(dòng)發(fā)送這個(gè)數(shù)據(jù)寄存器接收到的數(shù)據(jù)[14]。這里需要注意的是外設(shè)地址需要算出來進(jìn)行宏定義的,但是地址不需要自增,而內(nèi)存地址往往是一個(gè)數(shù)組名,這樣就需要進(jìn)行自增設(shè)置。在使能DMA中選擇通道不是隨便選擇,需要根據(jù)映射圖配置。外設(shè)在使用DMA前需要向DMA控制器發(fā)送請(qǐng)求信息,DMA在接收到請(qǐng)求后才會(huì)根據(jù)DMA配置進(jìn)行數(shù)據(jù)轉(zhuǎn)移。
在車聯(lián)網(wǎng)設(shè)計(jì)的終端中DMA被配置為:數(shù)據(jù)傳輸方向從內(nèi)存(數(shù)組SendBuff)到USART1外設(shè)的數(shù)據(jù)寄存器(USART1_DR_Base),要傳輸?shù)臄?shù)據(jù)總量為SENDBUFF_SIZE(5 000字節(jié)),并且傳輸時(shí)內(nèi)存地址自增,外設(shè)地址固定,DMA模式為非循環(huán)模式,DMA通道為DMA1的CHANNEL4。在車聯(lián)網(wǎng)終端設(shè)備的軟件中通過system_stm32f10x.c文件進(jìn)行時(shí)鐘配置,包括系統(tǒng)時(shí)鐘和總線時(shí)鐘,STM32F407的系統(tǒng)頻率并非等同于外部晶振頻率,設(shè)備系統(tǒng)通過STM32F407的內(nèi)部寄存器對(duì)晶振頻率進(jìn)行倍頻和分頻處理,或者使用STM32F407自帶的時(shí)鐘。
在車聯(lián)網(wǎng)終端設(shè)備上的外設(shè)都與該時(shí)鐘頻率密切關(guān)聯(lián),因此在車聯(lián)網(wǎng)終端設(shè)備的程序設(shè)計(jì)上對(duì)該文件的時(shí)鐘配置至關(guān)重要。此外misc.c文件包括了車聯(lián)網(wǎng)終端外設(shè)對(duì)STM32F407芯片中的中斷向量控制器的訪問函數(shù),因此在配置車聯(lián)網(wǎng)終端設(shè)備的STM32407中斷時(shí),要把該文件添加到整個(gè)車聯(lián)網(wǎng)軟件工程中。最后還有一個(gè)配置使用了與外設(shè)的頭文件stm32f10x_conf.h[15]。
針對(duì)車聯(lián)網(wǎng)遠(yuǎn)程短時(shí)間內(nèi)連續(xù)傳輸和處理大量數(shù)據(jù)的問題,設(shè)計(jì)采用STM32強(qiáng)大的外設(shè)為車聯(lián)網(wǎng)終端性能提供了硬件保證,利用DMA和SPI技術(shù)相互結(jié)合發(fā)揮出STM32在終端數(shù)據(jù)處理和傳輸?shù)淖罴研阅躘16]。經(jīng)過測(cè)試分析,串口通信性能的提高可以使得車聯(lián)網(wǎng)信息處理速度更快,使得車聯(lián)網(wǎng)系統(tǒng)更加適應(yīng)高速數(shù)據(jù)趨勢(shì)。但是網(wǎng)絡(luò)通信的實(shí)時(shí)性能以后會(huì)越來越高標(biāo)準(zhǔn)要求,因此如何組建更好的終端設(shè)計(jì)結(jié)構(gòu)將是進(jìn)一步研究的課題。