版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第36頁摘要隨著時代的進(jìn)步,電子行業(yè)的發(fā)展,定時器的應(yīng)用也越來越廣泛。傳統(tǒng)的機(jī)械式定時器,電動式定時器都是通過發(fā)條、交流同步步進(jìn)電機(jī)或者石英步進(jìn)電機(jī)進(jìn)行驅(qū)動的。這種定時器精度不高,定時誤差較大。相對于前兩種定時器,電子式定時器體積小、重量輕、造價低、精度高、壽命長、而且安全可靠、調(diào)整方便、適于頻繁使用。本次設(shè)計的題目是基于DSP微控制器定時器設(shè)計。本文設(shè)計了一種以TMS320F28335DSP微控制器為核心的定時器。利用內(nèi)部定時器0和PIE外設(shè)中斷擴(kuò)展模塊產(chǎn)生定時中斷,并進(jìn)行逆行計數(shù)。通過SPI串行外設(shè)接口在DSP和74HC164之間進(jìn)行通信,進(jìn)而實現(xiàn)在數(shù)碼管上通過動態(tài)掃描顯示定時時間。本系統(tǒng)通過矩陣鍵盤控制定時器開啟和暫停。在定時器暫停時,還可以通過鍵盤重新輸入定時初值。當(dāng)定時結(jié)束時,還會通過LED燈閃爍報警,提示定時結(jié)束。關(guān)鍵詞:定時器,DSP,TMS320F28335,串行外設(shè)接口,矩陣鍵盤
AbstractWiththeprogressofthetimesandthedevelopmentofelectronicindustry,thetimerisusedmoreandmorewidely.Thetraditionalmechanicaltimer,electrictimerisdrivedthroughthespring,ACsynchronousmotororquartzsteppermotor.Theaccuracyofthistimerisnothighandtheerrorislarge.Comparedwiththeformertwotimer,electronictimerhassmallvolume,lightweight,lowcost,highprecision,longservicelife,andelectronictimerissafetyandreliability,convenientadjustment,suitableforfrequentuse.ThetopicofthisdesignistimerdesignbasedontheDSPmicrocontroller.ThispaperdesignsatimerwiththecoreofTMS320F28335DSPmicrocontroller.Generatingatimerinterruptandcountingretrogradelybyusingtheinternaltimer0andPIEperipheralinterruptexpansionmodule.CommunicatebetweenDSPand74HC164throughtheSPIserialperipheralinterface,soastoachievedisplayingtimeonthedigitaltubebydynamicscanning.Thesystemisturnedonandpausedthroughthematrixkeyboard.Inthetimerpause,initialvaluecanbeinputedthroughthekeyboard.Whenthetimingisover,systemwillalarmthroughLEDlightsflashing,promptingtheendoftiming.KeyWords:timer,DSP,TMS320F28335,SPI,matrixkeyboard
目錄1緒論 11.1系統(tǒng)背景 11.1.1定時器的分類 11.1.2定時器的應(yīng)用 21.2定時器系統(tǒng)概述 21.3定時器設(shè)計及實現(xiàn)的功能 21.3.1設(shè)計過程 21.3.2定時器方案的確定 31.3.3定時器的功能 32定時器系統(tǒng)的硬件設(shè)計 42.1總體硬件設(shè)計 42.2DSP微控制器 52.3定時器中斷的實現(xiàn) 62.3.1DSP內(nèi)部定時器 62.3.2PIE外設(shè)中斷擴(kuò)展模塊 72.4數(shù)碼管顯示電路 82.4.1SPI串行外設(shè)接口 92.4.274HC164 122.4.3數(shù)碼管 132.5按鍵控制電路 162.5.1矩陣鍵盤的概述 162.5.2矩陣鍵盤的硬件設(shè)計 162.5.3按鍵接口的消抖 172.6LED顯示電路 183定時器軟件的設(shè)計 193.1主函數(shù)程序設(shè)計 193.2SPI的初始化 193.3定時器、數(shù)碼管,按鍵及其他外設(shè)的初始化 213.3.1定時器的初始化 213.3.2其他外設(shè)的初始化 213.4cpu中斷及其PIE的設(shè)置 223.5設(shè)置定時器0的周期、打開定時器、看門狗和開中斷 223.5.1設(shè)定定時器的周期 223.5.2打開定時器 223.5.3開中斷 233.5.4開啟看門狗 233.6主要功能的實現(xiàn) 233.6.1定時器中斷子程序的設(shè)計 233.6.2SPI通信與數(shù)碼管顯示程序的設(shè)計 243.6.3矩陣鍵盤程序設(shè)計 263.6.4核心功能的設(shè)計 294總結(jié) 33參考文獻(xiàn) 34致謝 351緒論1.1系統(tǒng)背景人類最早使用的定時工具是沙漏或水漏,但在鐘表誕生發(fā)展成熟之后,人們開始嘗試使用這種全新的計時工具來改進(jìn)定時器,達(dá)到準(zhǔn)確控制時間的目的。而隨著時代的進(jìn)步,科技的發(fā)展,定時器歷經(jīng)了機(jī)械式,電動式兩個階段后發(fā)展到電子式定時器?,F(xiàn)在的定時器廣泛運(yùn)用與工業(yè)控制,家用電器甚至軍工領(lǐng)域,成為現(xiàn)在社會不可或缺的電子設(shè)備。1.1.1定時器的分類定時器按結(jié)構(gòu)可分為機(jī)械式、電動式和電子式三類。機(jī)械式定時器,以發(fā)條為原動力,用擒縱調(diào)速器控制走時精度,通過齒輪傳動和凸輪,按時間控制機(jī)構(gòu)預(yù)置的時段操縱執(zhí)行機(jī)構(gòu)動作。計時精度要求不高的定時器(如風(fēng)扇定時器、洗衣機(jī)定時器、廚房用定時器、照相暗房用定時器、電視機(jī)控制用定時器、電燈開關(guān)定時器),一般采用無固有振動周期的調(diào)速器。這些定時器都是在手動上發(fā)條的同時預(yù)置時限,定時精度不高,但結(jié)構(gòu)簡單,使用方便。電動式定時器,用交流同步電動機(jī)或石英步進(jìn)電機(jī)驅(qū)動,通過齒輪傳動和凸輪簧片觸點機(jī)構(gòu),按預(yù)置的時段或時刻控制執(zhí)行機(jī)構(gòu)。其中短時段控制的電動式定時器可用于程序控制式洗衣機(jī)、洗碗機(jī)、微波爐、烘箱及時間繼電器等;長時段電動式定時器是一種24小時或7天程序控制的開關(guān)裝置,可預(yù)置開關(guān)動作多次,最短時間控制間隔一般為15分鐘,可用于用戶用電情況監(jiān)控、照明控制、實驗室裝置控制、空調(diào)器控制和自動生產(chǎn)線上某些設(shè)備的定時控制等。電子式定時器,利用石英振蕩器或民用交流電的標(biāo)準(zhǔn)頻率,經(jīng)過分頻計數(shù)組成時間累加器或數(shù)字鐘,按照預(yù)置的時間編碼輸出控制信號。這種定時器走時精確,時間設(shè)定沒有誤差,定時精度高,控制程序多。其中長時段定時器最小控制時段一般為一分鐘,配上微處理器后能精確地編制一年的時間程序,組成多路可編程序的定時器。電子式定時器在工業(yè)自動化控制系統(tǒng)中應(yīng)用廣泛,它也是節(jié)約能源管理中一種有效的技術(shù)措施。電子定時器類的電子定時開關(guān)鐘,可用于按高、平、低峰用電收取不同電費(fèi)制度的場合,它將一天內(nèi)的用電高峰、平峰、低谷時間在定時開關(guān)中設(shè)定,并分別接通3種電表進(jìn)行計費(fèi)。電子式定時器在科學(xué)實驗中和在微波爐、電飯鍋、洗衣機(jī)等電器中也有使用。1.1.2定時器的應(yīng)用隨著時代的進(jìn)步,定時器的應(yīng)用越來越廣泛。電子定時器在工業(yè)中經(jīng)常用于延時自動開關(guān)、定時、報警。在家用電器中經(jīng)常用于延時自動開關(guān)、定時。延時自動開關(guān)可用于電視機(jī)、收音機(jī)、錄音機(jī)、催眠器、門燈、路燈、汽車頭燈、轉(zhuǎn)彎燈以及其他電器的延時斷電和延時自停電源。定時可用于照相定時曝光、定時閃光、定時調(diào)速、定時烘箱、冰箱門定時報警、定時水位報警、延時催眠器、延時電鈴、延時電子鎖、觸摸定時開關(guān)等等。例如數(shù)控機(jī)床的定時器,在工作一段時間后便能自動切斷電源停止工作。此外,DSP中的定時器還可用于數(shù)模和模數(shù)轉(zhuǎn)換,信號的采樣,伺服位置控制,數(shù)字振蕩器的設(shè)計等等。1.2定時器系統(tǒng)概述本系統(tǒng)主要分為由DSP微控制器,數(shù)碼管,矩陣鍵盤三部分。DSP微控制器用來處理定時器程序;利用DSP的SPI接口和74HC164八位串入、并出移位寄存器相連,進(jìn)行串行通信,再由74HC164寄存器將段碼并行輸出給數(shù)碼管從而顯示數(shù)字;矩陣鍵盤與DSP的GPIO口相連接,以掃描的方式識別鍵值,實現(xiàn)鍵盤對定時器的控制。1.3定時器設(shè)計及實現(xiàn)的功能1.3.1設(shè)計過程進(jìn)行定時器的設(shè)計首先就要熟悉DSP的編程環(huán)境,本次編程使用的是CCS(CodeComposerStudio)軟件,具體運(yùn)用的語言為C語言。程序調(diào)試成功后通過JTAG將程序下載到DSP的RAM中進(jìn)行硬件調(diào)試,程序具體實現(xiàn)功能見1.3.3的功能實現(xiàn)。 CCS是它是美國德州儀器公司(TexasInstrument,TI)出品的代碼開發(fā)和調(diào)試套件。TI公司的產(chǎn)品線中有一大塊業(yè)務(wù)是數(shù)字信號處理器(DSP)和微處理器(MCU),CCS是TI公司專門為DSP軟件工程師設(shè)計的集編譯、仿真、下載為一體的DSP開發(fā)軟件,可以通過CCS新建工程、編譯仿真工程、在線調(diào)試、下載程序。1.3.2定時器方案的確定隨著DSP控制器性價比不斷提高,新一代產(chǎn)品的應(yīng)用越來越廣泛,大可應(yīng)用于復(fù)雜的工業(yè)過程控制系統(tǒng),進(jìn)行復(fù)雜的數(shù)字信號處理功能,如圖像處理,雷達(dá)信號處理等,小則可以用于家電控制,甚至能夠用來做兒童電子玩具。它功能強(qiáng)大,體積小,重量輕,靈活好用,配以適當(dāng)?shù)慕涌谛酒梢詷?gòu)造各種各樣、功能各異的微電子產(chǎn)品。鑒此,本文設(shè)計開發(fā)了一種基于DSP微控制器的多用途定時器,它造價低,功能全,性價比高,配以小鍵盤和數(shù)碼管顯示,可適應(yīng)各種場合的定時預(yù)警之用。為了實現(xiàn)定時器系統(tǒng)的主要功能,除了要有電源設(shè)備、時鐘電路、復(fù)位電路等必備設(shè)備之外,還有必不可少的數(shù)碼管及其驅(qū)動電路,為了在定時結(jié)束時、報警,必須還有LED燈,為了能夠用鍵盤控制定時器狀態(tài)和輸入時間,還需要矩陣鍵盤及其控制電路??偟膩碚f,綜合以上的各功能電路和相應(yīng)的軟件程序相結(jié)合,便能實現(xiàn)一個功能強(qiáng)大的多位定時器。1.3.3定時器的功能本次設(shè)計的課題是基于DSP為控制器定時器設(shè)計,相關(guān)功能如下:1.實現(xiàn)定時功能,最大定時時間為100分鐘。2.通過四個七段數(shù)碼管顯示當(dāng)前的定時時間,更新的定時時間。3.通過鍵盤控制定時器開始定時和暫停定時,暫停后,再按下開始鍵,則從暫停的時間點繼續(xù)定時。4.在暫停定時階段,可以利用鍵盤上的數(shù)字鍵0~9重新設(shè)定定時時間,在按下開始鍵,則定時器開始從剛剛設(shè)置的定時時間重新開始定時。5.定時結(jié)束時,LED燈開始不斷閃爍,提示定時時間到。
2定時器系統(tǒng)的硬件設(shè)計2.1總體硬件設(shè)計本系統(tǒng)采用德州儀器的TMS320F28335DSP微控制器作為核心部件。輔以7段數(shù)碼管,按鍵矩陣,LED燈,74HC164芯片共同完成定時器的定時功能。方案設(shè)計框圖如下所示:圖2-1系統(tǒng)總體方案設(shè)計圖定時器工作過程如下:1.只通電或復(fù)位狀態(tài)8位共陽數(shù)碼管不顯示任何字符;2.按下“開始”鍵后,定時器開啟,數(shù)碼管顯示定時時間并進(jìn)行逆行計數(shù),默認(rèn)情況下定時時間為1分鐘3.定時過程中可按下“暫?!辨I,則暫停計時,數(shù)碼管顯示“”;4.暫停階段,可通過鍵盤上的數(shù)字鍵重新設(shè)定定時時間;5.定時時間設(shè)定好之后,按下“開始”鍵則定時器按照重新設(shè)定的定時時間開始定時,若沒有設(shè)置新的定時時間,則從暫停時的時間點繼續(xù)定時。6.定時時間到,停止定時,數(shù)碼管上顯示“0000”,LED燈開始閃亮,提示定時結(jié)束。根據(jù)設(shè)計要求,本系統(tǒng)主要硬件電路由DSP微控制器、按鍵、共陽數(shù)碼管、LED顯示電路組成。1.按鍵的輸入:矩陣鍵盤上鍵有十個按鍵設(shè)定為0~9數(shù)字輸入功能,另外兩個鍵作為時間設(shè)定的控制鍵,分別為暫停,開始。矩陣鍵盤由GPIO00~GPIO03輸入,GPIO50~GPIO53輸出。2.定時器的顯示電路:顯示時間由4位共陽數(shù)碼管顯示,首先由DSP與74HC164進(jìn)行SPI串行同步通信,將數(shù)碼管需要的段碼傳輸給74HC164,再由74HC164將段碼并行輸出給數(shù)碼管,達(dá)到數(shù)碼管顯示的目的。DSP的GPIO54和GPIO56設(shè)置為SPI的數(shù)據(jù)發(fā)送和時鐘端,GPIO58~59和GPIO62~63設(shè)置為數(shù)碼管的位選端3.定時器的報警系統(tǒng)通過DSP芯片的GPIO4引腳來控制LED燈閃亮提示報警。4.定時器的時鐘電路通過在DSP芯片外部連接一個30MHz的石英晶體振蕩器。系統(tǒng)工作是通過編程選擇5倍頻的PLL鎖相環(huán)使得DSP工作在最高主頻150MHz。以上是對定時器的硬件組成和具體工作流程進(jìn)行了大體的介紹,現(xiàn)對其各功能的實現(xiàn)方式分別進(jìn)行講解。2.2DSP微控制器DSP(DigitalSignalProcessor)是一種獨特的微處理器,是以數(shù)字信號來處理大量信息的器件。其工作原理是接收模擬信號,轉(zhuǎn)換為0或1的數(shù)字信號。再對數(shù)字信號進(jìn)行修改、刪除、強(qiáng)化,并在其他系統(tǒng)芯片中把數(shù)字?jǐn)?shù)據(jù)解譯回模擬數(shù)據(jù)或?qū)嶋H環(huán)境格式。它不僅具有可編程性,而且其實時運(yùn)行速度可達(dá)每秒數(shù)以千萬條復(fù)雜指令程序,遠(yuǎn)遠(yuǎn)超過通用微處理器,是數(shù)字化電子世界中日益重要的電腦芯片[1]。它的強(qiáng)大數(shù)據(jù)處理能力和高運(yùn)行速度,是最值得稱道的兩大特色。 本程序使用的TMS320F28335型數(shù)字信號處理器是TI公司的一款TMS320C28X系列浮點DSP控制器。與以往的定點DSP相比,該器件的精度高,成本低,功耗小,性能高,外設(shè)集成度高,數(shù)據(jù)以及程序存儲量大,A/D轉(zhuǎn)換更精確快速等。TMS320F28335具有150MHz的高速處理能力,具備32位浮點處理單元,6個DMA通道支持ADC、McBSP和EMIF,有多達(dá)18路的PWM輸出,其中有6路為TI特有的更高精度的PWM輸出(HRPWM),12位16通道ADC。得益于其浮點運(yùn)算單元,用戶可快速編寫控制算法而無需在處理小數(shù)操作上耗費(fèi)過多的時間和精力,與前代DSC相比,平均性能提高50%,并與定點C28x控制器軟件兼容,從而簡化軟件開發(fā),縮短開發(fā)周期,降低開發(fā)成本[2]。2.3定時器中斷的實現(xiàn) 為了實現(xiàn)定時器的精確走時功能,本系統(tǒng)利用定時器0、PIE模塊和CPU中斷共同作用產(chǎn)生定時器中斷。首先為定時器0設(shè)置定時初值,并開啟定時器使其計數(shù)。當(dāng)定時器計數(shù)器寄存器遞減到零時,定時器會產(chǎn)生一個中斷TINT并將其傳送給PIE外設(shè)中斷模塊,當(dāng)PIE中的中斷時能位PIEIER被時能后,PIE會將這個中斷傳送給CPU,如果CPU的中斷使能位和INTM被使能,則CPU會相應(yīng)定時器0中斷,轉(zhuǎn)而執(zhí)行定時器0的中斷服務(wù)子程序。2.3.1DSP內(nèi)部定時器TMS320F28335芯片內(nèi)部具有3個32位的CPU定時器——Timer0、Timerl和Timer2。其中CPU定時器2被系統(tǒng)保留,用于實時操作系統(tǒng),例如DSP/BIOS;只有CPU定時器0和定時器1可以供用戶使用。在本系統(tǒng)中使用的是定時器0,定時器0的內(nèi)部原理圖如下所示:圖2-2定時器0內(nèi)部結(jié)構(gòu)圖Cpu定時器的通常工作過程如下,首先把周期寄存器PRDH:PRD的值裝入32位計數(shù)寄存器TIMH:TIM中。接著每經(jīng)過一個TIMCLK周期,計數(shù)器就遞減一次,最后當(dāng)計數(shù)寄存器TIMH:TIM等于0時,定時器中斷輸出信號產(chǎn)生一個中斷脈沖。其中,TIMCLK由定時器分頻器TDDRH:TDDR和定時器預(yù)定標(biāo)計數(shù)器PSCH:PSC來控制。先給定時器分頻器TDDRH:TDDR賦值,然后裝載入預(yù)定標(biāo)計數(shù)器PSCH:PSC中,每隔一個SYSCLKOUT脈沖,PSCH:PSC中的值減1。當(dāng)PSCH:PSC中的值為0的時候,就會輸出一個TIMCLK,從而TIMH:TIM減1。在下一個定時器輸入時鐘周期開始時,TDDRH:TDDR中的值重新裝載人PSCH:PSC中,周而復(fù)始地循環(huán)下去[3]。因此,TIMCLK就等于(TDDRH:TDDR+1)個系統(tǒng)時鐘的時間[3]。當(dāng)32位計數(shù)器寄存器TIMH:TIM中的值遞減到零時,定時器0會產(chǎn)生一個中斷TINT,并傳送給PIE,PIE對這個中斷的處理詳見.2PIE外設(shè)中斷擴(kuò)展模塊PIE一共可以支持96個不同的中斷,并把這些中斷分成了12個組,每個組有8個中斷,而且每個組都被反饋到CPU內(nèi)核的INT1~INT12這12條中斷線中的某一條上。平時能夠用到的所有的外設(shè)中斷都被歸人了這96個中斷中,被分布在不同的組里[3]。F28335的中斷采用的是三級中斷機(jī)制,分別為外設(shè)級、PIE級和CPU級。對于某一個具體的外設(shè)中斷請求,只要有任意一級不許可,CPU最終都不會響應(yīng)該外設(shè)中斷。圖2-3PIE模塊原理圖1.外設(shè)級中斷一般來說,在程序執(zhí)行過程中,某一個外設(shè)產(chǎn)生了一個中斷事件,那么在這個外設(shè)的某個寄存器中與該中斷事件相關(guān)的中斷標(biāo)志位(IF=InterruptFlag)被置為1。此時,如果該中斷相應(yīng)的中斷使能位(IE=InterruptEnable)已經(jīng)被置位,也就是值為1,該外設(shè)就會向PIE控制器發(fā)出一個中斷請求。相反,雖然中斷事件已經(jīng)發(fā)生了,相應(yīng)的中斷標(biāo)志位也被置位了,但是該中斷沒有被使能,也就是中斷使能位的值為0,那么外設(shè)就不會向PIE控制器提出中斷請求。但在本系統(tǒng)中,定時器0內(nèi)部的計數(shù)寄存器一旦遞減到零,就會向PIE產(chǎn)生一個中斷請求TINT,而無需經(jīng)過外設(shè)內(nèi)部的中斷位置位。2.PIE級PIE模塊的8個外設(shè)中斷和外部引腳中斷復(fù)用一個CPU中斷,這些中斷被分為12組,即一組中的中斷復(fù)用一個CPU中斷。對于復(fù)用的中斷源,PIE模塊中的每個中斷組都有一個中斷標(biāo)志寄存器(PIEIFR(x,y))和中斷使能寄存器(PIEIER(x,y)),其中x=PIE組1~PIE組12,y表示一組中的8個復(fù)用中斷,這樣,PIEIFRx,y和PIEIERx,y將對應(yīng)PIE組x(x=1~12)中的中斷y(y=1~8),即代表相應(yīng)的中斷標(biāo)志位和中斷使能位。另外,每一個PIE中斷組中還存在一個中斷應(yīng)答位PIEACK。當(dāng)外設(shè)向PIE控制器發(fā)送中斷請求時,則相應(yīng)的PIE中斷標(biāo)志位(PIEIFRx,y)置位,如果相應(yīng)的PIE中斷使能位PIEIER(x,y)也置位,則PIE將檢查相應(yīng)的PIEACKx位,以確定CPU是否為該組中斷準(zhǔn)備好。如果PIEACKx位被清除,則PIE會向CPU發(fā)送中斷請求,如果PIEACKx位是1,則PIE將一直等待到該位被清除才向CPU發(fā)送中斷請求。定時器0的中斷TINT使用的時PIE中的第一組的第七個中斷。也就是說,當(dāng)定時器向PIE發(fā)出中斷請求TINT時,PIE的PIEIFR(1,7)會置位,如果PIEIER(1,7)置位且PIEACK1被清除,則此中斷才會被傳送到CPU級中3.CPU級當(dāng)中斷請求被發(fā)送到CPU。相應(yīng)的CPU中斷標(biāo)志位置1,當(dāng)中斷標(biāo)志鎖存到標(biāo)志寄存器后。相應(yīng)的中斷服務(wù)程序沒有被執(zhí)行,直到CPU中斷使能寄存器(IER)或調(diào)試中斷寄存器(DBGIER)和全局中斷屏蔽位(INTM)被使能后才能執(zhí)行。由于定時器0占用的是PIE第一組的第七個中斷線。所以在CPU級中,定時器0的中斷是經(jīng)過CPU的第一條中斷線INT1進(jìn)行傳輸?shù)摹.?dāng)定時器0的中斷傳輸?shù)紺PU級后,IFR1會被置位,如果IER和INTM都被使能,那么定時器0的中斷服務(wù)子程序才會被執(zhí)行。2.4數(shù)碼管顯示電路 本系統(tǒng)的數(shù)碼管顯示電路主要由SPI、74HC164和4位共陽數(shù)碼管組成三部分組成。其中SPI串行通信接口負(fù)責(zé)把數(shù)碼管需要的數(shù)據(jù)一位一位的傳送給74HC164芯片,再由74HC164將數(shù)碼管所需的段碼并行輸出給數(shù)碼管,這樣數(shù)碼管就可以顯示數(shù)據(jù)了。圖2-4顯示系統(tǒng)電路原理圖 數(shù)碼管顯示系統(tǒng)的電路連接原理圖如上圖所示。 首先,數(shù)據(jù)要利用SPI在DSP和74HC164之間進(jìn)行通信。由于74HC164有兩個輸入端A和B,而本系統(tǒng)只用到了一個輸入,所以把這兩個輸入端都接上SPI的主出從入線,74HC164的時鐘信號端自然是接SPI的SCLK線,因為通信過程中的時鐘信號始終是由主機(jī)提供的,而74HC164只是從機(jī)。其次74HC164還有8個輸出QA~QH,其中QA是高位,QH是低位,所以QA接數(shù)碼管的小數(shù)點DP位,QB~QH分別接數(shù)碼管的g~a位。最后,四位數(shù)碼管的四條位選線分別接三極管的發(fā)射極。三極管的集電極接+5V電源,基極分別接DSP的四個GPIO口52、53、54和55。數(shù)碼管通過動態(tài)掃描的方式進(jìn)行輪流點亮。2.4.1SPI串行外設(shè)接口SPI是SerialPeripheralInterface的縮寫,翻譯成中文就是串行外圍設(shè)備接口。SPI最早是由Freescale(原Motorola)公司在其MC68HCxx系列處理器上定義的一種高速同步串行通信接口。SPI通常用于DSP和外設(shè)及其他處理器之間的通信。典型的應(yīng)用包括擴(kuò)展 I/O,還可以通過移動寄存器,顯示驅(qū)動器、模擬轉(zhuǎn)換器等器件所做的外設(shè)擴(kuò)展。SPI支持主/從模式的多機(jī)通信。F28335系列DSP還支持一個16級深度的接受發(fā)送FIFO、用來減少CPU的開銷[5]。1、SPI的通信原理。SPI以主從方式進(jìn)行工作,這種模式的通信系統(tǒng)中通常有一個主設(shè)備和多個從設(shè)備。其中,CS信號是用來控制從機(jī)的芯片是否被選中的。系統(tǒng)內(nèi)如果有一個主設(shè)備M1和兩個從設(shè)備S1和S2。當(dāng)SI的片選信號為低電平時,S1被選中,Ml通過MOSI引腳發(fā)送數(shù)據(jù),S1通過MOSI引腳接收數(shù)據(jù),或者S1通過MISO引腳發(fā)送數(shù)據(jù),而M1通過MISO引腳接收數(shù)據(jù)。同樣的,當(dāng)S2的片選信號CS為低電平時,S2被選中,M1通過MOSI引腳發(fā)送數(shù)據(jù),S2通過MOSI引腳接收數(shù)據(jù),或者s2通過MISO引腳發(fā)送數(shù)據(jù),而M1通過MISO引腳接收數(shù)據(jù)。從機(jī)只有通過CS信號被選中之后,對此從機(jī)的操作才一會有效,可見片選信號的存在使得允許在同一總線上連接多個SPI設(shè)備成為可能。當(dāng)從機(jī)被選中,和主機(jī)建立連接之后,接下來起作用的就是負(fù)責(zé)通信的3根線了。通信時通過進(jìn)行數(shù)據(jù)交換來完成,這里首先要知道SPI采用的是串行通信協(xié)議,也就是說通信時數(shù)據(jù)是一位一位進(jìn)行傳輸?shù)?。這也是SCK時鐘信號存在的原因,傳輸時,由SCK提供時鐘脈沖,MOSI和MISO引腳則是基于此脈沖完成數(shù)據(jù)的發(fā)送或者接收。當(dāng)M1給S1發(fā)送數(shù)據(jù)時,數(shù)據(jù)在時鐘脈沖的上升沿或者下降沿時通過MI的MOSI引腳發(fā)送,在緊接著的下降沿或者上升沿時通過S1的MOSI引腳接收[6]。當(dāng)S1給M1發(fā)送數(shù)據(jù)時,原理是一樣的,只不過通過MISO引腳來完成。值得注意的是,SCK信號只由主設(shè)備控制,從設(shè)備不能控制時鐘信號線。因此,在一個基于SPI的系統(tǒng)中,必須至少有一個主控設(shè)備,其向整個SPI系統(tǒng)提供時鐘信號,系統(tǒng)內(nèi)所有的設(shè)備都基于這個時鐘脈沖進(jìn)行數(shù)據(jù)的接收或者發(fā)送,所以SPI是同步串行通信接口。在點對點的通信中,SPI接口不需要尋址操作,且為全雙工通信,因此顯得簡單高效。2、SPI模塊介紹。圖2-5SPI模塊內(nèi)部結(jié)構(gòu)圖1)4個外部引腳SPISOMI:SPI從輸出/主輸入引腳;SPISIMO:SPI從輸入/主輸出引腳SPISTE:SPI從傳送使能引腳;SPICLK:SPI串行時鐘引腳。2)有兩種工作模式可以選擇:主工作模式和從工作模式。3)波特率:具有125種可編程的波特率。能夠使用的最大波特率受到I/O緩沖器最大緩存速度的限制,這些緩沖器是使用在SPI引腳上的I/O緩沖器,而最高的波特率不能超過LSPCLK/4。4)依次發(fā)送的數(shù)據(jù)字的長度為1~~16s位,可以通過寄存器設(shè)定。5)能選擇的4種脈沖時鐘配置方案.6)接收和發(fā)送可以同步操作,也就是說可以實現(xiàn)全雙工通信。當(dāng)然,發(fā)送功能可以通過SPICTL,寄存器的TALK位禁止或者使能。7)與SCI相同,發(fā)送和接收都能通過查詢或者中斷方式來實現(xiàn)。8)具有6個控制寄存器、3個數(shù)據(jù)寄存器和3個FIFO寄存器。值得注意的是,SPI所有的控制寄存器都是8位,當(dāng)寄存器被訪問時,數(shù)據(jù)位于低8位,而高8位為0,因此把數(shù)據(jù)寫人SPI這6個控制寄存器的高8位是無效的。但是,3個數(shù)據(jù)寄存器SPIRXBUF,SPITXBUF和SPIDAT都是16位的。3個FIFO寄存器也是16位。3、SPI的主從工作方式圖2-6SPI主從通信原理圖圖示的是典型的SPI工作于主機(jī)模式,系統(tǒng)中有兩個處理器,處理器1的SPI工作于主機(jī)模式,而處理器2的SPI工作于從機(jī)模式。SPI工作控制寄存器SPICTL的MASTER/SLAVE位決定了SPI工作于何種模式,當(dāng)MASTER/SLAVE=1時,SPI工作于主機(jī)模式,而當(dāng)MASTER/SLAVE=0時,SPI工作于從機(jī)模式。從圖中也可以看到,時鐘信號SPICLK是由主機(jī)提供給從機(jī)的,主機(jī)和從機(jī)在SPICLK的協(xié)調(diào)下同步進(jìn)行數(shù)據(jù)的發(fā)送或者接收,數(shù)據(jù)在時鐘脈沖信號的上升沿或者下降沿進(jìn)行發(fā)送或者讀取。當(dāng)然,主機(jī)和從機(jī)之間進(jìn)行通信的前提是從機(jī)片選信號SPISTE為低電平,將SPI從機(jī)選中,也就是將處理器2選中。主機(jī)和從機(jī)之間可以同時實現(xiàn)數(shù)據(jù)的發(fā)送和接收,也就是說可以工作于全雙工模式。本定時器系統(tǒng)使用的是主控制器模式,在主控制器模式下,SPI通過SPICLK引腳為整個串行通信網(wǎng)絡(luò)提供串行時鐘。數(shù)據(jù)是從SPISIMO引腳輸出,并將鎖存SPISOMI引腳輸入的數(shù)據(jù)。SPIBRR(波特率寄存器)可以配置126種不同的位傳輸率,該寄存器決定了整個串行通信網(wǎng)絡(luò)發(fā)送和接受數(shù)據(jù)的位傳輸率。寫入SPIDAT(串行數(shù)據(jù)寄存器)或SPITXBUF(串行輸出緩沖寄存器)的書籍啟動SPISOMI引腳的數(shù)據(jù)發(fā)送,數(shù)據(jù)的最高位(MSB)最先發(fā)送。與此同時,接受的數(shù)據(jù)通過SPISOMI引腳移入SPIDAT的最低有效位(LSB)。當(dāng)設(shè)定的位發(fā)送完畢后。已接受的數(shù)據(jù)移入SPIRXBUF供CPU讀取。數(shù)據(jù)以右對齊的方式存儲于SPIRXBUF寄存器中。4、波特率的設(shè)置SPI通過對寄存器SPIIBRR的配置,可以實現(xiàn)125種不同的波特率,計算公式如下:當(dāng)SPIBRR=0、1、2時:SPIBaudRate=LSPCLK/4(2-1)當(dāng)SPIBRR=3-127時:SPIBaudRate=LSPCLK/(SPIBRR+1)(2-2)式(2-1)和式(2-2)中的LSPCLK為DSP的低速外設(shè)時鐘頻率。從上面的波特率計算公式可以看出,SPI模塊最大的波特率為LSPCLK/4。從式(2-2)可以看出,當(dāng)SPIBRR為奇數(shù)時,(SPIBRR+1)為偶數(shù),SPICLK信號高電平與低電平在一個周期內(nèi)保持對稱;當(dāng)SPIBRR為偶數(shù)時,(SPIBRR+1)為奇數(shù),SPICLK信號高電平和低電平在一個周期內(nèi)不對稱[7]。當(dāng)時鐘極性位被清零時,SPILCK的低電平比高電平多一個系統(tǒng)時鐘周期;當(dāng)時鐘極性被置位時,SPICLK的高電平比低電平多一個系統(tǒng)時鐘周期。2.4.274HC16474HC164是8位串入、并出移位寄存器,主要用于數(shù)字電路和LED顯示控制電路應(yīng)用。74HC164串行輸入數(shù)據(jù),然后并行輸出。數(shù)據(jù)通過兩個輸入端(DSA或DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數(shù)據(jù)輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空,所以在本系統(tǒng)中,本設(shè)計將兩個輸入端A和B連接在一起都接在SPI的輸出口上。時鐘(CP)每次由低變高時,數(shù)據(jù)右移一位,輸入到Q0,Q0是兩個數(shù)據(jù)輸入端(DSA和DSB)的邏輯與,它將上升時鐘沿之前保持一個建立時間的長度。主復(fù)位(MR)輸入端上的一個低電平將使其它所有輸入端都無效,同時非同步地清除寄存器,強(qiáng)制所有的輸出為低電平。圖2-774HC164引腳圖表2-174HC164引腳說明符號管腳名稱管腳號描述A,B數(shù)據(jù)輸入1,2該管腳為與門輸入QA~QH數(shù)據(jù)輸出3,4,5,6,10,11,12,13并行輸出口CLK時鐘輸入8在上升沿讀取串行數(shù)據(jù)CLR復(fù)位9端口輸入為低時,所有輸入無效,所有輸出清零,端口為高時,輸出數(shù)據(jù)VDD邏輯電源15電源GND邏輯地7系統(tǒng)地2.4.3數(shù)碼管數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管,是常用的一種顯示輸出元件。按能顯示多少個“8”可分為1位、2位、4位等等數(shù)碼管;按發(fā)光二極管單元連接方式分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管,其在應(yīng)用時應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時,相應(yīng)字段就點亮;當(dāng)某一字段的陰極為高電平時,相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管,其在應(yīng)用時應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,相應(yīng)字段就點亮;當(dāng)某一字段的陽極為低電平時,相應(yīng)字段就不亮。圖2-8七段數(shù)碼管示意圖1.數(shù)碼管連接原理圖數(shù)碼管有共陽和共陰兩種,由于共陰數(shù)碼管要靠微控制器DSP提供電流,顯示效果往往沒有共陽數(shù)碼管好,所以本系統(tǒng)采用的是共陽數(shù)碼管。共陽極數(shù)碼管是將所有發(fā)光二極管的陽極接在一起作為公共端COM,當(dāng)公共端接高電平時,某一段陰極上的電平為“0”時,該段點亮,電平為“1”時,該段熄滅。本程序用的是共陽連接方式。圖2-9共陽數(shù)碼管連接原理圖表2-2共陽數(shù)碼管段碼表字型DPGFEDCBA段碼011000000C0H111111001F9H210100100A4H310110000B0H41001100199H51001001092H61000001082H711111000F8H81000000090H91001000090H2.驅(qū)動方式1)靜態(tài)顯示驅(qū)動靜態(tài)驅(qū)動也稱直流驅(qū)動。靜態(tài)驅(qū)動是指每個數(shù)碼管的每一個段碼都由一個GPIO端口進(jìn)行驅(qū)動,或者使用如BCD碼二~十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動。靜態(tài)驅(qū)動的優(yōu)點是編程簡單,顯示亮度高,缺點是占用I/O端口多,如驅(qū)動5個數(shù)碼管靜態(tài)顯示則需要5×8=40根I/O端口來驅(qū)動,實際應(yīng)用時必須增加譯碼驅(qū)動器進(jìn)行驅(qū)動,增加了硬件電路的復(fù)雜性。2)動態(tài)顯示驅(qū)動數(shù)碼管動態(tài)顯示接口是應(yīng)用最為廣泛的一種顯示方式之一,動態(tài)驅(qū)動是將所有數(shù)碼管的8個顯示筆劃“A,B,C,D,E,F,G,DP”的同名端連在一起,另外為每個數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當(dāng)微控制器輸出字形碼時,所有數(shù)碼管都接收到相同的字形碼,但究竟是那個數(shù)碼管會顯示出字形,取決于微控制器對位選通COM端電路的控制,所以只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會亮。通過分時輪流控制各個數(shù)碼管的的COM端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)驅(qū)動。在輪流顯示過程中,每位數(shù)碼管的點亮?xí)r間為1~2ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實際上各位數(shù)碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低。本文所用的的是共陽數(shù)碼管動態(tài)顯示,如上文所示,4位數(shù)碼管的8個段選位統(tǒng)一接到74HC164數(shù)據(jù)輸出端,而4個位選端則通過三極管放大電路接到了DSP芯片上不同的4個GPIO接口上。當(dāng)數(shù)碼管要顯示數(shù)字時,74HC164將段碼輸出給4個數(shù)碼管,由DSP控制4個GPIO端口分時輪流點亮,從而實現(xiàn)4個數(shù)碼管同時點亮的現(xiàn)象。2.5按鍵控制電路2.5.1矩陣鍵盤的概述矩陣鍵盤是微控制器外部設(shè)備中所使用的排布類似于矩陣的鍵盤組。在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,8個GPIO就可以構(gòu)成4×4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。2.5.2矩陣鍵盤的硬件設(shè)計矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,行線KX4~KX1的一端通過電阻接正電源另一端接DSP的GPIO50~GPIO53口作為輸入,列線KY4~KY1分別接DSP的GPIO00~GPIO03口作為輸出。具體的識別及編程方法如下所述。圖2-10矩陣鍵盤硬件連接原理圖如圖所示:1.設(shè)置KY1、KY2、KY3和KY4作為輸出口,設(shè)置KX1、KX2、KX3和KX4作為輸入口2.設(shè)置KY1、KY2、KY3和KY4全部輸出低電平,3.當(dāng)有按鍵被按下時,檢測KX1、KX2、KX3和KX4中哪個是低電平,這樣就可以確定是哪行的按鍵被按下;4.確定行之后,讓KY1、KY2、KY3和KY4輸出的電平依次由低變高,這樣如果KYn輸出高電平的時候,KX接收到的電平也由低變高,由此就說明是KYn列的按鍵被按下,按鍵的位置就被確定了。2.5.3按鍵接口的消抖通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點斷開、閉合時,由于機(jī)械觸點的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。抖動時間的長短由按鍵的機(jī)械特性決定,一般為5ms~10ms。這是一個很重要的時間參數(shù),在很多場合都要用到。按鍵穩(wěn)定閉合時間的長短則是由操作人員的按鍵動作決定的,一般為零點幾秒至數(shù)秒。鍵抖動會引起一次按鍵被誤讀多次。為確保CPU對鍵的一次閉合僅作一次處理,必須去除鍵抖動。在鍵閉合穩(wěn)定時讀取鍵的狀態(tài),并且必須判別到鍵釋放穩(wěn)定后再作處理。按鍵的消抖分為軟件消抖和硬件消抖兩種。圖2-11按鍵抖動示意圖1.硬件消抖法硬件消抖法就是在按鍵中附加去抖動電路,,從根上消除抖動產(chǎn)生的可能性。硬件消抖法就是在按鍵中附加去抖動電路,從根上消除抖動產(chǎn)生的可能性。其電路實際上是由R~S觸發(fā)器構(gòu)成的單脈沖電路。當(dāng)按鈕開關(guān)按下時Q端輸出低電平,當(dāng)開關(guān)松開時Q端恢復(fù)高電平,即輸出一個負(fù)脈沖,以此消除抖動,這種方法適合在鍵數(shù)較少時可用硬件方法消除鍵抖動。2.軟件消抖法如果按鍵較多,常用軟件方法去抖。一般來說,鍵按下的時間與操作者的按鍵動作有關(guān),約為十分之幾到幾秒不等。而鍵抖動時間與按鍵的機(jī)械特性有關(guān),一般為5~10ms不等。軟件消抖發(fā)就是即檢測出鍵閉合后執(zhí)行一個延時程序,5ms~10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。本系統(tǒng)主要采用軟件消抖法,具體過程將在軟件設(shè)計部分加以介紹。2.6LED顯示電路在定時結(jié)束后LED要不停地閃亮,提醒用戶定時結(jié)束。在本次設(shè)計中,將一個發(fā)光二極管的輸入段與電源相連接,輸出與DSP芯片的GPIO4端口相連接,當(dāng)GPIO端口為低電平時,LED點亮[9]。圖2-12LED顯示系統(tǒng)電路圖
3定時器軟件的設(shè)計3.1主函數(shù)程序設(shè)計在程序執(zhí)行之前,首先需要對DSP芯片的各個部分進(jìn)行初始化,如系統(tǒng)時鐘,CPU中斷,中斷向量表等。由于本系統(tǒng)用到了定時器,SPI,GPIO接口等部件,所以也要對這些部分進(jìn)行相應(yīng)的初始化。1.要使F28335能夠工作,在上電開始的時候就需要對F28335進(jìn)行系統(tǒng)初始化,以提供正常運(yùn)行的基本條件,例如分配時鐘信號,這是通過系統(tǒng)初始化函數(shù)來實現(xiàn)的。F28335的系統(tǒng)初始化函數(shù)是InitSysCtrl()。這個函數(shù)對PLL鎖相環(huán),看門狗(默認(rèn)為關(guān)閉),SPI等外設(shè)的時鐘都進(jìn)行了初始化。2.初始化了必要的時鐘之后,就需要對本程序中會用到的外設(shè)及其接口進(jìn)行初始化,包括SPI、定時器0、按鍵矩陣、數(shù)碼管和看門狗。3.之后就是對DSP的中斷及PIE進(jìn)行設(shè)置。初始化cpu中斷和PIE相應(yīng)的寄存器、再對中斷向量表進(jìn)行賦值。4.設(shè)定定時器0的計數(shù)周期(即每隔多久產(chǎn)生一個中斷從而進(jìn)入中斷服務(wù)子程序)、開啟計時器和看門狗。5.死循環(huán),其中編寫系統(tǒng)將要執(zhí)行的主要功能。3.2SPI的初始化由于本系統(tǒng)中用到了SPI,所以要對相關(guān)的SPI寄存器進(jìn)行初始化。SPI的初始化函數(shù)有InitSPIaGpio();SPI_init();SPI_fifo_init();這三個函數(shù)分別是對SPI的接口初始化,對SPI的功能初始化和對SPI的fifo模塊進(jìn)行初始化。InitSPIaGpio()函數(shù)在工程的DSP2833x_SPI.c文件中。前文提到,DSP的SPI模塊采用的是四線制,即主機(jī)與從機(jī)采用四根線進(jìn)行通信(SPISOMI、SPICLK、SPISTE和SPISIMO)。而進(jìn)行數(shù)據(jù)傳輸就要用到DSP的GPIO接口,因此就需要對這四根線所用到的GPIO接口進(jìn)行初始化設(shè)置,如下GpioCtrlRegs.GPBMUX2.bit.GPIO54=1;//SPISIMOAGpioCtrlRegs.GPBMUX2.bit.GPIO55=1;//SPISOMIAGpioCtrlRegs.GPBMUX2.bit.GPIO56=1;//SPICLKAGpioCtrlRegs.GPBMUX2.bit.GPIO57=1;//SPISTEA這四行語句即表示將GPIO的54、55、56和57接口設(shè)置為外設(shè)I/O模式。SPI_init()為對SPI控制寄存器進(jìn)行初始化的函數(shù)。在這個函數(shù)中,本設(shè)計對SPI的配置控制寄存器、工作控制寄存器,波特率寄存器和優(yōu)先級寄存器都進(jìn)行了相應(yīng)的初始化[9]。圖3-1SPI配置控制寄存器情況圖上圖是配置控制寄存器各位的情況圖圖3-2SPI工作配置寄存器情況圖上圖是工作配置寄存器各位的情況圖圖3-3SPI波特率寄存器情況圖上圖是波特率寄存器的情況圖圖3-4SPI優(yōu)先權(quán)寄存器情況圖上圖是優(yōu)先權(quán)寄存器的各位情況圖以下是初始化函數(shù)的主要部分SPIaRegs.SPICCR.all=0x004F; SPIaRegs.SPICTL.all=0x0006; SPIaRegs.SPIBRR=0x007F; SPIaRegs.SPICCR.all=0x00DF; SPIaRegs.SPIPRI.bit.FREE=1;該函數(shù)的主要功能為:先配置SPICCR寄存器,初始化SPI到復(fù)位狀態(tài),設(shè)置時鐘極性為上升沿輸入,下降沿輸出狀態(tài),字長控制為16位;再配置SPICTL寄存器,禁止溢出中斷使能位,設(shè)置SPI時鐘相位為普通SPI時鐘方式,設(shè)置SPI為網(wǎng)絡(luò)主機(jī),即就是將DSP設(shè)置為主機(jī),不使能SPI中斷,再配置波特率寄存器,設(shè)置波特率為(LSPCLK)\(127+1);第二次配置SPICCR寄存器,使SPI準(zhǔn)發(fā)送或接受下一個字。最后配置優(yōu)先權(quán)寄存器,忽視SPI的中斷。SPI_fifo_init()是用來配置SPI的fifo模塊的,由于本系統(tǒng)中沒有使用SPI的fifo模式,故關(guān)閉fifo功能,相應(yīng)的語句為:SPIaRegs.SPIFFTX.all=0xA040;即為禁止fifo增強(qiáng)功能。3.3定時器、數(shù)碼管,按鍵及其他外設(shè)的初始化3.3.1定時器的初始化定時器的初始化只需調(diào)用系統(tǒng)函數(shù)InitCpuTimers()。該函數(shù)對三個定時器的周期寄存器,預(yù)定標(biāo)寄存器,控制寄存器都進(jìn)行了初始化,還針對不同的cpu頻率,為定時器的周期寄存器裝入不同的定時周期。3.3.2其他外設(shè)的初始化如前文所述,按鍵矩陣和數(shù)碼管等外設(shè)要通過DSP的GPIO接口與DSP進(jìn)行連接,所以要對相應(yīng)的GPIO接口進(jìn)行初始化。 這些外設(shè)的初始化主要通過兩個函數(shù)來完成,即Init_LEDGpio()和Init_KeyGpio(),分別表示數(shù)碼管的初始化和按鍵矩陣的初始化。 以數(shù)碼管的GPIO0為例,其初始化程序為:GpioCtrlRegs.GPAPUD.bit.GPIO0=0;GpioDataRegs.GPASET.bit.GPIO0=1;GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;GpioCtrlRegs.GPADIR.bit.GPIO0=1; 四行語句分別表示使能GPIO的內(nèi)部上拉電阻;將引腳的輸出鎖存為高電平;引腳設(shè)置為通用I/O口;引腳設(shè)置為輸出口。 按鍵矩陣的四個列也被設(shè)置為輸出,和數(shù)碼管一樣,在此不再重述,按鍵矩陣的四個行被設(shè)置為輸入,其初始化程序為:GpioCtrlRegs.GPBPUD.bit.GPIO50=0;GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;GpioCtrlRegs.GPBDIR.bit.GPIO50=0;3.4cpu中斷及其PIE的設(shè)置1.首先關(guān)閉cpu中斷、初始化PIE、初始化中斷向量表PieVectTable并且清除cpu中斷標(biāo)志(IFR)位和cpu中斷使能(IER)位; 2.然后將定時器子程序和看門狗子程序的地址寫入PIE中斷向量表,應(yīng)向PIE中斷向量表的如下兩個地址寫入中斷子函數(shù)的地址[10]-[13]。PieVectTable.TINT0=&cpu_timer0_isr;PieVectTable.WAKEINT=&wakeint_isr;3.5設(shè)置定時器0的周期、打開定時器、看門狗和開中斷3.5.1設(shè)定定時器的周期初始化定時器之后就應(yīng)該設(shè)定定時器周期了。相關(guān)程序如下:ConfigCpuTimer(&CpuTimer0,150,1000000); 該函數(shù)有三個參數(shù),第一個參數(shù)是一個指向結(jié)構(gòu)體的指針,為這個參數(shù)賦值為&CpuTimer0表示這個指針是指向定時器0的,也就是說,是為定時器0中的相關(guān)寄存器進(jìn)行操作。第二個參數(shù)是設(shè)定使用的硬件DSP芯片的主頻的,單位是MHz,本系統(tǒng)使用的是主頻為150MHz的TMS320F28335芯片,所以此處寫150。第三個參數(shù)就是設(shè)定定時器的計數(shù)周期,單位為微秒,本程序希望定時時間為一秒,所以此處寫1000000。至此,定時器設(shè)置完畢。3.5.2打開定時器開定時器的語句如下所示:圖3-5定時器0控制寄存器情況圖開定時器的語句如下所示:CpuTimer0Regs.TCR.all=0x4011;向TCR寄存器的4位TSS寫1即為開啟定時器3.5.3開中斷1.使能cpu的中斷使能位,因為看門狗和定時器0的中斷都通過INT1傳輸給cpu,故需要將IER的第0位置1,程序如下IER|=M_INT1;其中在工程中的DSP2833x_Device.h文件中,定義:#defineM_INT10x0001 2.還要使能PIE中相應(yīng)的中斷使能位。如上文所示,定時器0和看門狗的中斷分別位于PIE(1,7)和PIE(1,8),故需要把PIE中的這兩個位置1。程序如下:PieCtrlRegs.PIEIER1.bit.INTx7=1;PieCtrlRegs.PIEIER1.bit.INTx8=1;這兩行語句分別表示打開定時器0和看門狗的中斷。3.打開cpu的總中斷INTM。如前文所述,只有cpu的總中斷被使能,其他外設(shè)的中斷才能被傳輸?shù)絚pu內(nèi),如果INTM未被使能,那么,無論什么外設(shè)的中斷,都沒有辦法傳輸?shù)絚pu內(nèi)部。打開總中斷語句如下EINT;3.5.4開啟看門狗開啟看門狗需要對看門狗的工作控制寄存器進(jìn)行配置。程序如下SysCtrlRegs.WDCR=0x002c;3.6主要功能的實現(xiàn)3.6.1定時器中斷子程序的設(shè)計本程序使用的是DSP微控制器中的內(nèi)部定時器0。如上文所述,程序組配置定時器0的定時周期為1秒,也就是說每隔1秒定時器0就會產(chǎn)生一個中斷,主程序就會響應(yīng)這個中斷從而進(jìn)入定時器0的中斷服務(wù)子程序執(zhí)行相應(yīng)的語句。本系統(tǒng)能夠?qū)崿F(xiàn)最多100分鐘的定時功能,進(jìn)入定時器0中斷服務(wù)子程序后就會對當(dāng)前所剩的時間進(jìn)行計算和更改,定時器0中斷服務(wù)子程序的大致功能是:進(jìn)入中斷服務(wù)子程序之后,如果定時器分鐘位和秒位均不為零,則秒位(Second)減一;如果秒位為零但是分鐘不為零,則將秒位賦值為59,分鐘位減一;如果秒位和分鐘位都為零,則代表定時結(jié)束,分鐘位和秒位都為零不動。相關(guān)程序如下:if(Second!=00){ Second--;}Elseif(Second==00&&Minute!=00){ Second=59; Minute--;}elseif(Second==00&&Minute==00){ Second=0;}PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;圖3-6定時器中斷子程序流程圖3.6.2SPI通信與數(shù)碼管顯示程序的設(shè)計由硬件部分所述,本程序所用的4個七段數(shù)碼管的段選端一同連接到74HC164串行輸入并行輸出芯片的輸出端,故需要先用DSP的串行外設(shè)通信SPI進(jìn)行DSP和74HC164之間的通信,從而將數(shù)碼管所需要的段碼傳輸給74HC164芯片,再通過74HC164并行輸出給數(shù)碼管。1.SPI通信功能的實現(xiàn)由硬件部分所述,SPI通信的數(shù)據(jù)傳輸是在主機(jī)DSP微控制器和從機(jī)74HC164的移位寄存器之間實現(xiàn)的,在對SPI進(jìn)行了初始化并設(shè)置好極性和相位之后,主機(jī)和從機(jī)之間的通信是隨著SPI的時鐘信號自動進(jìn)行的,軟件部分只需要將需要進(jìn)行通信的數(shù)據(jù)寫入主機(jī)的寫入串行輸出緩沖寄存器(SPITXBUF)即可[14]-[15]。具體程序如下:voidSPI_xmit(Uint16a){SPIaRegs.SPITXBUF=a;}函數(shù)SPI_xmit即為將通信數(shù)據(jù)寫入輸出緩沖寄存器進(jìn)行發(fā)送。2.數(shù)碼管顯示功能的實現(xiàn)圖3-7數(shù)字拆分示意圖為了清晰直觀的顯示出定時器的計時狀態(tài),本系統(tǒng)設(shè)置了四個七段數(shù)碼管對時間進(jìn)行顯示。隨著程序的運(yùn)行,定時器所剩的的時間逐漸減少,四個數(shù)碼管上的數(shù)字就會顯示出這種狀態(tài)。四個數(shù)碼管分為兩個部分,左邊的兩位定義為分鐘,顯示當(dāng)前還剩余多少分鐘,右邊的兩位定義為秒,顯示還剩多少秒。本系統(tǒng)的最大定時時間即為99分59秒。由于采用了四個數(shù)碼管,要采用動態(tài)掃描的方式點亮數(shù)碼管,在程序中需要將分鐘的十位和個位拆開,還需要將秒的十位與個位也拆開,這樣才能在動態(tài)掃描時對不同的數(shù)碼管賦予不同的數(shù)值,從而達(dá)到顯示時間的目的。具體的實現(xiàn)方法和程序如下:voidSecond_Trans(Uint16data){ Second_Bit[1]=data/10; Second_Bit[0]=data%10;}voidMinute_Trans(Uint16data){ Minute_Bit[1]=data/10; Minute_Bit[0]=data%10;}voidDisData_Send(){ DisData_Bit[3]=Minute_Bit[1]; DisData_Bit[2]=Minute_Bit[0]; DisData_Bit[1]=Second_Bit[1]; DisData_Bit[0]=Second_Bit[0]; } 先通過除法和取余運(yùn)算將分鐘和秒的個位與十位分開,放置于數(shù)組中;再將這四位數(shù)字存入一個具有四個元素的一維數(shù)組DisData_Bit中,在DSP與74HC164進(jìn)行通信時均是通過這個數(shù)組選取數(shù)碼管需要的段碼從而進(jìn)行通信的。 眾所周知,動態(tài)掃描方式是通過不間斷循環(huán)點亮的方法對若干個數(shù)碼管進(jìn)行點亮,由于人眼存在視覺暫留和數(shù)碼管的余暉效應(yīng),人通過肉眼看到的效果是幾個數(shù)碼管一起點亮的。3.6.3矩陣鍵盤程序設(shè)計為了通過鍵盤控制定時器,本系統(tǒng)設(shè)置了矩陣鍵盤。矩陣鍵盤是十六個按鍵排列成為4X4的矩陣,通過行掃描和列掃描就能獲取鍵值。按鍵識別的大致流程是:硬件電路四個列是輸出,默認(rèn)是低電平,四個行是輸入,默認(rèn)是高電平。當(dāng)有鍵按下時,哪個輸入是低電平,就是哪個行有鍵按下。然后通過依次使四個列的輸出變?yōu)楦唠娖?,看哪個列變?yōu)楦唠娖綍r,行輸入又變?yōu)楦唠娖侥前存I的位置就在哪個列,這樣一來,按鍵的位置就被確定了。1.行的識別由于四個行默認(rèn)的輸入是高電平,所以沒有鍵按下時,輸入一直是高電平。假設(shè)第a行b列的按鍵按下,那么第a行的輸入就變?yōu)榈碗娖?,說明按鍵在第a行。但是,由于按鍵按下時都會存在抖動,矩陣鍵盤沒有硬件去抖電路,因此就需要通過軟件完成去抖功能。按鍵去抖的過程是:在有鍵按下時,程序雖然檢測到有鍵按下但是并不立即對其做出響應(yīng),而是進(jìn)行延時,當(dāng)延時5~10毫秒后,再次檢測,若此時按鍵仍為按下狀態(tài),則視為有按鍵按下,程序才會對按鍵進(jìn)行響應(yīng)執(zhí)行響應(yīng)的功能。行識別的核心代碼如下:voidRead_KX(Uint16x){ KX_AllStatus(); if(KX_Status[x]==0) { KX_Tim[x]++; if(KX_Tim[x]>=3000) { KX_On=x; KX_Tim[1]=0; KX_Tim[2]=0; KX_Tim[3]=0; KX_Tim[4]=0; } }}由程序可知,對按鍵的某行進(jìn)行識別時,會判斷行的輸入是否為低電平,如果為低,還要進(jìn)行延時,當(dāng)數(shù)組KX_Tim中的值大于3000時才會判定有鍵按下從而確定按鍵所屬的行。2.列的識別列的識別是通過列掃描函數(shù)來實現(xiàn)的。只有當(dāng)按鍵按下后,按鍵的行被確定后,列掃描函數(shù)才中的語句才會被執(zhí)行,如果按鍵的行位置都沒有被確定,也就是數(shù)按鍵的行標(biāo)KX_On仍然為零,那么即使運(yùn)行列掃描函數(shù),其中的語句也不會被執(zhí)行,即此時函數(shù)什么功能也不執(zhí)行。由于按鍵的行確定后,按鍵所在的第a行的輸入就變?yōu)榈碗娖?,這時要想識別出按鍵所在的列,就要依次改變鍵盤列的輸出。先將第一列的輸出變?yōu)楦唠娖?,然后讀取a行的輸入,若不為高電平則說明按鍵不在這一列,以此類推將剩下三列也進(jìn)行如下操作,若將第b列變?yōu)楦唠娖胶?,a行的輸入也變?yōu)楦?,就說明按鍵在b行。相應(yīng)的程序如下:voidRead_KY(Uint16x){ intj=0; if(!KX_Status[KX_On]&&KX_On) {Set_KY(x); delay(200); KX_AllStatus(); if(KX_Status[KX_On]) { KY_On=x; Key=Keys[KX_On-1][KY_On-1]; if(Key==15||Key==16) {Fun=Key;} KY_On=0; KX_On=0; if(Key!=15&&Key!=16) { Key_Bit[i]=Key; i--; if(i==-1) {i=3;} } for(j=0;j<4;j++) { if(Key_Bit[j]!=10) {DisData_Bit[j]=Key_Bit[j];} else {DisData_Bit[j]=0;} } }Rst_KY(x); }}如程序所示,當(dāng)檢測出按鍵后,還要判別按下的按鍵的鍵值從而程序做出不同的響應(yīng)。如果鍵值為15或者16,則判定為功能鍵,其功能分別為開啟定時器和關(guān)閉定時器。如果鍵值為0~9,則為數(shù)字鍵,用來更改定時的時間,其數(shù)值會賦給DisData數(shù)組并推出計時初值重新計時。3.6.4核心功能的設(shè)計當(dāng)程序開始運(yùn)行后,定時器默認(rèn)為關(guān)閉狀態(tài),數(shù)碼管不顯示任何數(shù)值。若按下“開始”鍵(鍵值15),則開啟定時器,開始定時,同時SPI會將時間數(shù)據(jù)傳送給數(shù)碼管進(jìn)行時間顯示,在數(shù)碼管上可以看到定時的時間一秒一秒的減少。若此時按下暫停鍵(鍵值16),則關(guān)閉定時器,定時暫停,數(shù)碼管上會顯示“”的圖案,而所剩的定時時間仍然保存在數(shù)字顯示數(shù)組Dis_Data中不變,除非用戶在暫停期間通過鍵盤改變時間,否則所剩的定時時間會一直鎖存在顯示數(shù)組中,此時如果重新按下“開始”鍵(鍵值15),則定時器將從暫停之前的時間處繼續(xù)開始計時;但是如果用戶在計時暫停期間通過矩陣鍵盤對定時的時間進(jìn)行重新設(shè)置,那么定時器暫停之前所剩的時間就會被用戶通過鍵盤更新,其按下的第一個鍵代表分鐘的高位,第二個鍵代表分鐘的個位,按下的第三個鍵代表秒的高位,第二個鍵代表秒的個位,重新設(shè)置的時間將會被存入時間顯示數(shù)組顯示在數(shù)碼管上,同時程序會逆推出定時初值,此時再重新按下15鍵,則定時器按照用戶設(shè)定的時間開始計時。圖3-8倒計時效果圖圖3-9暫停定時效果圖圖3-10定時結(jié)束報警效果圖如果重新設(shè)置時間時只輸入了分鐘位,而沒有輸入秒,則程序會自動將秒設(shè)置為零。例如:用戶在剩余1分20秒時按下“暫停”,然后選擇重新設(shè)置時間,但是只輸入了前兩位,即將分鐘設(shè)置為30分鐘,而沒有設(shè)置秒。此時若用戶按下“開始”,則用戶會從30分00秒處開始定時,其秒位就是系統(tǒng)自動設(shè)置的。圖3-11定時功能流程圖若用戶設(shè)置秒時出現(xiàn)誤操作,如將秒設(shè)置為99等大于60的數(shù)字。則系統(tǒng)會自動將秒重置為60。程序逆推初值公式如下:分鐘初值=分鐘十位×10+分鐘個位(3-1)秒初值=秒十位×10+秒個位(3-2)當(dāng)定時時間到時,程序中的分鐘位和秒都會歸零,數(shù)碼管的顯示也為零,此時數(shù)碼管會亮起,起到報警的作用。相關(guān)程序如下:if(Fun==15){CpuTimer0Regs.TCR.all=0x4001; Second_Trans(Second); Minute_Trans(Minute); DisData_Send(); for(Loop=0;Loop<4;Loop++) //分別顯示四位 { scan(); Sellect_Bit(Loop); //選擇要掃描的數(shù)碼管位 SPI_xmit(msg[DisData_Bit[Loop]]); //串行輸出要顯示的數(shù)字 delay(10000); } Key_Bit[0]=10; Key_Bit[1]=10; Key_Bit[2]=10; Key_Bit[3]=10; i=3;}elseif(Fun==16){ CpuTimer0Regs.TCR.all=0x4011;//定時器關(guān)閉 for(Loop=0;Loop<4;Loop++) //分別顯示四位 { scan(); Sellect_Bit(Loop); //選擇要掃描的數(shù)碼管位SPI_xmit(msg[Key_Bit[Loop]]); //串行輸出要顯示的數(shù)字 delay(10000); } Minute=DisData_Bit[3]*10+DisData_Bit[2]; Second=DisData_Bit[1]*10+DisData_Bit[0]; if(Second>59) { Second=59; }}
4總結(jié)本次畢業(yè)設(shè)計采用德州儀器公司的TMS320F28335芯片來設(shè)計定時器。通過DSP和數(shù)碼管,矩陣鍵盤的結(jié)合,實現(xiàn)了定時功能,并且能夠通過數(shù)碼管實時顯示定時時間,還可以通過鍵盤對定時器進(jìn)行開啟,暫停,更改時間的控制。本系統(tǒng)具有易安裝、成本低、軟件功能完善,工作可靠、準(zhǔn)確度高等優(yōu)點。這次的畢業(yè)設(shè)計歷時四個月,在這四個月里,我收獲頗豐。首先,畢業(yè)設(shè)計設(shè)是對學(xué)生大學(xué)四年里學(xué)習(xí)的一次綜合檢驗,通過畢業(yè)設(shè)計,我復(fù)習(xí)了模擬電路、數(shù)字電路、C語音、單片機(jī)等科目,進(jìn)一步深化了對書本上的理論知識的認(rèn)識。于此同時,我也知道了,知識不應(yīng)該僅僅停留在書本上,而是應(yīng)該腳踏實地,努力實踐,只有這樣,我們才能真正的掌握理論知識并讓其為我所用,解決實際問題。其次,這次的畢設(shè)還鍛煉了我的自學(xué)能力。由于以前從來沒有接觸過DSP控制器,所以這次的畢設(shè)就要自學(xué)相關(guān)知識。由于DSP為控制器功能強(qiáng)大,內(nèi)部模塊多,寄存器紛繁復(fù)雜,所以在開始學(xué)習(xí)是遇到不少困難,進(jìn)展緩慢。后來我退而求其次,先學(xué)習(xí)簡單的51單片機(jī)中的相關(guān)內(nèi)容,再通過類比的方式,學(xué)習(xí)DSP中的相關(guān)功能,總算是有了進(jìn)展,完成了畢業(yè)設(shè)計。總之,通過畢業(yè)設(shè)計,增強(qiáng)了我的專業(yè)素質(zhì),鍛煉了我的自學(xué)能力,使我樹立了嚴(yán)肅認(rèn)真、實事求是的科學(xué)態(tài)度,培養(yǎng)了吃苦耐勞的精神以及嚴(yán)謹(jǐn)?shù)淖黠L(fēng)。這些對我以后的學(xué)習(xí)和工作都是大有裨益的。
參考文獻(xiàn)[1]孫麗明.TMS320F2812原理及C語音程序開發(fā).北京:清華大學(xué)出版社,2008.[2]劉陵順,高艷麗,張樹團(tuán),王昉.TMS320F28335DSP原理及開發(fā)編程.北京:北京航空航天大學(xué)出版社,2013.[3]顧衛(wèi)剛.手把手教你學(xué)DSP—基于TMS320X281x.北京:北京航空航天大學(xué)出版社,2011.[4]蘇奎峰,呂強(qiáng),常大慶,張永秀.TMS320X281xDSP原理及C程序開發(fā).北京:北京航空航天大學(xué)出版社,2008.[5]蘇奎峰,呂強(qiáng),耿慶峰,陳圣儉.TMS320F2812原理與開發(fā).北京:電子工業(yè)出版社,2005.[6]蘇奎峰,呂強(qiáng),鄧志東,湯霞清.TMS320x28xxx原理與開發(fā).北京:電子工業(yè)出版社,2009.[7]張雄偉.DSP芯片的原理與開發(fā)應(yīng)用.北京:電子工業(yè)出版社,1997.[8]徐科軍,張翰,陳智淵.TMS320X281xDSP原理與應(yīng)用.北京:北京航空航天大學(xué)出版社,2006.[9]王中勇,陳恩慶.TMS320F2812原理與應(yīng)用技術(shù)(第2版).北京:電子工業(yè)出版社,2012.[10]邊莉,張起晶,黃耀群.51單片機(jī)基礎(chǔ)與實例進(jìn)階.北京:清華大學(xué)出版社,2012.[11]TexasInstrumentsIncorporated.TMS320x2833x,2823xSystemControlandInterruptsReferenceGuide.2010,3.[12]TexasInstrumentsIncorporated.TMS320x2833x,2823xSerialPeripheralInterface(SPI).2009,6.[13]Texas
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 色彩肌膚護(hù)理的常見問題解析
- 平?jīng)鍪惺兄睂W(xué)校招聘2026屆協(xié)議培養(yǎng)師范生23人備考題庫(第二批)及答案詳解(新)
- 2026福建廈門市集美區(qū)杏濱中心幼兒園招聘1人備考題庫及答案詳解(易錯題)
- 2026福建莆田市荔城區(qū)教師進(jìn)修學(xué)校選聘教研員5人備考題庫參考答案詳解
- 2026浙江錢江實驗室有限公司招聘3人備考題庫及一套答案詳解
- 骨質(zhì)疏松癥的研究進(jìn)展與趨勢
- 預(yù)防老年人口腔疾病的有效途徑
- 護(hù)膚品代理思維培訓(xùn)課件
- 五下《包裝的學(xué)問》教學(xué)設(shè)計
- 育兒早教指導(dǎo)師培訓(xùn)課件
- 食品生產(chǎn)余料管理制度
- 2026年浦發(fā)銀行社會招聘備考題庫必考題
- 2026年中國航空傳媒有限責(zé)任公司市場化人才招聘備考題庫有答案詳解
- 2026年《全科》住院醫(yī)師規(guī)范化培訓(xùn)結(jié)業(yè)理論考試題庫及答案
- 2026北京大興初二上學(xué)期期末語文試卷和答案
- 專題23 廣東省深圳市高三一模語文試題(學(xué)生版)
- 2026年時事政治測試題庫100道含完整答案(必刷)
- 重力式擋土墻施工安全措施
- 葫蘆島事業(yè)單位筆試真題2025年附答案
- 2026年公平競爭審查知識競賽考試題庫及答案(一)
- 置業(yè)顧問2025年度工作總結(jié)及2026年工作計劃
評論
0/150
提交評論