版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 本科畢業(yè)論文</b></p><p> 專 業(yè): 測控技術(shù)與儀器 </p><p> 班 級: 11測控2班 _ </p><p> 學(xué)生姓名:
2、 </p><p> 學(xué) 號: </p><p> 課 題: 基于STM32和DM9000的照明控制系統(tǒng) </p><p> 指導(dǎo)老師: </p><p> 完成時間:
3、2015年6月7日 </p><p> 二〇一五年六月七日 </p><p><b> 摘 要</b></p><p> 隨著計算機技術(shù)和電子信息技術(shù)的高速發(fā)展,特別是近年來在互聯(lián)網(wǎng)建設(shè)的推動下,照明控制系統(tǒng)越來越受到人們的關(guān)注。本課題在分析照明控制系統(tǒng)的研究現(xiàn)狀、發(fā)展趨勢、研究意義的基礎(chǔ)上提出了基于單片機以及
4、嵌入式操作系統(tǒng)的照明控制系統(tǒng)的設(shè)計方案。STM32F103是意法半導(dǎo)體推出全新STM32互連型系列微控制器中的一款性能較強產(chǎn)品,此芯片集成了各種高性能工業(yè)標(biāo)準(zhǔn)接口,且STM32不同型號產(chǎn)品在引腳和軟件上具有完美的兼容性,可以輕松適應(yīng)更多的應(yīng)用,此芯片可以滿足工業(yè)、醫(yī)療、樓宇自動化、家庭音響和家電市場多種產(chǎn)品需求。DM9000是一款單芯片快速以太網(wǎng)MAC控制器,它與STM32控制器通信,發(fā)送指令,通過I/O端口高低電平,控制繼電器,來實現(xiàn)
5、整個照明系統(tǒng)的智能控制。其主要特點在于功能實用、操作簡單、價格低廉、易于安裝,使得該系統(tǒng)可以廣泛應(yīng)用于學(xué)校、工廠等照明設(shè)施。</p><p> 關(guān)鍵詞:單片機;照明控制;嵌入式</p><p><b> Abstract</b></p><p> With the rapid development of computer technol
6、ogy and electronic information technology, especially in recent years in the construction of the Internet Push the lighting control system more and more attention of people. This paper on the basis of analysis of lightin
7、g control system, the research present situation, development trend and the research significance the microcontroller and embedded operating system of lighting control system design based on. STM32F103 is STMicroelectron
8、ics launched n</p><p> Key words: single chip computer;lighting control;flushbonading</p><p><b> 目 錄</b></p><p><b> 第一章 緒論1</b></p><p>
9、 1.1 照明控制系統(tǒng)設(shè)計研究的意義1</p><p> 1.2 國內(nèi)外發(fā)展概況與發(fā)展趨勢1</p><p> 第二章 系統(tǒng)總體設(shè)計方案與硬件介紹3</p><p> 2.1 系統(tǒng)的總體方案設(shè)計介紹3</p><p> 2.2 系統(tǒng)的硬件設(shè)計4</p><p> 2.2.1 單片機控制模
10、塊設(shè)計4</p><p> 2.2.2 DM9000網(wǎng)絡(luò)通信模塊7</p><p> 第三章 系統(tǒng)軟件設(shè)計10</p><p> 3.1 網(wǎng)絡(luò)通信協(xié)議13</p><p> 3.1.1 uIP協(xié)議棧及其體系結(jié)構(gòu)14</p><p> 3.1.2 協(xié)議棧接口14</p><p&
11、gt; 3.2 程序流程圖16</p><p> 3.2.1 程序運行初始化流程圖16</p><p> 3.2.2 程序功能流程圖17</p><p> 3.3 系統(tǒng) LED燈程序18</p><p> 3.4系統(tǒng)主程序22</p><p> 3.5通信協(xié)議程序30</p>&
12、lt;p> 第四章 系統(tǒng)的程序調(diào)試31</p><p> 4.1 系統(tǒng)的主程序調(diào)試31</p><p> 4.1.1 編寫程序31</p><p> 4.1.2 燒寫代碼下載 324.2系統(tǒng)硬件連接
13、 33 </p><p> 4.3系統(tǒng)調(diào)試結(jié)果34</p><p> 第五章 畢業(yè)設(shè)計總結(jié)36</p><p><b> 致謝37</b></p>&
14、lt;p><b> 參考文獻38</b></p><p> 附錄一:硬件電路圖39</p><p> 附錄二:英文資料和譯文41</p><p><b> 第一章 緒論</b></p><p> 1.1 照明控制系統(tǒng)設(shè)計研究的意義</p><p>
15、采用智能照明控制系統(tǒng),使照明系統(tǒng)工作在全自動狀態(tài),系統(tǒng)按預(yù)先設(shè)定的開館、值班、清掃、保安等照明模式進行工作,這些照明模式會按預(yù)先設(shè)定的時間相互自動地進行切換。提高管理水平,減少維護費用。博物館建筑面積一般較大,人工維護繁瑣,智能照明控制系統(tǒng)的應(yīng)用,將普通照明人為的開與關(guān)轉(zhuǎn)換成智能化管理,使管理者能將其高素質(zhì)的管理意識運用于照明控制系統(tǒng)中去,同時大大減少了館內(nèi)的運行維護費用??捎^的節(jié)能效果。智能照明控制系統(tǒng)使用了先進的電力電子技術(shù),能對控
16、制區(qū)域內(nèi)的燈具進行智能調(diào)光,當(dāng)室外光較強時,室內(nèi)照度自動調(diào)暗,室外光較弱時,室內(nèi)照度則自動調(diào)亮,使室內(nèi)的照度始終保持在恒定值附近,從而能夠充分利用自然光實現(xiàn)節(jié)能的目的。此外,智能照明的管理系統(tǒng)采用設(shè)置照明工作狀態(tài)等方式,通過智能化自動管理避免了照明區(qū)域“長明燈”等現(xiàn)象,根據(jù)照明的使用規(guī)律啟動不用的燈光場景,通過對燈光的調(diào)光也可以讓燈光不用滿負荷使用,又達到好的照度效果,大幅度的節(jié)約用電。</p><p> 保護
17、燈具,延長壽命。保護燈具實際上也是節(jié)能的一種方式,燈具損壞的致命原因主要是電壓過高,工作電壓越高,其壽命則成倍降低。因此適當(dāng)降低燈具工作電壓是延長燈具壽命的有效途徑。美萊恩控制系統(tǒng)能成功地抑制電網(wǎng)的沖擊電壓和浪涌電壓,使燈具不會因上述原因而過早損壞。并且美萊恩采用了軟啟動和軟關(guān)斷技術(shù),避免了燈絲的熱沖擊,使燈具壽命進一步得到延長。智能照明系統(tǒng)通常能使燈具壽命延長2~4倍,不僅節(jié)省大量燈具,而且大大減少更換燈具的工作量,有效地降低了照明系
18、統(tǒng)的運行費用。</p><p> 1.2 國內(nèi)外發(fā)展概況與發(fā)展趨勢</p><p> 上世紀(jì)90年代,美國率先提出了“綠色照明計劃”,這以后,各國也都在不同程度開始對其進行推廣工作。在我國,近幾年也加大了扶持LED綠色照明企業(yè)的力度,并制定節(jié)能認證標(biāo)準(zhǔn),提高產(chǎn)品技術(shù)和質(zhì)量水平,建立持續(xù)、高效發(fā)熱照明產(chǎn)品市場。更值得一提的是,國家和地方政府組織的“LED照明產(chǎn)品的大宗采購”,將LED綠
19、色照明產(chǎn)品推廣到市政建設(shè)、軌道交通、公共空間等領(lǐng)域;同時,開展電力需求管理活動,將綠色照明活動擴展到大型的集團公司、央企及私人企業(yè)。</p><p> 從綠色照明的發(fā)展階段來看,目前正處在產(chǎn)品創(chuàng)新、節(jié)能標(biāo)準(zhǔn)進一步規(guī)范的環(huán)節(jié)。以LED照明產(chǎn)品為例,由于其是一種高效、節(jié)能環(huán)保的新光源,國家和地方政府已開始從各方面推廣和扶持。然而照明行業(yè)的發(fā)展也面臨著一些難題,例如LED照明市場混亂,低價、質(zhì)量差的產(chǎn)品居多,為一些性
20、能優(yōu)異的綠色照明產(chǎn)品的市場占有率造成了很大影響。除此之外,照明產(chǎn)品標(biāo)準(zhǔn)不明確、節(jié)能要求不統(tǒng)一也為其推廣造成了困擾。</p><p> 年初,國家出臺的《綠色建筑行動方案》中,倡導(dǎo)節(jié)能減排、降低建筑能耗、減少二氧化碳排放、發(fā)展綠色建筑,這對綠色照明的發(fā)展是有一定的影響和推動作用的。當(dāng)然,僅有這個方案也是遠遠不夠的,我認為,在建立綠色建材標(biāo)準(zhǔn)體系時,綠色照明作為綠色建材的一部分也應(yīng)該納入標(biāo)準(zhǔn)體系之中。同時,國家在規(guī)
21、范綠色照明標(biāo)準(zhǔn)及要求、對照明產(chǎn)品進行質(zhì)量管制的同時,也應(yīng)該為照明企業(yè)的產(chǎn)品發(fā)展與創(chuàng)新指出階段性的方向,并適當(dāng)對綠色照明企業(yè)進行扶持。</p><p> 第二章 系統(tǒng)總體設(shè)計方案與硬件介紹</p><p> 2.1 系統(tǒng)的總體方案設(shè)計介紹</p><p> 命令 照明燈狀態(tài)</p><p> 命令 I
22、/O狀態(tài)(照明燈狀態(tài))</p><p><b> I/O</b></p><p><b> 圖2.1方案介紹</b></p><p> 首先控制端,通過網(wǎng)絡(luò)給網(wǎng)絡(luò)端口(dm9000網(wǎng)卡)發(fā)命令stm32取到命令控制I/O高低電平,控制繼電器控制照明燈。</p><p> 2.2 系統(tǒng)的硬件
23、設(shè)計</p><p> 電路原理圖繪制軟件Protel99SE介紹</p><p> Protel99SE是應(yīng)用于Windows9X/2000/NT操作系統(tǒng)下的EDA設(shè)計軟件,采用設(shè)計庫管理模式,可以進行聯(lián)網(wǎng)設(shè)計,具有很強的數(shù)據(jù)交換能力和開放性及3D模擬功能,是一個32位的設(shè)計軟件,可以完成電路原理圖設(shè)計,印制電路板設(shè)計和可編程邏輯器件設(shè)計等工作,可以設(shè)計32個信號層,16個電源--地
24、層和16個機加工層。</p><p> 2.2.1 單片機控制模塊設(shè)計</p><p> 普通設(shè)計中大多采用51單片機、PIC單片機或者是AVR 單片機,這些單片機的缺點是高功耗、性能低并且硬件資源匱乏。 相比之下, STM32 系列是基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用而專門設(shè)計的 ARM Cortex-M3 內(nèi)核的微控制器。</p><p>
25、圖2.2 STM32F103</p><p> 1.ARM控制器使用STM32F103,STM32F103是意法半導(dǎo)體推出全新STM32互連型系列微控制器中的一款性能較強產(chǎn)品,此芯片集成了各種高性能工業(yè)標(biāo)準(zhǔn)接口,且STM32不同型號產(chǎn)品在引腳和軟件上具有完美的兼容性,可以輕松適應(yīng)更多的應(yīng)用。 新STM32的標(biāo)準(zhǔn)外設(shè)包括10個定時器、兩個12位AD(模數(shù)轉(zhuǎn)換器) (快速交替模式下2M sample/s)、兩個12
26、位DA(數(shù)模轉(zhuǎn)換器)、兩個I2C接口、五個USART接口和三個SPI端口和高質(zhì)量數(shù)字音頻接口IIS,另外STM32F103擁有全速USB(OTG)接口,兩路CAN2.0B接口,以及以太網(wǎng)10/100 MAC模塊。此芯片可以滿足工業(yè)、醫(yī)療、樓宇自動化、家庭音響和家電市場多種產(chǎn)品需求。</p><p> 2.STM32F1系列屬于中低端的32位ARM微控制器,該系列芯片是意法半導(dǎo)體(ST)公司出品,其內(nèi)核是Cort
27、ex-M3。該系列芯片按片內(nèi)Flash的大小可分為三大類:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。</p><p> 3.芯片集成定時器,CAN,ADC,SPI,I2C,USB,UART,等多種功能 </p><p> 內(nèi)核:--ARM 32位的Cortex-M3,--最高72MHz工作頻率,在存儲器的0等待周期訪問時可達1.
28、25DMips/MHZ(DhrystONe2.1)--單周期乘法和硬件除法</p><p> 存儲器--從32K到512K字節(jié)的閃存程序存儲器(STM32F103XXXX中的第二個X表示FLASH容量,其中:“4”=16K,“6”=32K,“8”=64K,B=128K,C=256K,D=384K,E=512K)--最大64K字節(jié)的SRAM電源管理--2.0-3.6V供電和I/O引腳-上電/斷電復(fù)位(POR/PD
29、R)、可編程電壓監(jiān)測器(PVD)--4-16MHZ晶振振蕩器--內(nèi)嵌經(jīng)出廠調(diào)教的8MHz的RC振蕩器--內(nèi)嵌帶校準(zhǔn)的40KHz的RC振蕩器-產(chǎn)生CPU時鐘的PLL--帶校準(zhǔn)的32KHz的RC振蕩器</p><p> 低功耗 睡眠、停機和待機模為RTC和后備寄存器供電</p><p> 模數(shù)轉(zhuǎn)換器--2個12位模數(shù)轉(zhuǎn)換器,1us轉(zhuǎn)換時間(多達16個輸入通道)--轉(zhuǎn)換范圍:0至3.6V
30、--雙采樣和保持功能--溫度傳感器DMA--2個DMA控制器,共12個DMA通道:DMA1有7個通道,DMA2有5個通道--支持的外設(shè):定時器、ADC、SPI、USB、IIC和UART</p><p> --多達112個快速I/O端口(僅Z系列有超過100個引腳)</p><p> -26/37/51/80/112個I/O口,所有I/O口一塊映像到16個外部中斷;幾乎所有的端口均可容忍
31、5V信號</p><p><b> 調(diào)試模式</b></p><p> --串行單線調(diào)試(SWD)和JTAG接口--多達8個定時器--3個16位定時器,每個定時器有多達4個用于輸入捕獲/輸出比較/PWM或脈沖計數(shù)的通道和增量編碼器輸入--1個16位帶死區(qū)控制和緊急剎車,用于電機控制的PWM高級控制定時器--2個看門狗定時器(獨立的和窗口型的)--系統(tǒng)時間定時器:2
32、4位自減型計數(shù)器--多達9個通信接口:2個I2C接口3個USART接口(支持ISO7816接口,LIN,IRDA接口和調(diào)制解調(diào)控制)2個SPI接口(18M位/秒)CAN接口(2.0B主動)USB 2.0全速接口計算單元CRC計算單元,96位的新批唯一代碼 封裝 ECOPACK封裝。</p><p> 圖 2.3 STM32F103電路原理圖</p><p> 圖 2.4 時鐘電路&l
33、t;/p><p> 圖2.5 STM32F103 引腳分布圖</p><p> 2.2.2 DM9000網(wǎng)絡(luò)通信模塊</p><p> 1.DM9000是一款單芯片快速以太網(wǎng)MAC控制器。它有一個一般處理接口,一個10/100M自適應(yīng)的PHY和4K DWORD值的SRAM。它的目的是在低功耗和高性能進程的3.3V與5V的支持寬容,DM9000還提供了介質(zhì)無關(guān)的接
34、口,來連接所有提供支持介質(zhì)無關(guān)接口功能的家用電話線網(wǎng)絡(luò)設(shè)備或其他收發(fā)器。該DM9000支持8位,16位和32 位接口訪問內(nèi)部存儲器,以支持不同的處理器。DM9000物理協(xié)議層接口完全支持使用10MBps下3類、4類、5類非屏蔽雙絞線和100MBps下5類非屏蔽雙絞線,完全符合IEEE 802.3u規(guī)格。</p><p> 2.DM9000是Davicom公司的一款以太網(wǎng)控制芯片,在網(wǎng)絡(luò)中他可自動獲得同設(shè)定MAC
35、地址一致的IP包,完成IP包的收發(fā),再用ARM來結(jié)合完成上層協(xié)議,就構(gòu)成了一個完整的網(wǎng)絡(luò)終端。</p><p> 圖2.6 DM9000電路原理圖</p><p> 圖2.7驅(qū)動電路電路圖</p><p> 3. 網(wǎng)卡芯片 DM9000 和 STM32的連接。首 先,可 以 從 硬 件 上 完 成 網(wǎng) 卡 芯 片DM9000 與 ARM 處理器 STM32
36、的三大總線連接,以及和以太網(wǎng)的連接, 嵌入式 ARM系統(tǒng)和以太網(wǎng)接口連接圖</p><p> 嵌入式系統(tǒng) 數(shù)據(jù) 網(wǎng)卡芯片</p><p><b> 以太網(wǎng)連接</b></p><p> 地址 DM</p><p><b> STM32</b><
37、/p><p><b> 控制</b></p><p> 圖2.8 連接示意圖</p><p> 4.DM9000 默認 I/O 基地址為 300 H。CMD引腳用于設(shè)置 COMMAND 模式, CMD 為高時,選擇數(shù)據(jù)端口。CMD 為低時, 選地址端口。數(shù)據(jù)端口和地址端口的地址碼由下式?jīng)Q定:DM9000 地址端口 = 高位片選地址 +300H
38、+0H,DM9000 數(shù)據(jù)端口 = 高位片選地址 +300H+4H</p><p> 5.DM9000 的調(diào)試過程</p><p> DM9000 的調(diào)試過程中, 首先要確保芯片能否正常工作, 即確保 MAC 地址是存儲在 EE-PROM 中,且 MAC 地址正常。對DM9000 的寄存器進行讀寫測試, 從 PAB0 到 PAB5 把 MAC地址寫入到 DM9000 寄存器,然后再讀取
39、寄存器來驗證它。其次可以進行EEPROM93C46 的字?jǐn)?shù)據(jù)測試, 進行以太網(wǎng)連接測試, 通過連接LED 燈的亮滅以及讀取NSR寄存器來檢查IINKST bit[ 6] 的狀態(tài)是否為“1” 來驗證以太網(wǎng)是否已經(jīng)連接成功。進行外部環(huán)回測試, 使用一個交叉線插到 RJ-45, 檢查能否收到所發(fā)送的包。進行向另一臺主機發(fā)包、 收包的測試, 最后連上交換機, 把事先編譯好的程序下載到處理器中去, 驗證是否實現(xiàn)聯(lián)網(wǎng)。</p>&l
40、t;p> 第三章 系統(tǒng)軟件設(shè)計</p><p> 3.1 網(wǎng)絡(luò)通信協(xié)議</p><p> TCP/IP協(xié)議在全球互聯(lián)網(wǎng)上取得了巨大的成功,人們通過該協(xié)議進行文件傳送,電子郵件發(fā)送等多種應(yīng)用,TCP/IP協(xié)議已成為事實上的全球網(wǎng)絡(luò)通信標(biāo)準(zhǔn)。隨著嵌入式系統(tǒng)技術(shù)的深入發(fā)展,越來越多的嵌入式設(shè)備也需要互連成網(wǎng),協(xié)同工作,如無線傳感器、信息家電、智能儀表等。在嵌入式設(shè)備中通過TCP/IP
41、協(xié)議連接Interact網(wǎng)絡(luò)需求更加強烈。在嵌入式系統(tǒng)上運行TCP/IP協(xié)議可以使得該系統(tǒng)直接與內(nèi)部網(wǎng)絡(luò)甚至全球互聯(lián)網(wǎng)相聯(lián),而不需要引入額外的網(wǎng)關(guān)設(shè)備,給嵌入式設(shè)備通信帶來巨大的便利。嵌入式系統(tǒng)的本身資源有限,并且其應(yīng)用和功能比較單一,具有較強的針對性,因此不需要一個完整的TCP/IP網(wǎng)絡(luò)協(xié)議組件,只需要實現(xiàn)與需求相關(guān)的部分協(xié)議,不使用的協(xié)議則不需要支持。另一方面,對于某些特定的嵌入式系統(tǒng),甚至需要優(yōu)化TCP/IP協(xié)議?;蛘咴赥CP/I
42、P協(xié)議棧中編寫自己需要的網(wǎng)絡(luò)協(xié)議。那些不能提供開放源碼的商用嵌入式系統(tǒng)的TCP/IP協(xié)議棧很難滿足用戶的配置需求,需要用戶自行開發(fā)和定制適合自己系統(tǒng)需求的嵌入式</p><p> TCP/IP協(xié)議棧。</p><p> 由瑞典計算機科學(xué)研究所Adam Dunkels開發(fā)的uIP0.9,去掉了全功能TCP/IP協(xié)議棧中不常用的功能,保留網(wǎng)絡(luò)通信所必要的協(xié)議機制,大大減少了協(xié)議代碼量,降低
43、了協(xié)議對系統(tǒng)資源的要求。該協(xié)議由公開源代碼的c語言編寫,任何人都可以在網(wǎng)絡(luò)上下載其源代碼并對其進行修改,以適應(yīng)各自不同的應(yīng)用場合。uIP0.9采用模塊化設(shè)計,其代碼量在幾千字節(jié)左右,僅需要幾百字節(jié)的內(nèi)存就可以順利運行,完全適應(yīng)當(dāng)前的嵌入式系統(tǒng)。</p><p> 3.1.1 UIP協(xié)議棧及其體系結(jié)構(gòu)</p><p> UIP是一個適用于8/16位機上的小型嵌入式TCP/IP協(xié)議棧,簡單
44、易用,資源占用少是它的設(shè)計特點。其設(shè)計重點放在IP、ICMP和TCP協(xié)議的實現(xiàn)上,協(xié)議雖然也同時實現(xiàn)了UDP和ARP協(xié)議,但僅將其作為可選模塊。UIP處于網(wǎng)絡(luò)通信的中間層,其上層協(xié)議在這里被稱之為應(yīng)用程序,而下層硬件或固件被稱之為網(wǎng)絡(luò)設(shè)備驅(qū)動。TCP/IP協(xié)議組中的鏈路層協(xié)議如PPP等可由UIP之下的設(shè)備驅(qū)動實現(xiàn);應(yīng)用層協(xié)議如H33"P、FTP、SMTP等可由UIP之上的應(yīng)用程序?qū)崿F(xiàn)。這樣的設(shè)計方式大大減小了協(xié)議代碼量和RAM
45、 占用量。為進一步節(jié)省資源占用,簡化應(yīng)用接口,UIP在內(nèi)部實現(xiàn)上還作了如下特殊的處理:</p><p> ?、?采用單一的全局?jǐn)?shù)據(jù)收發(fā)緩沖區(qū),不支持內(nèi)存動態(tài)分配;</p><p> ?、?基于事件驅(qū)動的應(yīng)用程序接口,各并發(fā)連接采用輪循處理,僅當(dāng)網(wǎng)絡(luò)事件發(fā)生時,由UIP內(nèi)核喚起應(yīng)用程序處理。這樣,UIP用戶只須關(guān)注特定應(yīng)用就可以了。傳統(tǒng)的TCP/IP實現(xiàn)一般要基于多任務(wù)處理環(huán)境,而大多數(shù)8位
46、機系統(tǒng)不具備這個條件;</p><p> ?、?應(yīng)用程序主動參與部分協(xié)議棧功能的實現(xiàn)(如TCP的重發(fā)機制,數(shù)據(jù)包分段和流量控制),由UIP內(nèi)核設(shè)置重發(fā)事件,應(yīng)用程序重新生成數(shù)據(jù)提交發(fā)送,免去了大量內(nèi)部緩存的占用?;谑录?qū)動的應(yīng)用接口使得這些實現(xiàn)較為簡單。正是由于UIP所具有的以上顯著特點,自從0.6版本以來就被移植到多種處理器上,包括MSP430、AVR和Z80等。</p><p>
47、3.1.2 協(xié)議棧接口</p><p> 圖1描述了UIP、底層系統(tǒng)和應(yīng)用程序三者之間的調(diào)用關(guān)系。其中UIP協(xié)議通過一系列接口函數(shù)與底層系統(tǒng)和上層應(yīng)用程序通信,它內(nèi)部的協(xié)議集合對外部系統(tǒng)來說是透明的,從而增強了該協(xié)議的通用性和獨立性,可以非常方便地移植到不同系統(tǒng)和應(yīng)用平臺。圖1描述了UIP、底層系統(tǒng)和應(yīng)用程序三者之間的調(diào)用關(guān)系。其中UIP提供了3個函數(shù)給底層系統(tǒng):uip— init()'uip— inp
48、ut()’uip— periodic()。應(yīng)用程序向UIP提供一個調(diào)用函數(shù)uip appcall(),在網(wǎng)絡(luò)事件或計時事件發(fā)生時進行調(diào)用;同時,UIP也要向應(yīng)用程序提供一些與協(xié)議棧的接口函數(shù),應(yīng)用程序根據(jù)接口函數(shù)提供的信息或者狀態(tài),執(zhí)行相應(yīng)的操作。</p><p> Uip-appcall()</p><p> Uip-input()
49、 uip-periodc()</p><p> 圖3.1 UIP、底層系統(tǒng)和應(yīng)用程序之間的調(diào)用關(guān)系</p><p> 設(shè)備驅(qū)動程序接口:UIP內(nèi)核中有兩個函數(shù)直接提供給底層設(shè)備驅(qū)動程序。一個是uip— input(),當(dāng)設(shè)備驅(qū)動程序從網(wǎng)絡(luò)層收到的一個數(shù)據(jù)包時要調(diào)用這個函數(shù),設(shè)備驅(qū)動程序必須事先將數(shù)據(jù)包存入到uip bur中,包長放到uip— len,然后交由uip—i
50、nput()處理。當(dāng)函數(shù)返回時,如果uip— len不為0,則表明有帶外數(shù)據(jù)(如SYN,ACK等)要發(fā)送。當(dāng)需要ARP支持時,還需要考慮更新ARP表示或發(fā)出ARP請求和回應(yīng)。以下代碼即為設(shè)備驅(qū)動程序從網(wǎng)絡(luò)層收到的個數(shù)據(jù)包后的處理過程:</p><p> #define BUF ((struet uip—eth— hdr*)&uip— buf[O])</p><p><b&g
51、t; uip</b></p><p><b> —</b></p><p> len=ethemet</p><p><b> —</b></p><p> devicedriver</p><p><b> — poll();</b&
52、gt;</p><p> ?。邮找蕴W(wǎng)數(shù)據(jù)包(設(shè)備驅(qū)動程序)</p><p> if(uip— len>0){ //收到數(shù)據(jù)</p><p> if(BUF一>type: :HTONS(UIP</p><p><b> —</b></p><p><b> ETH
53、TYPE</b></p><p><b> — IP)){</b></p><p><b> //是IP包嗎?</b></p><p><b> uip</b></p><p> — arp—ipin(); //去除以太網(wǎng)頭結(jié)構(gòu),更新ARP表</p&g
54、t;<p><b> uip</b></p><p> — input(); //IP包處理</p><p> if(uip— len>0){ //有帶外回應(yīng)數(shù)據(jù)</p><p> uip-arp out(); //加以太網(wǎng)頭結(jié)構(gòu),</p><p> 在主動連接時可能要構(gòu)造ARP請求<
55、/p><p><b> ethemet</b></p><p><b> —</b></p><p> devieedriver</p><p><b> — send();</b></p><p> //發(fā)送數(shù)據(jù)到以太網(wǎng)(設(shè)備驅(qū)動程序)</
56、p><p><b> }</b></p><p><b> }else</b></p><p> if(sot一>type==HTONS(U1P-ETHTYPE-ARP)){</p><p><b> //是ARP請求包</b></p><p>
57、;<b> uip</b></p><p> — arp—arpin();//如是是ARP回應(yīng),更新ARP表;</p><p> 如果是請求,構(gòu)造回應(yīng)數(shù)據(jù)包</p><p> if(uip— len>0){</p><p> ?。茿RP請求,要發(fā)送回應(yīng)</p><p><b
58、> ethernet</b></p><p><b> —</b></p><p> devicedriver</p><p><b> — send();</b></p><p> ?。l(fā)ARP回應(yīng)到以太網(wǎng)上</p><p> 另一個UIP內(nèi)核
59、直接提供給底層設(shè)備驅(qū)動程序的函數(shù)是uip— periodic(conn)。這個函數(shù)用于UIP內(nèi)核對各連接的定時輪循,因此需要一個硬件支持的定時程序周期性地用它輪循各連接,一般用于檢查主機是否有數(shù)據(jù)要發(fā)送,如有,則構(gòu)造IP包。以下示例即為UIP內(nèi)核對各連接的定時輪循過程:</p><p> for(i=0;i<UIP— CONNS;i++){</p><p><b> u
60、ip</b></p><p> — periodic(i);</p><p> if(uip— len>O){</p><p><b> uip</b></p><p> — arp—out();</p><p><b> ethemet</b>&
61、lt;/p><p><b> —</b></p><p> devicedriver</p><p><b> — send();</b></p><p> 從本質(zhì)上來說,uip— input()和uip— periodic()在內(nèi)部是一個函數(shù),即uip— process(u8一t flag),
62、uIP的設(shè)計者將uip— process(UIP— DATA)定義成uip_intput(),而將uip— process(UIP— TIMER)定義成uip—periodic(),因此從代碼實現(xiàn)上來說是完全復(fù)用的。</p><p> 應(yīng)用程序接口:UIP使用基于事件的程序模式,應(yīng)用程序由c語言函數(shù)實現(xiàn)。當(dāng)收發(fā)數(shù)據(jù)、新連接建立或者數(shù)據(jù)需要重新傳輸時,UIP都會調(diào)用應(yīng)用程序。同時,應(yīng)用程序還要周期查詢是否有新的數(shù)
63、據(jù)收發(fā)。因為應(yīng)用程序只提供了一個回調(diào)函數(shù),所以應(yīng)用程序還要把不同的網(wǎng)絡(luò)服務(wù)映射到不同的端13和連接。UIP在接受到底層傳來的數(shù)據(jù)包后,如果需要送上層應(yīng)用程序處理,就調(diào)用UIP— APPCALL()。同時設(shè)置結(jié)構(gòu)體UIP— eonn指針指向當(dāng)前連接。UIP conn記錄一條TCP連接的所有相關(guān)信息,它是維持UIP運行的關(guān)鍵結(jié)構(gòu),定義如下:</p><p> struct【cp— conn{</p>
64、<p> u8一t tcpstateflags;//TCP的狀態(tài)和標(biāo)志</p><p><b> ul6</b></p><p> 一t lport,rpert;//當(dāng)?shù)睾瓦h端端口</p><p><b> ul6</b></p><p> 一t fipodar[2];//遠端的
65、地址</p><p><b> u8</b></p><p><b> 一</b></p><p><b> t rcv</b></p><p> nxt[4];//下一個要接收的序列號</p><p><b> u8</b&g
66、t;</p><p><b> 一</b></p><p><b> t sod</b></p><p> — xt[4];∥ 上一個已發(fā)送的序列號</p><p><b> u8</b></p><p> 一t aek-nxt[4];//對端
67、下一個應(yīng)答序列號</p><p><b> u8</b></p><p> 一t timer;//重傳時間</p><p><b> u8</b></p><p> 一t nrtx;//計算特殊段的重發(fā)數(shù)量</p><p> u8一t mss;//連接中最大分段的大
68、小</p><p> u8一t appstate[UIP— APPSTATE</p><p><b> — SIZE];</b></p><p> UIP提供給應(yīng)用程序的接口函數(shù)如:tep listen()、uip— connect()、uip— send()、tcp— datalen()、tcp—close()、tcp— abort()
69、、tcp— stop()、uip— stopped()、uip— restart()等,實現(xiàn)了TCP/IP協(xié)議棧的基本功能。為了將用戶的應(yīng)用程序掛接到UIP中,必須將宏UIP— APPcALL()定義成實際的應(yīng)用程序函數(shù)名,這樣每當(dāng)某個UIP事件發(fā)生時,內(nèi)核就會調(diào)用該應(yīng)用程序進行處理。如果要加入應(yīng)用程序狀態(tài)的話,必須將宏UIPAPPSTATESIZE定義成應(yīng)用程序狀態(tài)結(jié)構(gòu)體的長度。在應(yīng)用程序函數(shù)中,依靠UIP事件檢測函數(shù)來決定處理的方法
70、,另外可以通過判斷當(dāng)前連接的端口號來區(qū)分處理不同的連接。</p><p> 3.2 程序流程圖</p><p> 3.2.1 程序運行初始化流程圖</p><p> 圖3.2初始化流程圖</p><p> 3.2.2 程序功能流程圖</p><p> 當(dāng)通過網(wǎng)絡(luò)調(diào)
71、 </p><p> 試助手發(fā)來的指令時處理uIP事件 </p><p> 否 否</p><p> 是 是</p><p><b> 是</b></p><p><b
72、> 否</b></p><p><b> 圖3.3功能流程圖</b></p><p> 3.3 系統(tǒng) LED燈程序</p><p> #include "stm32f10x.h"</p><p> #include "uip.h" </p>
73、;<p> #include "uipopt.h"</p><p> #include "uip_arch.h"</p><p> #include <string.h> </p><p> #define LED1_ON()GPIO_SetBits(GPIOB, GPIO_Pin_5)
74、;</p><p> #define LED2_ON()GPIO_SetBits(GPIOC, GPIO_Pin_6);</p><p> #define LED3_ON()GPIO_SetBits(GPIOC, GPIO_Pin_7);</p><p> #define LED1_OFF()GPIO_ResetBits(GPIOB, GPIO_P
75、in_5);</p><p> #define LED2_OFF()GPIO_ResetBits(GPIOC, GPIO_Pin_6);</p><p> #define LED3_OFF()GPIO_ResetBits(GPIOC, GPIO_Pin_7);</p><p> extern unsigned short LPORT;</p>
76、;<p> void server_udp_appcall(void);</p><p> void led_poll(void);</p><p> *******************************************************************************</p><p> * 函
77、數(shù)名: void led_poll(void)</p><p> * 參 數(shù): 無</p><p> * 返 回: 無</p><p> * 功 能: 查詢LED燈的狀態(tài)并返回其狀態(tài)</p><p> *************************************************
78、*************************/</p><p> void led_poll(void)</p><p><b> {</b></p><p> uint8_t led1_readvalue;</p><p> uint8_t led2_readvalue;</p><p
79、> uint8_t led3_readvalue;</p><p> led1_readvalue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5 );</p><p> led2_readvalue = GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_6 );</p><p> led3
80、_readvalue = GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_7 );</p><p> if(led1_readvalue == 0)myudp_send("LED1 亮\n",8);</p><p> else myudp_send("LED1 滅\n",8);</p><p>
81、 if(led2_readvalue == 0)myudp_send("LED2 亮\n",8);</p><p> else myudp_send("LED2 滅\n",8);</p><p> if(led3_readvalue == 0)myudp_send("LED3 亮\n",8);</p><
82、p> else myudp_send("LED3 滅\n",8);</p><p><b> }</b></p><p> /*******************************************************************************</p><p> *函數(shù)
83、名: void myudp_send(char *str,short n) </p><p><b> *參 數(shù): </b></p><p><b> *返 回: 無</b></p><p> *功 能: UDP 數(shù)據(jù)包發(fā)送</p><p> ******************
84、********************************************************/</p><p> void myudp_send(char *str,short n) </p><p><b> { </b></p><p> char *nptr; </p><p>
85、 nptr = (char *)uip_appdata; </p><p> memcpy(nptr, str, n); </p><p> uip_udp_send(n); //發(fā)送n個數(shù)據(jù) </p><p><b> } </b></p><p> /*****************
86、**************************************************************</p><p> *函數(shù)名: void UDP_newdata(void) </p><p><b> *參 數(shù): </b></p><p><b> *返 回: 無</b><
87、/p><p> *功 能: UDP 數(shù)據(jù)包發(fā)送</p><p> **************************************************************************/</p><p> void server_udp_newdata(void) </p><p><b> {
88、 </b></p><p> char *nptr; </p><p> short len; </p><p> len = uip_datalen();//讀取數(shù)據(jù)長度 </p><p> nptr = (char *)uip_appdata; //取得數(shù)據(jù)起始指針 </p&g
89、t;<p> if(len<4)myudp_send("Please check the command!\n",26); </p><p> else if(strncmp(nptr,"getname",7)==0) myudp_send("Board of microcreat\n",19); </p><
90、p> else if(strncmp(nptr,"ledon 1",7)==0){</p><p> LED1_ON();</p><p> myudp_send("LED1 亮\n",8);</p><p><b> } </b></p><p> else if
91、(strncmp(nptr,"ledon 2",7)==0){</p><p> LED2_ON();</p><p> myudp_send("LED2 亮\n",8);</p><p><b> }</b></p><p> else if(strncmp(nptr,&
92、quot;ledon 3",7)==0){</p><p> LED3_ON();</p><p> myudp_send("LED3 亮\n",8);</p><p><b> }</b></p><p> else if(strncmp(nptr,"ledoff 1&q
93、uot;,8)==0){</p><p> LED1_OFF();</p><p> myudp_send("LED1 滅\n",8);</p><p><b> } </b></p><p> else if(strncmp(nptr,"ledoff 2",8)==0){
94、</p><p> LED2_OFF();</p><p> myudp_send("LED2 滅\n",8);</p><p><b> }</b></p><p> else if(strncmp(nptr,"ledoff 3",8)==0){</p>&
95、lt;p> LED3_OFF();</p><p> myudp_send("LED3 滅\n",8);</p><p><b> }</b></p><p> else if(strncmp(nptr,"ledpoll",7)==0) led_poll();</p><
96、p> else myudp_send("Unkown command!\n",16); </p><p><b> } </b></p><p> /*******************************************************************************</p><
97、;p> *函數(shù)名: void myudp_appcall(void) ) </p><p><b> *參 數(shù): </b></p><p><b> *返 回: 無</b></p><p> *功 能: UDP主函數(shù)</p><p> *****************
98、*********************************************************/</p><p> void server_udp_appcall(void) </p><p><b> { </b></p><p> if(uip_newdata()) </p><p&
99、gt;<b> { </b></p><p> server_udp_newdata(); } } </p><p><b> 3.4系統(tǒng)主程序</b></p><p> void LED_config(void)</p><p><b> {</b>&l
100、t;/p><p> GPIO_InitTypeDef GPIO_InitStructure;</p><p> RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); </p><p> /* LED -> PB1 */ </p><p> GPIO_In
101、itStructure.GPIO_Pin = GPIO_Pin_1;</p><p> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; </p><p> GPIO_Init(GPIOA, &a
102、mp;GPIO_InitStructure);</p><p><b> }</b></p><p> /****************************************************************************</p><p> * 名 稱:void RCC_Configuration
103、(void)</p><p> * 功 能:系統(tǒng)時鐘配置為72MHZ, 外設(shè)時鐘配置</p><p><b> * 入口參數(shù):無</b></p><p><b> * 出口參數(shù):無</b></p><p><b> * 說 明:</b></p>
104、<p><b> * 調(diào)用方法:無 </b></p><p> ****************************************************************************/ </p><p> void RCC_Configuration(void)</p><p><b&g
105、t; {</b></p><p> // RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE); </p><p> SystemInit();</p><p><b> }</b></p><p> struct timer periodic
106、_timer, arp_timer;</p><p> /****************************************************************************</p><p> * 名 稱:int main(void)</p><p> * 功 能:程序入口</p><p>
107、;<b> * 入口參數(shù):無</b></p><p><b> * 出口參數(shù):無</b></p><p><b> * 說 明:</b></p><p><b> * 調(diào)用方法:無 </b></p><p> ***************
108、*************************************************************/ </p><p> int main(void)</p><p><b> {</b></p><p> const uint8_t mac_addr[6] = {0x00,0xe0,0x3d,0xf4,0xdd,
109、0xf7};</p><p><b> int i;</b></p><p> struct uip_eth_addr ethaddr;</p><p> struct timer t;</p><p> DHCP_SUCCESS_FLAG = 0x00;</p><p> RCC_Co
110、nfiguration(); //系統(tǒng)時鐘設(shè)置</p><p> LED_config();</p><p> Usart1_Init(); //串口1初始化</p><p> Usart2_Init();</p><p> timer_set(&t, 100);</p
111、><p><b> //基本時鐘</b></p><p> clock_arch_init(); </p><p> timer_set(&periodic_timer, CLOCK_SECOND / 2);</p><p> timer_set(&arp_timer, CLOCK_SECOND *
112、10);</p><p> /* 顯示例程Logo */</p><p> printf("**** system is run *******\r\n"); //向串口1發(fā)送開機字符。</p><p> net_inital();/* 初始化網(wǎng)絡(luò)設(shè)備以及UIP協(xié)議棧,配置IP地址 */</p><p
113、> //應(yīng)用層MAC初始化</p><p> for (i = 0; i < 6; i++) </p><p> ethaddr.addr[i] = mac_addr[i];</p><p> uip_setethaddr(ethaddr);//UIP MAC初始化</p><p><b> //UIP初始化&
114、lt;/b></p><p> uip_init();</p><p><b> //ARP初始化</b></p><p> uip_arp_init();</p><p> dhcpc_init(&mac_addr, 6);</p><p> /* 創(chuàng)建一個TCP監(jiān)聽端口
115、和http監(jiān)聽端口,端口號為1200,80 */</p><p> uip_listen(HTONS(1200));</p><p> while (1)uip_listen(HTONS(5005)); </p><p><b> {</b></p><p> /* 處理uip事件,必須插入到用戶程序的循環(huán)
116、體中 */</p><p> UipPro(); //中斷觸發(fā)讀取網(wǎng)絡(luò)接收緩存</p><p> eth_poll(); //定時查詢TCP及UDP連接收發(fā)狀態(tài)ARP表更新, 并響應(yīng)</p><p><b> }</b></p><p><b> }</b>&l
117、t;/p><p> /****************************************************************************</p><p> * 名 稱:void eth_poll(void)</p><p> * 功 能:定時查詢TCP連接收發(fā)狀態(tài)ARP表更新, 并響應(yīng)</p>&l
118、t;p><b> * 入口參數(shù):無</b></p><p><b> * 出口參數(shù):無</b></p><p><b> * 說 明:</b></p><p><b> * 調(diào)用方法:無 </b></p><p> *********
119、*******************************************************************/ </p><p> void eth_poll(void){</p><p> unsigned char i=0;</p><p> if(timer_expired(&periodic_timer)) </
120、p><p><b> {</b></p><p> if( 0x02 == DHCP_SUCCESS_FLAG)</p><p><b> {</b></p><p> led_flag = ~led_flag;</p><p> (led_flag == 0x00)
121、 </p><p> GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET) ; </p><p> GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);</p><p><b> }</b></p><p> timer_re
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文 基于stm32和dm9000的照明控制系統(tǒng)
- 基于stm32和dm9000的照明控制系統(tǒng)
- 基于stm32的pid閉環(huán)恒壓控制系統(tǒng)設(shè)計-畢業(yè)論文
- 基于stm32病房呼叫系統(tǒng)畢業(yè)論文
- 基于STM32的隧道照明智能控制系統(tǒng)設(shè)計.pdf
- 基于stm32的室內(nèi)溫度控制系統(tǒng)
- 基于stm32的飛艇魚控制系統(tǒng)設(shè)計
- 基于stm32的智能小車設(shè)計-畢業(yè)論文
- 基于ZigBee和STM32的智能照明系統(tǒng)設(shè)計.pdf
- 論文-基于stm32的智能家居遠程控制系統(tǒng)
- 基于stm32的偏控制系統(tǒng)的研究.pdf
- 基于STM32的網(wǎng)絡(luò)門禁控制系統(tǒng)設(shè)計.pdf
- 基于STM32的模糊PID溫度控制系統(tǒng).pdf
- 基于stm32的1024點fft變換【畢業(yè)論文】
- 基于DM9000以太網(wǎng)控制器的網(wǎng)絡(luò)家電控制系統(tǒng).pdf
- 基于stm32的智能入口控制系統(tǒng)設(shè)計【開題報告】
- 基于stm32的脈搏測量儀設(shè)計畢業(yè)論文
- 基于stm32的溫度測量系統(tǒng)畢業(yè)設(shè)計論文
- 基于STM32的智能家居控制系統(tǒng)設(shè)計.pdf
- 基于STM32水處理裝置控制系統(tǒng)的研發(fā).pdf
評論
0/150
提交評論