基于單片機(jī)的多種波形發(fā)生器_第1頁(yè)
基于單片機(jī)的多種波形發(fā)生器_第2頁(yè)
基于單片機(jī)的多種波形發(fā)生器_第3頁(yè)
基于單片機(jī)的多種波形發(fā)生器_第4頁(yè)
基于單片機(jī)的多種波形發(fā)生器_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

摘要STM32F103系列微控制器作為嵌入式系統(tǒng)的核心,提供了強(qiáng)大的硬件資源和豐富的外設(shè),為波形發(fā)生器的設(shè)計(jì)提供了廣泛的可能性。在該微控制器上實(shí)現(xiàn)的波形發(fā)生器不僅能夠生成常見的波形,如正弦波、方波、三角波,還能通過(guò)靈活的配置進(jìn)行調(diào)節(jié),滿足不同應(yīng)用場(chǎng)景的需求。波形發(fā)生器的實(shí)現(xiàn)基于STM32F103的硬件結(jié)構(gòu),充分利用其內(nèi)置的定時(shí)器、模擬輸入輸出等外設(shè)。通過(guò)配置定時(shí)器,可以實(shí)現(xiàn)精確的波形頻率控制,使用DAC模塊進(jìn)行數(shù)模轉(zhuǎn)換達(dá)到將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào),通過(guò)模擬輸入輸出將模擬信號(hào)對(duì)外進(jìn)行輸出。在軟件層面,利用Keil等工具進(jìn)行配置,本論文基于DAC轉(zhuǎn)換設(shè)計(jì)一個(gè)通過(guò)定時(shí)器中斷處理進(jìn)行數(shù)模轉(zhuǎn)換達(dá)到能夠在0至5V峰值、10hz到1000hz的波形,并且通過(guò)外部中斷實(shí)現(xiàn)對(duì)方波、鋸齒波、正弦波、三角波的轉(zhuǎn)換。該波形發(fā)生器適用于音頻處理、信號(hào)發(fā)生和通信系統(tǒng)中的頻率調(diào)制與解調(diào)。通過(guò)調(diào)整波形參數(shù)和外部電路設(shè)計(jì),可生成復(fù)雜波形,滿足工業(yè)和消費(fèi)電子設(shè)備需求。。關(guān)鍵字:嵌入式系統(tǒng)、STM32F103、波形發(fā)生器AbstractTheSTM32F103seriesmicrocontroller,asthecoreofembeddedsystems,providespowerfulhardwareresourcesandrichperipherals,providingawiderangeofpossibilitiesforthedesignofwaveformgenerators.Thewaveformgeneratorimplementedonthismicrocontrollercannotonlygeneratecommonwaveformssuchassinewaves,squarewaves,andtriangularwaves,butalsobeadjustedthroughflexibleconfigurationstomeettheneedsofdifferentapplicationscenarios.TheimplementationofthewaveformgeneratorisbasedonthehardwarestructureofSTM32F103,fullyutilizingitsbuilt-intimers,analoginput/outputandotherperipherals.Byconfiguringatimer,precisewaveformfrequencycontrolcanbeachieved.TheDACmoduleisusedfordigitaltoanalogconversiontoconvertdigitalsignalsintoanalogsignals,andtheanalogsignalsareoutputtedexternallythroughanaloginputandoutput.SAtthesoftwarelevel,usingKeilandothertoolsforconfiguration,thispaperdesignsaDACconversionbasedontimerinterruptprocessingtoachieveawaveformthatcanreachapeakvalueof0to5Vandafrequencyrangeof10Hzto1000Hz.Italsoconvertssquarewaves,sawtoothwaves,sinewaves,andtriangularwavesthroughexternalinterrupts.Thiswaveformgeneratorissuitableforfrequencymodulationanddemodulationinaudioprocessing,signalgeneration,andcommunicationsystems.Byadjustingwaveformparametersandexternalcircuitdesign,complexwaveformscanbegeneratedtomeettheneedsofindustrialandconsumerelectronicdevices..Keywords:embeddedsystem,STM32F103,waveformgenerator目錄1.概述 .概述1.1研究背景與意義STMicroelectronics公司推出了一款基于ARMCortex-M3核心的32位微控制器STM32F103。這款微控制器,配備了一個(gè)任意波形發(fā)生器。該波形發(fā)生器能夠產(chǎn)生多種標(biāo)準(zhǔn)波形信號(hào),如正弦波、矩形波、三角波、脈沖串等;同時(shí)也可以模擬復(fù)雜的自定義波形和不規(guī)則信號(hào),例如衰減震蕩波、單次偶發(fā)信號(hào)、指數(shù)型脈沖以及生物電信號(hào)等[1]。STM32F103微控制器的研究背景和意義主要體現(xiàn)在以下幾個(gè)方面:隨著電子技術(shù)的發(fā)展,信號(hào)發(fā)生器的應(yīng)用越來(lái)越廣泛,在科學(xué)研究、生產(chǎn)實(shí)踐和教學(xué)領(lǐng)域等都得到普遍應(yīng)用[2]。其次,基于STM32F103的波形發(fā)生器研究有助于提高系統(tǒng)的集成度。將波形發(fā)生器集成在微控制器內(nèi)部,可以減少外部器件的數(shù)量和復(fù)雜度,降低系統(tǒng)成本和功耗。這對(duì)于嵌入式系統(tǒng)的設(shè)計(jì)和應(yīng)用具有重要意義。第三,研究基于STM32F103的波形發(fā)生器可以增強(qiáng)系統(tǒng)的靈活性。通過(guò)靈活配置STM32F103的外設(shè)資源,可以根據(jù)具體的應(yīng)用需求選擇和調(diào)整波形的參數(shù),實(shí)現(xiàn)不同類型和形狀的波形生成。這種靈活性使得嵌入式系統(tǒng)可以適應(yīng)不同的應(yīng)用場(chǎng)景,提高了系統(tǒng)的適用性。另外,基于STM32F103的波形發(fā)生器研究有助于提高系統(tǒng)的性能。STM32F103具有強(qiáng)大的計(jì)算能力和豐富的外設(shè)資源,可以實(shí)現(xiàn)高精度、高速率的波形發(fā)生,滿足各種實(shí)時(shí)性要求。這對(duì)于一些對(duì)性能有較高要求的應(yīng)用領(lǐng)域,如通信系統(tǒng)和音頻處理,具有重要的意義。作為波形發(fā)生器發(fā)生器,它的優(yōu)化性能和智能交互性對(duì)產(chǎn)業(yè)生產(chǎn)、科研開發(fā)等地方有著增進(jìn)的作用[3]。1.2國(guó)內(nèi)外研究背景最初的信號(hào)源大多都采取模擬電子技術(shù)實(shí)現(xiàn),使用正弦波以及脈沖波信號(hào)發(fā)生器為主[4]。波形發(fā)生器是一種在通信、儀器儀表和音頻處理等領(lǐng)域得到廣泛應(yīng)用的電路或設(shè)備,用于產(chǎn)生不同類型的波形信號(hào),常見波形包括正弦波、方波和三角波等。在STM32系列微控制器上實(shí)現(xiàn)波形發(fā)生器功能,可以為嵌入式系統(tǒng)提供豐富的信號(hào)發(fā)生和處理能力。在電力電子、自動(dòng)化控制等方面,波形發(fā)生器作為一種信號(hào)源有著非常廣泛的應(yīng)用,許許多多現(xiàn)代社會(huì)的儀器儀表性能都取決于波形發(fā)生器[5]。國(guó)內(nèi)外對(duì)于STM32波形發(fā)生器的研究主要集中在以下幾個(gè)方面:在硬件設(shè)計(jì)方面,研究者們致力于設(shè)計(jì)高性能、低功耗的波形發(fā)生器電路。他們關(guān)注模擬電路的設(shè)計(jì),數(shù)字信號(hào)處理器(DSP)的集成以及與STM32微控制器的連接方式。一些研究關(guān)注如何通過(guò)硬件加速技術(shù),提高波形發(fā)生器的性能,以滿足不同應(yīng)用場(chǎng)景的需求。在軟件算法方面,研究者們不斷優(yōu)化波形發(fā)生器的算法,以提高信號(hào)生成的精度和效率。他們關(guān)注于在STM32系列微控制器上實(shí)現(xiàn)各種波形生成算法,包括數(shù)模轉(zhuǎn)換(DAC)、直接數(shù)字合成(DDS)等。算法的優(yōu)化不僅關(guān)注波形的準(zhǔn)確性,還注重在有限的資源下提高計(jì)算效率。進(jìn)行STM32波形發(fā)生器的性能測(cè)試是研究的一個(gè)重要方面。研究者們通過(guò)實(shí)驗(yàn)和仿真,驗(yàn)證硬件設(shè)計(jì)和軟件算法在不同條件下的性能表現(xiàn)。這包括波形的頻率穩(wěn)定性、相位準(zhǔn)確性、信噪比等指標(biāo)的測(cè)試。除了波形發(fā)生器本身的研究,還有研究者專注于開發(fā)與之配套的軟件工具和開發(fā)平臺(tái)。這些工具和平臺(tái)可以幫助工程師更方便地使用STM32波形發(fā)生器,加速系統(tǒng)開發(fā)的過(guò)程。目前高校廣泛使用的信號(hào)發(fā)生器主要提供正弦波、方波、三角波和脈沖信號(hào),其電路結(jié)構(gòu)復(fù)雜、價(jià)格昂貴[6-10]??偟膩?lái)說(shuō),想要實(shí)現(xiàn)波形發(fā)生器,實(shí)現(xiàn)其能夠產(chǎn)生多種波形并且能夠?qū)Σㄐ蔚念l率以及幅度進(jìn)行調(diào)整,需要使用到軟件以及硬件之間的相互結(jié)合,通過(guò)STM32F103的硬件支持,使用軟件實(shí)現(xiàn)波形的輸出和修改,這是所有波形發(fā)生器所使用到的通用手段。1.3論文主要研究?jī)?nèi)容本文的主要研究?jī)?nèi)容是使用STM32F103開發(fā)板實(shí)現(xiàn)各個(gè)波形的發(fā)生以及對(duì)其頻率和幅度的進(jìn)行調(diào)整,并設(shè)計(jì)可視化界面以收集配置數(shù)據(jù)。主要工作內(nèi)容如下:完成對(duì)STM32F103波形發(fā)生器的可視化界面控制。實(shí)現(xiàn)對(duì)四種波形的變換,分別為方波、正弦波、三角波、鋸齒波。通過(guò)STM32F103下方的提供的三個(gè)按鍵實(shí)現(xiàn)對(duì)波形頻率和幅度的調(diào)整。通過(guò)STM32F103中提供的的引腳進(jìn)行波形的輸出。1.4本論文的主要安排本次論文一共分為6個(gè)主要部分,分別是概述、系統(tǒng)結(jié)構(gòu)設(shè)計(jì)、硬件設(shè)計(jì)、軟件設(shè)計(jì)、測(cè)試以及總結(jié)。在第一個(gè)概述中首先有著對(duì)國(guó)內(nèi)外的研究背景的敘述,主要說(shuō)明國(guó)內(nèi)外在對(duì)STM32的開發(fā)與對(duì)STM32的內(nèi)部軟件以及硬件生成發(fā)展說(shuō)明。最后是說(shuō)明本次論文的主要研究?jī)?nèi)容和各部分的安排。系統(tǒng)結(jié)構(gòu)設(shè)計(jì)中,第一個(gè)是對(duì)設(shè)計(jì)方案的分析,該部分是為了說(shuō)明實(shí)現(xiàn)這個(gè)波形發(fā)生器是如何設(shè)計(jì)方案并實(shí)現(xiàn),該位置需要將設(shè)計(jì)的內(nèi)容并和如何實(shí)現(xiàn)的方案呈現(xiàn)出來(lái)。其次系統(tǒng)結(jié)構(gòu)是說(shuō)明在該程序中每個(gè)部分功能函數(shù)的說(shuō)明,并說(shuō)出函數(shù)與函數(shù)之間有著什么樣的聯(lián)系。該部分說(shuō)明系統(tǒng)函數(shù)之間是如何進(jìn)行運(yùn)行。接下來(lái)的硬件設(shè)計(jì)中,需要簡(jiǎn)單的說(shuō)明STM32硬件部分的組成,并介紹部分硬件結(jié)構(gòu)。下一個(gè)的軟件設(shè)計(jì)中,系統(tǒng)軟件構(gòu)架主要講解整個(gè)系統(tǒng)的結(jié)構(gòu),該部分也是將系統(tǒng)是如何運(yùn)行,每個(gè)結(jié)構(gòu)之間是如何建立起聯(lián)系加以說(shuō)明。借來(lái)則是對(duì)模塊的撰寫,該部分是整篇報(bào)告的核心內(nèi)容,需要將系統(tǒng)中每個(gè)模塊中的內(nèi)容進(jìn)行詳細(xì)的講解并分析,并且需要配合圖文進(jìn)行講解。測(cè)試中首先是需要說(shuō)明你所測(cè)試的平臺(tái)是軟件還是硬件。并且需要放上實(shí)物圖片進(jìn)行說(shuō)明。測(cè)試方法顯而易見則是將你如何對(duì)程序進(jìn)行測(cè)試,并將自己的測(cè)試方法進(jìn)行詳細(xì)的說(shuō)明并需要將試驗(yàn)后的結(jié)果圖放出。最后需要對(duì)實(shí)驗(yàn)的結(jié)果進(jìn)行評(píng)價(jià),分析實(shí)驗(yàn)結(jié)果。最后的測(cè)試數(shù)據(jù)則是將試驗(yàn)后數(shù)據(jù)展示出來(lái)并加以總結(jié)。最后的總結(jié)則是對(duì)所此次的實(shí)驗(yàn)整體進(jìn)行分析并從中學(xué)習(xí)到的東西。2.系統(tǒng)結(jié)構(gòu)設(shè)計(jì)與需求分析2.1需求分析需求分析是需要從使用者的角度中整理硬件所需具備的功能以及達(dá)成的目的。STM32F103多種波形發(fā)生器由人機(jī)交互界面,驅(qū)動(dòng)程序,以及硬件組成。人機(jī)交互界面能夠滿足客戶對(duì)波形類型的選擇以及對(duì)波形頻率和幅度的控制。使用按鍵控制能夠達(dá)到對(duì)波形的選擇和對(duì)頻率以及幅度的調(diào)整。通過(guò)圖一可以知道,交互界面需要軟件驅(qū)動(dòng)的支持,軟件驅(qū)動(dòng)則需要硬件部分的支持,所以下面會(huì)從驅(qū)動(dòng)程序以及硬件層面進(jìn)行需求分析。(1)從軟件驅(qū)動(dòng)的角度進(jìn)行需求分析1)想要通過(guò)軟件實(shí)現(xiàn)對(duì)波形的輸出則需要使用到數(shù)模轉(zhuǎn)換,即數(shù)字信號(hào)到模擬信號(hào)的轉(zhuǎn)變,目前在STM32F103中由DAC函數(shù)可以實(shí)現(xiàn)數(shù)字信號(hào)對(duì)模擬信號(hào)的轉(zhuǎn)變。2)處理完成的信號(hào)需要通過(guò)某些方法對(duì)外進(jìn)行輸出并且能夠?qū)ζ溥M(jìn)行測(cè)量;使用其中的GPIO口則可以實(shí)現(xiàn)在STM32F103中對(duì)指定的引腳進(jìn)行模擬信號(hào)的輸出。(2)從硬件的角度進(jìn)行需求分析外部硬件的設(shè)計(jì)部分,主要分為USB串口模塊、I/O模塊、LED模塊、按鍵模塊[11]。通過(guò)串口模塊可對(duì)STM32開發(fā)板中的軟件部分進(jìn)行修改,I/O模塊則是負(fù)責(zé)進(jìn)行對(duì)外的波形輸出,LED模塊是為了顯示人機(jī)交互的界面,能夠讓使用者更好的了解當(dāng)前的波形,按鍵模塊可以處理切換波形以及對(duì)波形頻率和幅度的修改。2.2設(shè)計(jì)方案分析 使用KeilMDK工具實(shí)現(xiàn)對(duì)STM32F103處理器的繼承開發(fā),這是一款能夠支持程序的編輯、編譯、鏈接以及在線調(diào)試等功能[12]。實(shí)現(xiàn)將數(shù)字量轉(zhuǎn)換為模擬量的器件稱為數(shù)模轉(zhuǎn)換器,簡(jiǎn)稱DAC[13],為了生成模擬信號(hào),可以利用STM32單片機(jī)內(nèi)置的D/A轉(zhuǎn)換功能。通過(guò)預(yù)先將數(shù)字量存儲(chǔ)在存儲(chǔ)器中,單片機(jī)可以定時(shí)輸出這些數(shù)字量,并傳遞給D/A轉(zhuǎn)換芯片進(jìn)行轉(zhuǎn)換。轉(zhuǎn)換后的一系列點(diǎn)可以根據(jù)預(yù)先設(shè)定的函數(shù)表達(dá)式獲得,通過(guò)改變這個(gè)函數(shù)表達(dá)式可以得到不同的輸出波形。這樣就可以實(shí)現(xiàn)在特定時(shí)刻輸出特定電壓的功能。這種方法可以用來(lái)輸出不同形狀的波形,為實(shí)驗(yàn)和應(yīng)用提供了便利[14]。在使用定時(shí)器的中斷服務(wù)函數(shù)將每一個(gè)時(shí)刻的各個(gè)函數(shù)所生成的值通過(guò)DAC輸出。這樣便可以將一個(gè)完成的函數(shù)進(jìn)行輸出。如果需要修改函數(shù)的頻率,則只需要修改此時(shí)時(shí)刻定時(shí)器的自動(dòng)重裝值,這樣便可以修改每個(gè)函數(shù)的頻率。而修改波形的電壓值則只需要修改函數(shù)中定義好的電壓值,通過(guò)判斷按鍵是否按下則進(jìn)行每次自加。在完成上述操作的同時(shí)也需要判斷函數(shù)每次輸出時(shí)是否會(huì)超出我們自身所定義好的周期,若超出則需要將周期重新置0。為實(shí)現(xiàn)兩個(gè)通道實(shí)現(xiàn)雙通道同時(shí)輸出,所以在設(shè)計(jì)時(shí)需要使用兩個(gè)DAC通道同時(shí)輸出,并使用一個(gè)定時(shí)器的中斷服務(wù)函數(shù)對(duì)兩個(gè)通道同時(shí)輸出波形。兩個(gè)定時(shí)器這里應(yīng)該相隔一個(gè),例如使用了定時(shí)器3最好不要再使用定時(shí)器4,可以選擇定時(shí)器3。因?yàn)閮蓚€(gè)相鄰的定時(shí)器可能會(huì)導(dǎo)致輸出出現(xiàn)失真或者波形紊亂。但是兩個(gè)定時(shí)器同時(shí)使用可能會(huì)出現(xiàn)一個(gè)定時(shí)器的無(wú)法初始化,所以這里改用一個(gè)定時(shí)器對(duì)兩個(gè)DAC通道賦值。2.3系統(tǒng)結(jié)構(gòu)首先使用的是STM32開發(fā)板自帶的LCD屏幕設(shè)計(jì)菜單頁(yè)面。其中菜單頁(yè)面中包括改變波形、增加頻率、增加電壓即幅值。通過(guò)按鍵KEY0可以修改兩個(gè)通道輸出的波形(輸出四種波形:三角波、方波、正弦波、鋸齒波,每次按下變換一個(gè));按鍵WK_UP按鍵可以修改波形的電壓值;按鍵KEY1則可以修改每個(gè)波形的頻率。這里的WU_UP每次按下,都會(huì)向上增加0.5的電壓值,但是當(dāng)加到最大限度后,則會(huì)直接重新回到最初的電壓值。由于按鍵過(guò)少,所以在此次實(shí)驗(yàn)中僅僅使用到了單向的減少。圖1系統(tǒng)結(jié)構(gòu)3.硬件設(shè)計(jì)本論文中的波形發(fā)生器所使用到的有DAC的通道口與TIM的通道口,以及三個(gè)按鍵的通道,所以通過(guò)電路圖則可以知道。圖2三個(gè)按鍵電路圖圖3STM32F103CPU原理圖通過(guò)上圖可以得知三個(gè)按鍵的所處IO分別位于PA15、PC5、PA0。在通過(guò)圖3可以得知,需要在設(shè)置每個(gè)按鍵的GPIO口時(shí),將GPIO_Mode的值設(shè)置為GPIO_Mode_IPU上拉輸出。至此為三個(gè)按鍵的硬件初始化。想要使用DAC則需要打開DAC的通道,并需要設(shè)置DAC所在GPIO口最為模擬信號(hào)的輸出端口。通過(guò)圖4可以得知,DAC1與DAC2所處的通道分別為PA4與PA5,則此時(shí)需要只需要將這兩個(gè)通道口打開。GPIO_InitStructure.GPIO_Pin

=

GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode

=

GPIO_Mode_AIN;

GPIO_InitStructure.GPIO_Speed

=

GPIO_Speed_50MHz;

GPIO_Init(GPIOA,

&GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_4)

但是需要注意的是在為GPIO_Mode結(jié)構(gòu)體成員進(jìn)行賦值時(shí),需要將其模式設(shè)置為模擬輸入,即GPIO_Mode_AIN。這樣則可以將PA4作為模擬信號(hào)的輸出位置。同樣在最后的需要將DAC的通道設(shè)置為0同時(shí)也需要設(shè)置對(duì)其模式,查閱開發(fā)手冊(cè)可以得知8位右對(duì)齊、12位左對(duì)齊、12位右對(duì)齊這三種模式操作的時(shí)候其實(shí)是寫入DHR8R1,DHR12L1,DHR12R1三個(gè)不同位置的寄存器。這些值在通過(guò)自動(dòng)移位寫入到DHR1的寄存器中。下面是關(guān)于定時(shí)器的說(shuō)明,在STM32中存在三種定時(shí)器,分別是高低定時(shí)器,通用定時(shí)器以及基本定時(shí)器。通過(guò)不完全手冊(cè)可以得知,高級(jí)定時(shí)器中有TIM1和TIM8;而通用定時(shí)器可使用的則有TIM2~TIM5。本次實(shí)驗(yàn)中選擇到的是通用定時(shí)器中的TIM4與TIM5。基本定時(shí)器則只有TIM6與TIM7。4.軟件設(shè)計(jì)4.1系統(tǒng)軟件架構(gòu) 整個(gè)系統(tǒng)軟件構(gòu)架由定時(shí)器的初始化、定時(shí)器的中斷服務(wù)函數(shù)、兩個(gè)DAC的通道初始化、按鍵的初始化函數(shù)、LCD的初始化函數(shù)、外部中斷服務(wù)函數(shù)、主函數(shù)中的菜單顯示。首先是定時(shí)器的初始化,初始化定時(shí)器的時(shí)候需要同時(shí)打開定時(shí)器中的中斷更新,也就是需要使能中斷服務(wù)。因?yàn)樵谥袛喾?wù)函數(shù)中我們需要將函數(shù)的值通過(guò)定時(shí)器的自加輸入到DAC中轉(zhuǎn)換成模擬信號(hào)并輸出出來(lái)。在使能完中斷服務(wù)后,我們還需要初始化定時(shí)器的中斷。并且打開其對(duì)應(yīng)定時(shí)器的中斷,設(shè)置其優(yōu)先級(jí)數(shù)。其次在定時(shí)器的中斷服務(wù)函數(shù)中做的是對(duì)每個(gè)函數(shù)公式的值進(jìn)行計(jì)算并通過(guò)DAC_Setchannl和DAC_Setchann2進(jìn)行對(duì)通道的賦值。同時(shí)需要判斷我們按鍵按下時(shí)所產(chǎn)生的mode值來(lái)選擇我們此時(shí)需要輸出的波形。兩個(gè)中斷服務(wù)函數(shù)中的計(jì)算方法都是一樣的,這樣也就可以實(shí)現(xiàn)兩個(gè)通道輸出一樣的波形。再到就是比較重要的DAC通道的初始化了,DAC模塊有2個(gè)輸出通道,每個(gè)通道都有單獨(dú)的轉(zhuǎn)換器[5],兩個(gè)DAC(DAC1和DAC2)的通道分別為PA4和PA5。所以我們?cè)诔跏蓟臅r(shí)候首先需要打開該位置的通道,并且將該位置的IO口的模式設(shè)置為模擬輸入,這樣PA4與PA5便可以輸出模擬信號(hào)。LCD的初始化函數(shù)這里就不做詳細(xì)介紹,該函數(shù)的主要的功能就是用于打開LCD顯示屏。按鍵的初始化是按照上面給出的三個(gè)按鍵所對(duì)應(yīng)的IO口進(jìn)行初始化,并且根據(jù)去電路原理圖我們可以得知應(yīng)該設(shè)置為上拉輸入。而PA0設(shè)置為下拉。最后是菜單的選擇,本次為波形發(fā)生器,所以不需要顯示其波形,只需要在按鍵按下時(shí)顯示此時(shí)所產(chǎn)生的波形即可。并且兩外兩個(gè)按鍵能夠改變波形的電壓和頻率即可。圖4系統(tǒng)結(jié)構(gòu)4.2代碼生成模塊4.2.1波形生成模塊該波形發(fā)生器的波形生成主要使用了定時(shí)器的中斷處理函數(shù),在設(shè)定好的外部中斷處理函數(shù)中將每一個(gè)時(shí)刻的數(shù)字信號(hào)通過(guò)DAC進(jìn)行轉(zhuǎn)換,然后再對(duì)引腳進(jìn)行輸出,從而達(dá)到完整的波形輸出。下面將對(duì)DAC模塊的設(shè)計(jì)進(jìn)行說(shuō)明。通過(guò)圖4對(duì)DAC的電路圖可以得知,DAC1和DAC2所處的IO口分別為PA4和PA5,所以如果希望能夠達(dá)到兩個(gè)通道同時(shí)對(duì)外輸出波形信號(hào),則需要對(duì)該兩個(gè)通道進(jìn)行初始化,這里以DAC1的初始化為例。在定義完所需要的結(jié)構(gòu)體后,首先需要做的顯示使能其對(duì)應(yīng)的IO口和DAC通道時(shí)鐘。完成后再對(duì)每一個(gè)成員進(jìn)行賦值。GPIO_InitStructure.GPIO_Pin

=

GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode

=

GPIO_Mode_AIN;

GPIO_InitStructure.GPIO_Speed

=

GPIO_Speed_50MHz;

GPIO_Init(GPIOA,

&GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_4);

這里需要注意的就是將GPIO口的模式設(shè)置為模擬輸入模式,這樣便可以將PA4作為輸出引腳。DAC_InitType.DAC_Trigger=DAC_Trigger_None;

DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;

DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_BDAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable

;

DAC_Init(DAC_Channel_1,&DAC_InitType);

上述函數(shù)為DAC結(jié)構(gòu)體成員的初始化,該波形發(fā)生器不需要使用觸發(fā)功能于波形發(fā)生,所以前兩個(gè)設(shè)置為None,輸出緩存打開后可以讓其輸出的更快,但是不能讓其降低到0,所以這個(gè)可以開也可以不開。這里選擇關(guān)閉。最后使用DAC_Init初始化器成員。最后還要使能器通道以及將其設(shè)置為0。DAC2通道的設(shè)置于DAC1的設(shè)置相同,這里不做詳細(xì)介紹。在完成了對(duì)DAC通道的初始化后,需要讓其在定時(shí)器中斷處理函數(shù)中進(jìn)行波形的輸出,在使用定時(shí)器中斷處理函數(shù)前需要將定時(shí)器進(jìn)行初始化,下面將詳細(xì)介紹初始化定時(shí)器的函數(shù)。定時(shí)器又被成為計(jì)時(shí)器,這里不僅僅用到了其自加的特性,也用到了它自帶的中斷服務(wù)程序。這里詳細(xì)介紹定時(shí)器的初始化,以TIM4為例子。TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

NVIC_InitTypeDef

NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,

ENABLE);

TIM_TimeBaseStructure.TIM_Period

=

arr;

TIM_TimeBaseStructure.TIM_Prescaler

=psc;

TIM_TimeBaseStructure.TIM_ClockDivision

=

0;

TIM_TimeBaseStructure.TIM_CounterMode

=

TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3,

&TIM_TimeBaseStructure);

TIM_ITConfig(

TIM4,

//TIM5

TIM_IT_Update

,

ENABLE

)

定時(shí)器的初始化首先就是需要兩個(gè)形式參數(shù),分別為arr和psc,用于設(shè)置結(jié)構(gòu)體成員中的TIM_Period和TIM_Prescal。其中TIM_Period用于設(shè)置下一個(gè)更新事件中裝入活動(dòng)的自動(dòng)重裝寄存器周期的值,范圍在0x0000至0xFFFF之間。同時(shí),結(jié)構(gòu)體中還包含一個(gè)成員TIM_Prescal,用作定時(shí)器時(shí)鐘頻率的預(yù)分頻值。這里再將時(shí)鐘設(shè)置為不分頻,定時(shí)器的計(jì)時(shí)器模式設(shè)置為向上計(jì)數(shù)。其次還有對(duì)中斷優(yōu)先級(jí)的設(shè)置,這里不做詳細(xì)講解。定時(shí)器5的設(shè)定與定時(shí)器4的設(shè)置相同。圖5中斷服務(wù)函數(shù)流程圖此處以定時(shí)器5的中斷服務(wù)函數(shù)為例。在進(jìn)入中斷服務(wù)函數(shù)前需要首先判斷其中斷為是否不為RESET,然后再進(jìn)入中斷程序;再中斷程序中,首先需要定義全局變量f作為循環(huán)變量。使用if函數(shù)判斷每次的mode函數(shù)為什么值,若mode的值為1,則此時(shí)為正弦波函數(shù),if(mode==1)

{

if(f

<

256)

dacval=(u16)((Um*sin((

1.0*f/(256-1))*2*3.1415926535)+Um)*4095/3.3);

else

f=0;

}

使用if判斷當(dāng)f小于256時(shí),再將f和Um帶入到此時(shí)的正弦波函數(shù)中,得到的值放到dacval,若f大于256,則將f的重新置為0。每次對(duì)dacval賦值完后,都將此時(shí)的dacval使用DAC_SetChannel1Data(DAC_Align_12b_R,dacval)函數(shù)將此時(shí)的dacval通過(guò)DAC轉(zhuǎn)換。再使用TIM_ClearITPendingBit(TIM5,TIM_IT_Update)函數(shù)清空此時(shí)中斷標(biāo)志位。if(mode==0)

{

if(f<128)

{

dacval

=

(u16)(4095*Um/3.3);

}

else

if(f>=128&&f<256)

{

dacval

=

0;

}

else

if(f>256)

{

f=0;

}

}

當(dāng)mode值為0時(shí),此時(shí)需要輸出的波形為方波,256為自己定義的周期大小,這里可以了解,方波會(huì)在兩個(gè)值之間來(lái)回循環(huán),所以只需要再周期一半設(shè)置為一個(gè)固定值即可。這里使用if判斷當(dāng)f小于128時(shí),使用(4095*Um/3.3)將此時(shí)的電壓轉(zhuǎn)換并賦給dacval,當(dāng)f大于128且小于256時(shí),則dacval賦值為0。反之若f大于256,則將f重新置為0。if(mode==2)

{

if(f<=128)

{

dacval

=

(4095*f/128)*Um/3.3;

}

else

if(f>128&&f<256)

{

dacval

=

(4095*(255-f)/128)*Um/3.3;

}

else

if(f>256)

{

f=0;

}

}

當(dāng)mode置為2時(shí),此時(shí)需要輸出的波形為三角波;通過(guò)三角波的圖形可以得知,三角波通過(guò)兩個(gè)直線組成,其中一條直線的斜率等于另一個(gè)直線斜率的負(fù)值。由此可得,在f小于128即一半周期時(shí),使用函數(shù)(4095*f/128)*Um/3.3將此時(shí)的值賦給dacval,若f為大于128且256即在另一半周期時(shí),則將兩個(gè)直線的斜率相反即可。最后若f大于0了,則做與上面相同的操作置為0。if(mode==3)

{

if(f<256)

{

dacval

=

(4095*f/128)*Um/3.3;

}

else

if(f>256)

{

f=0;

}

}

最后一個(gè)波形鋸齒波則是在mode為3時(shí)進(jìn)入,該函數(shù)的思路與三角波相同,只是鋸齒波并沒有向下走的波形,所以這里可以使用三角波的前半個(gè)周期的函數(shù)作為自己全部周期的函數(shù);當(dāng)f小于256時(shí),則使用(4095*f/128)*Um/3.3函數(shù)輸出向上遞增的波形;當(dāng)f大于256時(shí),則將f重新置為0。4.2.2LCD界面顯示模塊在使用LCD顯示文字或者我們需要的信息時(shí),首先需要做的是初始化LCD函數(shù)。LCD_Init();POINT_COLOR=RED;LCD_ShowString(60,50,200,16,16,"Mini

STM32");

LCD_ShowString(30,70,200,16,16,"PRESS

KEY0

TO

CHANGE");

LCD_ShowString(30,90,200,16,16,"PRESS

KEY1

TO

CHANGE

F");LCD_ShowString(30,110,200,16,16,"PRESS

WK

TO

CHANGE

Um");

LCD_ShowString(100,130,200,16,16,"2-8");在主函數(shù)中使用LCD_Init()函數(shù)對(duì)LCD進(jìn)行初始化,POINT_COLOR=RED將顯示的字體設(shè)置為紅色,最后使用LCD_ShowString將需要顯示的字體的位置以及內(nèi)容寫入。最后使用外部中斷函數(shù)的中斷處理函數(shù)將每一個(gè)波形的文字進(jìn)行顯示出來(lái)。外部中斷處理函數(shù)的初始化會(huì)在4.2.3節(jié)中進(jìn)行說(shuō)明。圖6KEY0中斷處理函數(shù)流程圖void

EXTI9_5_IRQHandler(void)

{

delay_ms(10);

if(KEY0==0)

{

mode++;

mode

%=4;

if(mode==1)

{

LCD_ShowString(60,50,200,16,16,"SinWave");

}

else

if(mode==0)

{

LCD_ShowString(60,50,200,16,16,"SquareWave");

}

else

if(mode==2)

{

LCD_ShowString(60,50,200,16,16,"TriangularWave");

}

else

if(mode==3)

{

LCD_ShowString(60,50,200,16,16,"SawtoothWave");

}

}

EXTI_ClearITPendingBit(EXTI_Line5);

}

上述函數(shù)為KEY0的外部中斷服務(wù)函數(shù),這里每次按下KEY0時(shí),都會(huì)mode++并且將此時(shí)的mode對(duì)4取余。判斷此時(shí)的mode時(shí)何止,并在LCD屏幕上顯示對(duì)應(yīng)的波形告訴用戶。例如:當(dāng)mode的值為1時(shí),此時(shí)將會(huì)輸出SinWave到LCD屏幕上。4.2.3波形調(diào)節(jié)模塊該波形波形發(fā)生器用到STM32F103所提供的三個(gè)外部按鍵,分別是WU_UP、KEY0、KEY1。這里通過(guò)前面的按鍵的電路原理圖可以得知三個(gè)通道對(duì)用的通道口為PA15、PC5和PA0。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,

ENABLE);

在對(duì)三個(gè)按鍵的GPIO口進(jìn)行初始化的時(shí)候首先最需要做的就是開啟其相應(yīng)的時(shí)鐘。GPIO_InitStructure.GPIO_Pin

=

GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode

=

GPIO_Mode_IPU;

GPIO_Init(GPIOA,

&GPIO_InitStructure);

GPIO初始化的過(guò)程這里不再做詳細(xì)介紹,唯一需要注意的是,我們需要將其GPIO口的模式設(shè)置為GPIO_Mode_IPU上拉輸入。GPIO_InitStructure.GPIO_Pin

=

GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode

=

GPIO_Mode_IPD;

GPIO_Init(GPIOA,

&GPIO_InitStructure);

這里的PA0的GPIO模式需要設(shè)置為默認(rèn)下拉輸入。該波形發(fā)生器所使用的外部中斷主要用于修改波形的顯示。其次是為了能夠在用戶界面上更快對(duì)屏幕進(jìn)行刷新。在直接調(diào)用外部中斷函數(shù)之前,我們需要配置外部中斷的初始化函數(shù),下面展示的為外部中斷函數(shù)初始化函數(shù)。void

EXTIX_Init(void)

{

EXTI_InitTypeDef

EXTI_InitStructure;

NVIC_InitTypeDef

NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

KEY_Init();

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

EXTI_InitStructure.EXTI_Line=EXTI_Line5;

EXTI_InitStructure.EXTI_Mode

=

EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger

=

EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd

=

ENABLE;

EXTI_Init(&EXTI_InitStructure);÷

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

EXTI_InitStructure.EXTI_Line=EXTI_Line15;

EXTI_InitStructure.EXTI_Mode

=

EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger

=

EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd

=

ENABLE;

EXTI_Init(&EXTI_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode

=

EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger

=

EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd

=

ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel

=

EXTI0_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority

=

0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority

=

0x02;

NVIC_InitStructure.NVIC_IRQChannelCmd

=

ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel

=

EXTI9_5_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority

=

0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority

=

0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd

=

ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel

=

EXTI15_10_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority

=

0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority

=

0x00;

NVIC_InitStructure.NVIC_IRQChannelCmd

=

ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

這段代碼是針對(duì)外部中斷EXTI(ExternalInterrupt)的初始化函數(shù)EXTIX_Init()。該函數(shù)主要目的是配置外部中斷的觸發(fā)條件和中斷優(yōu)先級(jí),并使能相應(yīng)的中斷。voidEXTIX_Init(void):這是函數(shù)的聲明,表明這是一個(gè)沒有參數(shù)和返回值的函數(shù)。EXTI_InitTypeDefEXTI_InitStructure;和NVIC_InitTypeDefNVIC_InitStructure;:這兩行聲明了用于配置外部中斷的結(jié)構(gòu)體變量EXTI_InitStructure和NVIC_InitStructure,分別用于配置外部中斷和中斷向量控制器NVIC。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);:這一行啟用了外設(shè)時(shí)鐘,確保AFIO(AlternateFunctionI/O)時(shí)鐘被使能,因?yàn)橥獠恐袛嗑€與GPIO有關(guān),需要配置GPIO的一些特殊功能,因此需要使能AFIO時(shí)鐘。KEY_Init();:這里調(diào)用了KEY_Init()函數(shù),該函數(shù)用于初始化外部中斷所涉及到的按鍵或者其他觸發(fā)源。GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);:配置外部中斷線,將GPIOC的第5個(gè)引腳與外部中斷線連接起來(lái)。接下來(lái)的一系列操作是配置外部中斷的觸發(fā)條件和使能外部中斷。以第一個(gè)外部中斷為例:EXTI_InitStructure.EXTI_Line=EXTI_Line5;:指定要配置的外部中斷線為線5。EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;:設(shè)置中斷模式。EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;:設(shè)置觸發(fā)方式為下降沿觸發(fā)。EXTI_InitStructure.EXTI_LineCmd=ENABLE;:使能外部中斷線。EXTI_Init(&EXTI_InitStructure);:將配置應(yīng)用到外部中斷線。類似地,后續(xù)的代碼配置了其他外部中斷,分別連接在不同的GPIO引腳上,并設(shè)置了不同的觸發(fā)方式。配置中斷優(yōu)先級(jí),NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;:指定中斷向量為EXTI0,即外部中斷線0。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;:設(shè)置搶占優(yōu)先級(jí)為2。NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;:設(shè)置子優(yōu)先級(jí)為2。NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;:使能中斷向量。NVIC_Init(&NVIC_InitStructure);:將配置應(yīng)用到中斷向量控制器。類似地,配置了其他的中斷向量,分別是EXTI9_5和EXTI15_10,設(shè)置了不同的優(yōu)先級(jí)。整個(gè)函數(shù)的作用就是初始化外部中斷,包括配置外部中斷觸發(fā)條件、連接到GPIO引腳、配置中斷優(yōu)先級(jí)以及使能中斷。這里使用的三個(gè)外部中斷按鍵以及其中斷服務(wù)函數(shù)。首先是外部中斷的初始化函數(shù)。這里首先需要初始化器對(duì)應(yīng)的外設(shè)寄存器,再使能其對(duì)應(yīng)的外部中斷通道。初始化其結(jié)構(gòu)體成員。這里詳細(xì)介紹外部中斷處理函數(shù)。在報(bào)告的開始我說(shuō)明了每個(gè)按鍵的功能,所以在這里對(duì)應(yīng)按鍵所發(fā)生中斷處理函數(shù)對(duì)應(yīng)其功能。void

EXTI0_IRQHandler(void)

{

delay_ms(10);

if(WK_UP==1)

{

if(Um<=1.65)

{

Um=Um+0.1;

}

else

{

Um=0.55;

}

}

第一個(gè)為按鍵WU_UP的功能,在改外部中斷EXTI.C文件中,使用extern聲明一個(gè)變量mode,這樣mdoe的值可以在C文件之間相互傳統(tǒng)。判斷WK_UP是否按下,若按下則是執(zhí)行電壓的加法,判斷當(dāng)電壓Um小于1.65時(shí),則將其自加0.1,反之若大于1.65了則將Um的值重新置為初始值0.55。KEY1的中斷服務(wù)函數(shù),該函數(shù)的作用是增加定時(shí)器arr的值以達(dá)到增加其頻率的目的。void

EXTI15_10_IRQHandler(void)

{

delay_ms(10);

//????

if(KEY1==0)

{

if(arr3

<=1000)

{

arr3=arr3+50;

}

else

{

arr3=50;

}

}

EXTI_ClearITPendingBit(EXTI_Line15);

//??3yLINE15???·1ò?e??

}

若arr的值超過(guò)的自己規(guī)定的最大值則將其重新置為默認(rèn)值5測(cè)試5.1多種波形顯示開機(jī)隨機(jī)顯示波形以及頻率。點(diǎn)擊KEY0進(jìn)行波形的轉(zhuǎn)換。通過(guò)圖8到圖15可以看出來(lái),每次點(diǎn)擊KEY0時(shí),LCD屏幕上的波形文字都會(huì)進(jìn)行改變,相對(duì)應(yīng)的示波器上的波形輸出也是對(duì)應(yīng)的波形。可以看出來(lái)在示波器上顯示的波形由于頻率過(guò)低會(huì)有失真的情況。圖7LCD顯示輸出正弦波圖8示波器顯示正弦波圖9LCD顯示輸出方波圖10示波器顯示方波圖11LCD顯示輸出鋸齒波圖12示波器顯示鋸齒波圖13LCD顯示輸出三角波圖14示波器輸出三角波通過(guò)圖8、圖10、圖12、圖14四個(gè)圖可以看出每次點(diǎn)擊KEY0時(shí),最上方顯示的波形文字會(huì)重新改變,但是由于短的字符串只會(huì)刷新其所需要的長(zhǎng)度,所以會(huì)出現(xiàn)當(dāng)長(zhǎng)字符串到短字符串時(shí),短字符串后面的字符串并沒有給刷新。5.2波形顯示幅度或?qū)挾日{(diào)整通過(guò)點(diǎn)擊STM32F103上自帶的WK_UP按鍵以及KEY1按鍵可以分別實(shí)現(xiàn)對(duì)幅度和頻率的單方向的調(diào)整。在經(jīng)過(guò)一段時(shí)間的點(diǎn)擊后,波形會(huì)重新回到最開始的頻率幅度。圖15方波頻率和幅度改變前圖16方波頻率幅度改變后在第四章中的波形發(fā)生模塊中,講到了定時(shí)器中斷處理函數(shù)的波形發(fā)生公式,通過(guò)圖16可以知道當(dāng)先的mode值為0,所以此時(shí)顯示的是方波。當(dāng)我們通過(guò)點(diǎn)擊WK_UP時(shí)則會(huì)改變程序中的Um值,每次點(diǎn)擊時(shí)Um的值都會(huì)進(jìn)行自加。同理當(dāng)我們點(diǎn)擊KEY1時(shí),外部中斷處理函數(shù)則會(huì)改變存儲(chǔ)定時(shí)器計(jì)數(shù)器自動(dòng)重載的值,即arr,通過(guò)修改arr的值可以實(shí)現(xiàn)修改頻率,但是每次修改的值都是不固定的的。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論