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