基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)_第1頁
基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)_第2頁
基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)_第3頁
基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)_第4頁
基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課程設(shè)計(jì)說明書題目:基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程:ARM課程設(shè)計(jì)院〔部〕:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)班級:學(xué)生姓名:學(xué)號:指導(dǎo)教師:完成日期:目錄18943課程設(shè)計(jì)說明書I15334課程設(shè)計(jì)任務(wù)書1269441.課程設(shè)計(jì)題目2214942.課程設(shè)計(jì)目的219723.課程設(shè)計(jì)內(nèi)容2277213.1硬件資源2278533.2軟件資源759973.3調(diào)試環(huán)境準(zhǔn)備與使用10118293.4系統(tǒng)設(shè)計(jì)步驟1052043.4.1需求分析10223423.4.2概要設(shè)計(jì)1142093.4.3詳細(xì)設(shè)計(jì)15310063.4.4系統(tǒng)實(shí)現(xiàn)及調(diào)試19296923.4.5功能測試39205743.4.6系統(tǒng)評價(jià)〔結(jié)果分析〕40207933.5.結(jié)論〔體會〕41219723.6.參考文獻(xiàn)415865課程設(shè)計(jì)指導(dǎo)教師評語42山東建筑大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院課程設(shè)計(jì)任務(wù)書設(shè)計(jì)題目基于STM32的無線通信系統(tǒng)設(shè)計(jì)指導(dǎo)教師班級學(xué)號技術(shù)參數(shù)和設(shè)計(jì)要求技術(shù)參數(shù):基于Cortex-M3內(nèi)核的奮斗STM32開發(fā)板,無線射頻收發(fā)器nRF24L01P工作于2.4GHz頻段,STM32和nRF24L01P之間采用SPI接口方式,嵌入式操作系統(tǒng)平臺采用uC/OS-II。設(shè)計(jì)要求:用STM32開發(fā)板和nRF24L01擴(kuò)展板設(shè)計(jì)一個(gè)基于uC/OS-II的無線通信系統(tǒng),能夠?qū)崿F(xiàn)兩個(gè)無線節(jié)點(diǎn)間的數(shù)據(jù)收發(fā)。設(shè)計(jì)內(nèi)容與步驟設(shè)計(jì)內(nèi)容:編寫STM32和nRF24L01P的初始化程序。將uC/OS-II移植至STM32。設(shè)計(jì)簡單的無線通信協(xié)議,編寫無線通信任務(wù)和射頻收發(fā)中斷效勞子程序。設(shè)計(jì)步驟:uC/OS-II任務(wù)劃分及概要設(shè)計(jì),ISR的功能設(shè)計(jì)。編寫STM32和nRF24L01P的初始化程序,調(diào)試STM32的片內(nèi)定時(shí)器模塊,編寫基于nRF24L01P模塊的數(shù)據(jù)收發(fā)ISR。編寫與移植相關(guān)的幾個(gè)函數(shù),將uC/OS-II移植至STM32。擬定通信協(xié)議,編寫無線通信任務(wù)。利用兩套STM32開發(fā)板和nRF24L01擴(kuò)展板調(diào)試上述功能,總結(jié)分析,撰寫課程設(shè)計(jì)說明書。設(shè)計(jì)工作方案與進(jìn)度安排奮斗STM32開發(fā)版資源及應(yīng)用:10學(xué)時(shí)《CortexM3權(quán)威指南》、《STM32F10X參考手冊》、《STM32固件庫手冊》:20學(xué)時(shí)MDK安裝及使用:5學(xué)時(shí)概要設(shè)計(jì):15學(xué)時(shí)uC/OS-II移植及所用外設(shè)的驅(qū)動程序編寫:10學(xué)時(shí)無線通信任務(wù)編程及調(diào)試:15學(xué)時(shí)撰寫課程設(shè)計(jì)說明書:15學(xué)時(shí)設(shè)計(jì)考核要求考勤20%課程設(shè)計(jì)說明書50%。成果演示30%課程設(shè)計(jì)題目基于STM32的無線通信系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)目的《ARM課程設(shè)計(jì)》是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的專業(yè)限定選修實(shí)踐課程,是學(xué)習(xí)《嵌入式系統(tǒng)設(shè)計(jì)》課程后必要的實(shí)踐教學(xué)環(huán)節(jié)。通過本課程設(shè)計(jì)使學(xué)生加深理解、穩(wěn)固課堂教學(xué)和平時(shí)實(shí)驗(yàn)內(nèi)容,使學(xué)生初步具備嵌入式應(yīng)用系統(tǒng)分析、系統(tǒng)設(shè)計(jì)、系統(tǒng)實(shí)現(xiàn)與測試的實(shí)際能力,強(qiáng)化學(xué)生的實(shí)踐意識、提高動手能力,發(fā)揮學(xué)生的想象力和創(chuàng)新能力,從而實(shí)現(xiàn)課程教學(xué)目標(biāo)。提高綜合運(yùn)用所學(xué)知識進(jìn)行系統(tǒng)分析、設(shè)計(jì)的能力。加深對嵌入式軟件開發(fā)流程以及工程開發(fā)步逐的認(rèn)識,進(jìn)一步熟悉UC/OS-II的一直與使用,進(jìn)一步熟悉UCGUI的使用,提高嵌入式軟件開發(fā)所必須的技能。本課程設(shè)計(jì)主要培養(yǎng)學(xué)生在嵌入式系統(tǒng)設(shè)計(jì)方面的能力。通過本課程的學(xué)習(xí)和實(shí)踐,學(xué)生應(yīng)能在嵌入式系統(tǒng)組成形式、構(gòu)造方法、設(shè)計(jì)流程以及基于集成開發(fā)環(huán)境調(diào)試嵌入式系統(tǒng)的方法等方面得到鍛煉,在硬件系統(tǒng)設(shè)計(jì)〔整合〕、操作系統(tǒng)移植、應(yīng)用程序編寫等方面得到全面訓(xùn)練。3.課程設(shè)計(jì)內(nèi)容3.1硬件資源基于奮斗STM32開發(fā)板,完成<基于STM32的無線通信系統(tǒng)設(shè)計(jì)>的設(shè)計(jì)及調(diào)試。系統(tǒng)涉及的硬件資源主要有:電源模塊AMS1117-3.3〔N1〕輸入+5V,提供3.3V的固定電壓輸出,為了降低電磁干擾,C1-C5為CPU提供BANK電源〔VCC:P50、P75、P100、P28、P11GND:P49、P74、P99、P27、P10〕濾波。CPU的模擬輸入電源供電腳VDDA〔P22〕通過L122uH的電感與+3.3VVDD電壓連接,CPU的模擬地VSSA(P19)及VREF-〔P20〕通過R10歐電阻與GND連接。VREF+(P21)采用VDDA(P22)電源基準(zhǔn)。RT9166-2.5〔N2〕和RT9166-2.8〔N3〕輸入+5V,提供2.5V及2.8V的固定電壓輸出,為MP3電路VS1003提供所需的電壓。為RTC的備份電源采用V13.3V鋰離子片狀電池,如圖3.1。圖3.1復(fù)位時(shí)鐘模塊外部晶體/陶瓷諧振器(HSE)〔P12、P13〕:B1:8MHz晶體諧振器,C8,C9諧振電容選擇10P。系統(tǒng)的時(shí)鐘經(jīng)過PLL模塊將時(shí)鐘提高到72MHz。低速外部時(shí)鐘源(LSE)〔P8、P9〕:B2:32.768KHz晶體諧振器。C10,C11諧振電容選擇10P。注意:根據(jù)ST公司的推薦,B2要采用電容負(fù)載為6P的晶振,否那么有可能會出現(xiàn)停振的現(xiàn)象,時(shí)鐘模塊如圖3.2所示。圖3.2主控芯片采用STM32F103VET6作為開發(fā)板的MCU平臺。這個(gè)MCU是STM32F103里的高容量芯片,具有512K字節(jié)的內(nèi)部FLASH,64K字節(jié)的SRAM,外設(shè)資源有全速USBDevice,SDIO,SPI,I2C,I2S,F(xiàn)SMC,定時(shí)器,USART,ADC,DAC,CAN等接口,如圖3.3所示。圖3.3LCD液晶顯示模塊LCD顯示模塊采用STM32的FSMC接口模式。顯示速度更快。3寸屏,分辨率240X400,64K色,數(shù)據(jù)接口16位,背光源是4LED并聯(lián)模式,背光驅(qū)動采用白光驅(qū)動器提供背光用的橫流源,使背光更加均勻,背光明暗控制采用TTL電平或者PWM模式控制。屏上帶電阻式觸摸屏,模塊板上帶SPI控制方式的觸摸屏控制電路,如圖3.4所示。圖3.4串行接口擁有1路RS-232接口,CPU的PA9-US1-TX〔P68〕、PA10-US1-RX〔P69〕通過MAX3232實(shí)現(xiàn)1路RS-232接口,分別連接在XS5和XS17接口上。USART1在系統(tǒng)存儲區(qū)啟動模式下,可以通過該口通過PC對板上的CPU進(jìn)行ISP,該口也可作為普通串口功能使用,XS6接口作為TTL異步通信接口USART2的接口,在一些應(yīng)用的調(diào)試上有作用,比方通過XS6連接GPSOEM板,可以接收GPS的協(xié)議數(shù)據(jù)。串行接口如圖3.5所示。USART1地址:0x40013800-0x40013BFFUSART2地址:0x40004400-0x400047FF圖3.5NRF24L01模塊簡介本實(shí)驗(yàn)采用的無線模塊芯片型號為NRF24L01+,是工作在2.4~2.5GHz頻段的,具備自動重發(fā)功能,6個(gè)數(shù)據(jù)傳輸通道,最大無線傳輸速率為2Mbits。MCU可與該芯片通過SPI接口訪問芯片的存放器進(jìn)行配置,模塊規(guī)格如圖3.6所示。圖3.6SPI寫操作圖3.7SPI讀操作圖3.83.2軟件資源操作系統(tǒng)操作系統(tǒng)介紹本設(shè)計(jì)所使用的UC/OS-II操作系統(tǒng)版本號為2.85,是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實(shí)時(shí)多任務(wù)操作系統(tǒng)內(nèi)核。它被廣泛應(yīng)用于微處理器、微控制器和數(shù)字信號處理器μC/OS-II是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實(shí)時(shí)多任務(wù)操作系統(tǒng)內(nèi)核。它被廣泛應(yīng)用于微處理器、微控制器和數(shù)字信號處理器;最小編譯內(nèi)核可到達(dá)2KB,結(jié)構(gòu)精簡,硬件要求低。目錄結(jié)構(gòu)UC-OS-II/Port在此目錄下包含三個(gè)文件,OS_CPU_C.C,OS_DBG.C,OS_CPU_A.ASM;在OS_CPU_C.C中,定義了系統(tǒng)初始化,系統(tǒng)滴答,系統(tǒng)堆棧初始化等鉤子函數(shù)函數(shù),其中,除了系統(tǒng)堆棧初始化是“可重入的〞,其他函數(shù)都是不可沖入函數(shù),在執(zhí)行期間必須關(guān)閉中斷,否那么系統(tǒng)將會出現(xiàn)不可預(yù)料的錯(cuò)誤。在OS_DBG.C中,聲明了調(diào)試相關(guān)的數(shù)據(jù)結(jié)構(gòu),以及全局的數(shù)據(jù)結(jié)構(gòu)配置聲明數(shù)據(jù)信息,以及系統(tǒng)調(diào)試初始化函數(shù);在OS_CPU_A.ASM中,使用arm匯編程序完成了全局中斷的保存于回復(fù),最高就緒態(tài)的執(zhí)行,系統(tǒng)上下文切換,系統(tǒng)異常掛起以及進(jìn)入異常的堆棧操作等函數(shù);UC-OS-II/CPU在此目錄下僅有CPU_A.asm這一個(gè)文件,通篇使用arm匯編完成;主要操作有中斷的使能與去除;臨界區(qū)操作〔進(jìn)出臨界區(qū)〕;UC-OS-II/Source在此目錄下是操作系統(tǒng)的平臺無關(guān)性源碼,保存了系統(tǒng)核心代碼、郵箱,內(nèi)存管理,信號量,消息隊(duì)列,臨界資源控制,時(shí)間控制等操作系統(tǒng)的各種高級應(yīng)用API接口函數(shù),是操作系統(tǒng)的主要功能實(shí)現(xiàn)局部;修改內(nèi)容在通過以上的了解之后,UC-OS-II系統(tǒng)的源碼結(jié)構(gòu)十分清晰,在此只需要修改UC-OS-II/Port,UC-OS-II/CPU這兩個(gè)文件中的少量代碼即可〔細(xì)節(jié)將在詳細(xì)設(shè)計(jì)中介紹〕。固件庫stm32f10x_stdperiph_lib,系統(tǒng)庫的結(jié)構(gòu)如圖3.9所示:圖3.9CMSCS文件夾內(nèi)包含的內(nèi)容與cpu內(nèi)核和cpu啟動相關(guān)的文件,stm32F10x_stdperiph_driver文件內(nèi)包含了stm32f10x系列所有外設(shè)的驅(qū)動庫;stm32f10x_stdperiph_example內(nèi)包含了多個(gè)關(guān)于本系列芯片的一些例程;stm32f10x_stdperiph_templete內(nèi)包含了多種開發(fā)平臺的模板;最下面的chm文件為關(guān)于固件庫的使用說明;MSICS文件,如圖3.10所示:圖3.10core_m3.c為內(nèi)核相關(guān)源碼;start_up_stm32f10x.hd.s為stm32f10x高容量系列的啟動文件;system_stm32f10x.c為系統(tǒng)時(shí)鐘和cpu設(shè)置相關(guān)配置的源碼;stm32F10x_stdperiph_driver這個(gè)文件夾內(nèi)容如圖3.11,包含兩個(gè)局部,為庫的外設(shè)驅(qū)動源碼文件夾,inc中保存頭文件,src保存相關(guān)外設(shè)的源文件。圖3.11圖3.12所示的是外設(shè)驅(qū)動庫的頭文件的內(nèi)容:圖3.12圖3.13所示的是外設(shè)驅(qū)動庫的C文件內(nèi)容:圖3.13在本設(shè)計(jì)中僅使用FSMC,GPIO,RCC,MSIC,EXTI,SPI六個(gè)局部;因此只需添加這三個(gè)原文件即可;其中FSMC用來做液晶顯示驅(qū)動;RCC為操作系統(tǒng)提供systick;MSIC提供了中斷相關(guān)的函數(shù);GPIO用來做USB的開關(guān)控制;EXTI使用外部中斷;SPI提供SPI總線操作,為NRF24C01和觸摸屏提供支持;因此以上局部必須添加;頭文件在工程設(shè)置中C/C++現(xiàn)象卡中的includePATH里面選擇;UCGUIuC/GUI是Micrium公司研發(fā)的通用的嵌入式用戶圖像界面軟件。他給任何使用圖像LCD的應(yīng)用程序提供單獨(dú)于處理器和LCD控制器之外的有效的圖形用戶接口。能夠應(yīng)用于單一任務(wù)環(huán)境,也能夠應(yīng)用于多任務(wù)環(huán)境中。uC/GUI能夠應(yīng)用于任何LCD控制器和CPU的任何尺寸的物理顯示或模擬顯示中。在此,使用的UCGUI已經(jīng)封裝成庫文件,所有的調(diào)用接口可以在GUI.h等頭文件里面看到。用戶應(yīng)用程序只需描述關(guān)于窗口的數(shù)據(jù)結(jié)構(gòu),GUI顯示初始化函數(shù),回調(diào)函數(shù),以及用戶界面任務(wù)函數(shù)四個(gè)局部;進(jìn)行顯示任務(wù)設(shè)計(jì)時(shí)可以借助UCGUIBulider,通過圖形界面設(shè)計(jì)產(chǎn)生比擬準(zhǔn)確的界面布局?jǐn)?shù)據(jù),在本設(shè)計(jì)中,由于涉及到較多的按鍵,因此UCGUIBulider只能編輯到BUTTON9,需要注意的是GUI.H里面定義了用戶自定義ID,可以借助這個(gè)ID在根底上增加數(shù)字實(shí)現(xiàn)大范圍ID定義。3.3調(diào)試環(huán)境準(zhǔn)備與使用MDK編譯調(diào)試環(huán)境安裝MDK安裝:首先安裝MDK,是常規(guī)安裝,next,agree。。。。最后選擇不安裝ULINK等;安裝完畢后,以管理員身份運(yùn)行keil,在file-》lisenceManagement拷給CID,然后翻開破解軟件,拷貝CID,generation拷貝lisence碼至keil的lisenceManagement內(nèi)的license欄,add添加lisence看到2023年的使用期限那么破解成功;JLINK驅(qū)動安裝JLINK安裝與常規(guī)軟件安裝無異,最后可以不建立桌面快捷方式和菜單啟動選項(xiàng);MDK建立工程MDK工程屬性設(shè)置使用MDK調(diào)試工程使用MDK下載運(yùn)行3.4系統(tǒng)設(shè)計(jì)步驟3.4.1需求分析本設(shè)計(jì)需要實(shí)現(xiàn)功能:編寫STM32和nRF24L01P的初始化程序。將uC/OS-II移植至STM32。設(shè)計(jì)簡單的無線通信協(xié)議,編寫無線通信任務(wù)和射頻收發(fā)中斷效勞子程序。性能價(jià)格要求:在開發(fā)板固有硬件資源上盡量不增加硬件資源;選擇免費(fèi)開源嵌入式操作系統(tǒng);使用操作系統(tǒng),提高任務(wù)調(diào)度,資源管理,系統(tǒng)穩(wěn)定性;使用中斷提高響應(yīng)速度。熱設(shè)計(jì)要求:開發(fā)板功耗相對較低,發(fā)熱元器件分布為分散,不需要其他措施來提高散熱能力;信息平安要求:本設(shè)計(jì)為實(shí)驗(yàn)產(chǎn)品,暫不考慮在PC機(jī)與開發(fā)板通信過程中增加加密模塊;如果是在工程工程中,有必要開率增加通信加密模塊〔AES或者LBLock都可考慮〕。3.4.2概要設(shè)計(jì)(1)軟件結(jié)構(gòu)圖圖形輸入輸出界面和無線收發(fā)任務(wù)圖形輸入輸出界面和無線收發(fā)任務(wù)uCGUI庫文件uCOSII實(shí)時(shí)操作系統(tǒng)uCGUI庫文件uCOSII實(shí)時(shí)操作系統(tǒng)ST庫NRF驅(qū)動LCD驅(qū)動ST庫NRF驅(qū)動LCD驅(qū)動圖3.14(2)程序流程圖開始開始底層驅(qū)動初始化系統(tǒng)時(shí)鐘、中斷向量、LED指示燈、串口、uCOS操作系統(tǒng)、uCGUI、觸摸屏初始化檢測無線模塊連接情況繪制搜索無線模塊界面NRF模塊是否連接初始化NRF無線模塊配置NRF為接收模式繪制輸入輸出界面是否是否有輸入接收數(shù)據(jù),并將數(shù)據(jù)顯示在液晶屏上是否否是是否有發(fā)送請求NRF切換成發(fā)送模式發(fā)送數(shù)據(jù)NRF切換成發(fā)送模式發(fā)送數(shù)據(jù)發(fā)送完成后是否接到響應(yīng)是否到達(dá)最大發(fā)送次數(shù)NRF切換至接收模式是是否否A.任務(wù)描述編號任務(wù)名稱英文簡稱優(yōu)先級堆棧容量〔BYTE〕任務(wù)描述1開始任務(wù)App_TaskStart2128創(chuàng)立其他子任務(wù)2用戶界面AppTaskUserIF5256創(chuàng)立輸入輸出窗體3觸摸輸入AppTaskKbd4512檢測觸摸屏輸入4空閑Idle1016空閑任務(wù)ISR描述編號ISR名稱英文簡稱優(yōu)先級ISR描述1復(fù)位RST_ISR1上電復(fù)位,看門狗復(fù)位,按鍵復(fù)位2系統(tǒng)時(shí)鐘SysTickHandler2系統(tǒng)時(shí)鐘中斷3外部中斷0EXTI0_IRQHandler組優(yōu)先級0,次優(yōu)先級1〔NRF24L01中斷〕〔3〕接口設(shè)計(jì)用戶接口HMI硬件:TFT3.2寸液晶屏 控制器ILI9341TFT觸摸控制器TSC2046 軟件:uCGUI窗體文本編輯框控件,顯示要發(fā)送的內(nèi)容TXT文本顯示控件,顯示接收到的內(nèi)容按鍵控件,sendclear發(fā)送和清空按鍵,大小寫轉(zhuǎn)換按鍵和數(shù)字和字母組合按鍵。內(nèi)部接口UART接口:用于串口調(diào)試。Uart1管腳配置管腳名稱管腳名稱輸入輸出模式Uart_TXGPIOAGPIO_Pin_9復(fù)用推完輸出模式Uart_RXGPIOAGPIO_Pin_10浮空輸入模式Uart1模式配置 波特率:115200 數(shù)據(jù)位:8 停止位:1 校驗(yàn)位:無SPI接口:NRF24L01模塊通信接口SPI2管腳配置管腳名稱對應(yīng)管腳管腳輸入輸出模式SCKGPIOBGPIO_Pin_13復(fù)用推挽輸出模式MISOGPIOBGPIO_Pin_14MOSIGPIOBGPIO_Pin_15CEGPIOCGPIO_Pin_6通用推挽輸出模式CSGPIOBGPIO_Pin_0IRQGPIOAGPIO_Pin_0上拉輸入模式NRF24L01模塊通信接口SPI2管腳模式配置 雙線全雙工 主模式數(shù)據(jù)大小8位上升沿采樣高位在前3.4.3詳細(xì)設(shè)計(jì)數(shù)據(jù)存儲空間分配,包括每種數(shù)據(jù)的名稱、作用域、數(shù)據(jù)類型、占用物理空間大小、涉及的任務(wù)或ISR數(shù)據(jù)名稱描述作用域數(shù)據(jù)類型大小涉及的任務(wù)或ISRRx_Succ接收成功標(biāo)志全局unsignedchar1BAppTaskUserIF任務(wù)和EXTI0_IRQn中斷TX_ADDRESS0-5通道地址0-5全局unsignedchar5BEXTI0_IRQn中斷rx_buf接收緩存區(qū)全局unsignedchar32BAppTaskUserIF任務(wù)tx_buf發(fā)射緩存區(qū)全局unsignedchar32BAppTaskUserIF任務(wù)status_buf狀態(tài)緩沖區(qū)全局unsignedchar32BAppTaskUserIF任務(wù)和EXTI0_IRQn中斷nrf_baud波特設(shè)置全局unsignedchar1BAppTaskUserIF任務(wù)nrf_Pipe發(fā)射通道選擇全局unsignedchar1BAppTaskUserIF任務(wù)nrf_Pipe_r接收通道選擇全局unsignedchar1BEXTI0_IRQn中斷主要任務(wù)及中斷效勞子程序的流程圖3.14:執(zhí)行main〔〕執(zhí)行main〔〕禁止CPU的中斷禁止CPU的中斷-CPU_IntDis()ucosII內(nèi)核初始化OSInit()ucosII內(nèi)核初始化OSInit()外設(shè)初始化BSP_Init()外設(shè)初始化BSP_Init()顯示器接口FSMC進(jìn)行配置tp_config()NVIC_Configuration()GPIO_Configuration()系統(tǒng)時(shí)鐘的設(shè)置RCC_Configuration〔〕顯示器接口FSMC進(jìn)行配置tp_config()NVIC_Configuration()GPIO_Configuration()系統(tǒng)時(shí)鐘的設(shè)置RCC_Configuration〔〕圖3.14建立主任務(wù),該任務(wù)是為了在內(nèi)核啟動后,建立另外2個(gè)用戶任務(wù),并清0節(jié)拍計(jì)數(shù)器,啟動ucOSII內(nèi)核。主任務(wù)的任務(wù)名為App_TaskStart,主任務(wù)有自己的堆棧,堆棧尺寸為APP_TASK_START_STK_SIZE*4〔字節(jié)〕,然后執(zhí)行ucosII內(nèi)部函數(shù)OSTimeSet(0),將節(jié)拍計(jì)數(shù)器清0,節(jié)拍計(jì)數(shù)器范圍是0-4294967295,對于節(jié)拍頻率100hz時(shí),每隔497天就重新計(jì)數(shù),調(diào)用內(nèi)部函數(shù)OSStart(),啟動ucosII內(nèi)核,此時(shí)ucosII內(nèi)核開始運(yùn)行。對任務(wù)表進(jìn)行監(jiān)視,主任務(wù)因?yàn)橐呀?jīng)處于就緒狀態(tài),于是開始執(zhí)行主任務(wù)App_TaskStart(),uCOSII的任務(wù)結(jié)構(gòu)規(guī)定必須為無返回的結(jié)構(gòu),也就是無限循環(huán)模式如3.15所示SPI2_NRF24L01_Init(void)SPI2_NRF24L01_Init(void):使能SPI2外設(shè)時(shí)鐘使能SPI2外設(shè)時(shí)鐘配置SPI2引腳配置SPI2引腳配置SPI2NRF24L01+片選SPI2配置SPI2NRF24L01+片選SPI2配置NRF24L01+模式選擇配置NRF24L01+模式選擇配置NRF24L01+中斷信號產(chǎn)生連接到PA0配置NRF24L01+中斷信號產(chǎn)生連接到PA0禁止SPI2NRF24L01+的片選。禁止SPI2NRF24L01+的片選。SPI2配置SPI2配置使能SPI2使能SPI2圖3.15通過SPI2發(fā)送一個(gè)字節(jié)的數(shù)據(jù):開始開始發(fā)送緩沖區(qū)是否是空發(fā)送緩沖區(qū)是否是空是是否否通過SPI2外設(shè)發(fā)出數(shù)據(jù)通過SPI2外設(shè)發(fā)出數(shù)據(jù)是接收緩沖區(qū)是否是空是接收緩沖區(qū)是否是空否否返回讀出的數(shù)據(jù)返回讀出的數(shù)據(jù)圖3.16voidEXTI0_IRQHandler(void)為NRF24L01發(fā)送及接收中斷響應(yīng)程序:開始開始保存全局中斷標(biāo)志,關(guān)總中斷保存全局中斷標(biāo)志,關(guān)總中斷恢復(fù)全局中斷標(biāo)志恢復(fù)全局中斷標(biāo)志判斷是否產(chǎn)生了EXTI0中斷判斷是否產(chǎn)生了EXTI0中斷否是否是判斷是否是PA0線變低 判斷是否是PA0線變低 否是否是否發(fā)射到達(dá)最大復(fù)發(fā)次數(shù) 否發(fā)射到達(dá)最大復(fù)發(fā)次數(shù) 判斷是否接收到數(shù)據(jù) 是是是是去除發(fā)送緩沖區(qū)否讀取狀態(tài)存放其來判斷數(shù)據(jù)接收狀況 去除發(fā)送緩沖區(qū)否讀取狀態(tài)存放其來判斷數(shù)據(jù)接收狀況 進(jìn)入接收模式 去除07存放器標(biāo)志進(jìn)入接收模式 去除07存放器標(biāo)志去除EXTI0上的中斷標(biāo)志 去除EXTI0上的中斷標(biāo)志 執(zhí)行一次任務(wù)切換執(zhí)行一次任務(wù)切換結(jié)束結(jié)束圖3.17〔3〕液晶顯示器界面含有發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、鍵盤,通過點(diǎn)擊按鍵顯示所輸入內(nèi)容,點(diǎn)擊發(fā)送后,顯示器接收數(shù)據(jù)內(nèi)顯示所發(fā)送內(nèi)容,另外一塊液晶顯示器接收數(shù)據(jù)后,顯示所發(fā)送內(nèi)容,實(shí)現(xiàn)無線通信功能。其中所涉及的函數(shù)有GUI_WIDGET_CREATE_INFO〔定義了對話框資源列表〕、GUI_WIDGET_CREATE_INFO〔定義了對話框資源列表〕、_cbCallback(WM_MESSAGE*pMsg)〔ucgui回調(diào)函數(shù),是作為對話框動作響應(yīng)的函數(shù)〕、Fun(void)〔顯示及處理界面〕。3.4.4系統(tǒng)實(shí)現(xiàn)及調(diào)試〔1〕主程序intmain(void){//CPU_INT08Uos_err;/*禁止所有中斷*/CPU_IntDis();/*ucosII初始化*/OSInit();/*硬件平臺初始化*/BSP_Init();//建立主任務(wù),優(yōu)先級最高建立這個(gè)任務(wù)另外一個(gè)用途是為了以后使用統(tǒng)計(jì)任務(wù)//os_err=OSTaskCreate((void(*)(void*))App_TaskStart, //指向任務(wù)代碼的指針(void*)0, //任務(wù)開始執(zhí)行時(shí),傳遞給任務(wù)的參數(shù)的指針 (OS_STK*)&App_TaskStartStk[APP_TASK_START_STK_SIZE-1], //分配給任務(wù)的堆棧的棧頂指針從頂向下遞減(INT8U)APP_TASK_START_PRIO); //分配給任務(wù)的優(yōu)先級OSTimeSet(0); //ucosII的節(jié)拍計(jì)數(shù)器清0節(jié)拍計(jì)數(shù)器是0-4294967295OSStart();//啟動ucosII內(nèi)核return(0);}任務(wù)設(shè)計(jì)/*****************************************************************************名稱:staticvoidApp_TaskStart(void*p_arg)*功能:開始任務(wù)建立*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/staticvoidApp_TaskStart(void*p_arg){(void)p_arg;//初始化ucosII時(shí)鐘節(jié)拍OS_CPU_SysTickInit();//使能ucos的統(tǒng)計(jì)任務(wù)#if(OS_TASK_STAT_EN>0)OSStatInit();//統(tǒng)計(jì)任務(wù)初始化函數(shù)#endifApp_TaskCreate(); //建立其他的任務(wù)while(1){ /*100ms間隔LED閃爍*/Led_ON(); OSTimeDlyHMSM(0,0,0,100); Led_OFF(); OSTimeDlyHMSM(0,0,0,100);}}/*****************************************************************************名稱:staticvoidApp_TaskCreate(void)*功能:建立其余任務(wù)的函數(shù)*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/staticvoidApp_TaskCreate(void){/*建立用戶界面任務(wù)*/OSTaskCreateExt(AppTaskUserIF, //指向任務(wù)代碼的指針 (void*)0, //任務(wù)開始執(zhí)行時(shí),傳遞給任務(wù)的參數(shù)的指針 (OS_STK*)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],//分配給任務(wù)的堆棧的棧頂指針從頂向下遞減 APP_TASK_USER_IF_PRIO, //分配給任務(wù)的優(yōu)先級 APP_TASK_USER_IF_PRIO, //預(yù)備給以后版本的特殊標(biāo)識符,在現(xiàn)行版本同任務(wù)優(yōu)先級 (OS_STK*)&AppTaskUserIFStk[0], //指向任務(wù)堆棧棧底的指針,用于堆棧的檢驗(yàn)APP_TASK_USER_IF_STK_SIZE, //指定堆棧的容量,用于堆棧的檢驗(yàn)(void*)0, //指向用戶附加的數(shù)據(jù)域的指針,用來擴(kuò)展任務(wù)的任務(wù)控制塊OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //選項(xiàng),指定是否允許堆棧檢驗(yàn),是否將堆棧清0,任務(wù)是否要 //進(jìn)行浮點(diǎn)運(yùn)算等等。/*建立觸摸驅(qū)動任務(wù)*/OSTaskCreateExt(AppTaskKbd, (void*)0, (OS_STK*)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1], APP_TASK_KBD_PRIO, APP_TASK_KBD_PRIO, (OS_STK*)&AppTaskKbdStk[0],APP_TASK_KBD_STK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);}/*****************************************************************************名稱:staticvoidAppTaskUserIF(void*p_arg)*功能:用戶界面任務(wù)*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/staticvoidAppTaskUserIF(void*p_arg){ (void)p_arg; GUI_Init(); //ucgui初始化while(1){ Fun(); //界面主程序}}/*****************************************************************************名稱:staticvoidAppTaskKbd(void*p_arg)*功能:觸摸屏坐標(biāo)獲取*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/staticvoidAppTaskKbd(void*p_arg){(void)p_arg;while(1){ /*延時(shí)10ms會讀取一次觸摸坐標(biāo) */OSTimeDlyHMSM(0,0,0,10); GUI_TOUCH_Exec();}}〔3〕中斷效勞子程序voidSysTickHandler(void){OS_CPU_SRcpu_sr;OS_ENTER_CRITICAL();//保存全局中斷標(biāo)志,關(guān)總中斷/*TelluC/OS-IIthatwearestartinganISR*/OSIntNesting++; //OSSemPost(NMEA_MBOX);OS_EXIT_CRITICAL(); //恢復(fù)全局中斷標(biāo)志OSTimeTick();/*CalluC/OS-II'sOSTimeTick(),在os_core.c文件里定義,主要判斷延時(shí)的任務(wù)是否計(jì)時(shí)到*/ OSIntExit();//在os_core.c文件里定義,如果有更高優(yōu)先級的任務(wù)就緒了,那么執(zhí)行一次任務(wù)切換}voidEXTI0_IRQHandler(void){unsignedcharstatus;OS_CPU_SRcpu_sr;OS_ENTER_CRITICAL();//保存全局中斷標(biāo)志,關(guān)總中斷TelluC/OS-IIthatwearestartinganISROSIntNesting++;OS_EXIT_CRITICAL(); //恢復(fù)全局中斷標(biāo)志 if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //判斷是否產(chǎn)生了EXTI0中斷{ if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){//判斷是否是PA0線變低 status=SPI_Read(READ_REG1+STATUS); //讀取狀態(tài)存放其來判斷數(shù)據(jù)接收狀況 if(status&0x40) //判斷是否接收到數(shù)據(jù) { SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//從接收緩沖區(qū)里讀出數(shù)據(jù) if((status&0x0e)<=0x0a) { nrf_Pipe_r=(status&0x0e)>>1; //讀出是在哪個(gè)通道接收的 } else { nrf_Pipe_r=0; } Rx_Succ=1; //讀取數(shù)據(jù)完成標(biāo)志 /*根據(jù)讀出的接收通道號,將相應(yīng)信息寫入狀態(tài)文本緩沖區(qū)*/ if(nrf_Pipe_r==0)memcpy(status_buf,"Pipe0ReciveOK!",20); elseif(nrf_Pipe_r==1)memcpy(status_buf,"Pipe1ReciveOK!",20); elseif(nrf_Pipe_r==2)memcpy(status_buf,"Pipe2ReciveOK!",20); elseif(nrf_Pipe_r==3)memcpy(status_buf,"Pipe3ReciveOK!",20); elseif(nrf_Pipe_r==4)memcpy(status_buf,"Pipe4ReciveOK!",20); elseif(nrf_Pipe_r==5)memcpy(status_buf,"Pipe5ReciveOK!",20); } elseif((status&0x10)>0) { //發(fā)射到達(dá)最大復(fù)發(fā)次數(shù) SPI_RW_Reg(0xe1,0); //去除發(fā)送緩沖區(qū) RX_Mode(); //進(jìn)入接收模式 Rx_Succ=1; /*根據(jù)發(fā)送通道,將相應(yīng)信息寫入狀態(tài)文本緩沖區(qū)*/ if(nrf_Pipe==0)memcpy(status_buf,"Pipe0NOACK!",20); elseif(nrf_Pipe==1)memcpy(status_buf,"Pipe1NOACK!",20); elseif(nrf_Pipe==2)memcpy(status_buf,"Pipe2NOACK!",20); elseif(nrf_Pipe==3)memcpy(status_buf,"Pipe3NOACK!",20); elseif(nrf_Pipe==4)memcpy(status_buf,"Pipe4NOACK!",20); elseif(nrf_Pipe==5)memcpy(status_buf,"Pipe5NOACK!",20); } elseif((status&0x20)>0) { //發(fā)射后收到應(yīng)答 SPI_RW_Reg(0xe1,0); //去除發(fā)送緩沖區(qū) RX_Mode(); //進(jìn)入接收模式 Rx_Succ=1; /*根據(jù)發(fā)送通道,將相應(yīng)信息寫入狀態(tài)文本緩沖區(qū)*/ if(nrf_Pipe==0)memcpy(status_buf,"Pipe0SendOK!",20); elseif(nrf_Pipe==1)memcpy(status_buf,"Pipe1SendOK!",20); elseif(nrf_Pipe==2)memcpy(status_buf,"Pipe2SendOK!",20); elseif(nrf_Pipe==3)memcpy(status_buf,"Pipe3SendOK!",20); elseif(nrf_Pipe==4)memcpy(status_buf,"Pipe4SendOK!",20); elseif(nrf_Pipe==5)memcpy(status_buf,"Pipe5SendOK!",20); } SPI_RW_Reg(WRITE_REG1+STATUS,status); //去除07存放器標(biāo)志 } EXTI_ClearITPendingBit(EXTI_Line0); //去除EXTI0上的中斷標(biāo)志}OSIntExit();//在os_core.c文件里定義,如果有更高優(yōu)先級的任務(wù)就緒了,那么執(zhí)行一次任務(wù)切換}〔4〕界面實(shí)現(xiàn)設(shè)計(jì)voidFun(void);externvoidRX_Mode(void);externvoidTX_Mode(void);externvoidNRF24L01_TXBUF(uint8_t*data_buffer,uint8_tNb_bytes);int8_tShift=0;unsignedchartext_buf[32]="";/*ucgui類型定義*/WM_HWINhWin;WM_HWINhListBox[8];WM_HWINtext1,text2,text3,bt[33],edit1,edit2; GUI_COLORDesktopColorOld;constGUI_FONT*pFont=&GUI_Font8x13_1;constGUI_FONT*pFont18=&GUI_FontComic18B_1;/*定義了對話框資源列表*/staticconstGUI_WIDGET_CREATE_INFOaDialogCreate[]={{FRAMEWIN_CreateIndirect,"NRF24L01P",0,0,0,240,400,FRAMEWIN_CF_ACTIVE},{BUTTON_CreateIndirect,"SEND",GUI_ID_BUTTON0,0,316,120,55},{BUTTON_CreateIndirect,"CLEAR",GUI_ID_BUTTON1,120,316,120,55},{EDIT_CreateIndirect,"",GUI_ID_EDIT1,0,25,230,35,EDIT_CF_LEFT,50},{EDIT_CreateIndirect,"",GUI_ID_EDIT2,0,85,230,35,EDIT_CF_LEFT,50},{TEXT_CreateIndirect,"SendTextArea",GUI_ID_TEXT0,1,2,230,25,TEXT_CF_LEFT},{TEXT_CreateIndirect,"ReceiveTextArea",GUI_ID_TEXT1,1,62,230,25,TEXT_CF_LEFT}, {BUTTON_CreateIndirect,"Q",GUI_ID_BUTTON2,0,150,24,30,0,0}, {BUTTON_CreateIndirect,"W",GUI_ID_BUTTON3,24,150,24,30,0,0},{BUTTON_CreateIndirect,"P",GUI_ID_BUTTON11,216,150,24,30,0,0},{BUTTON_CreateIndirect,"O",GUI_ID_BUTTON10,192,150,24,30,0,0},{BUTTON_CreateIndirect,"I",GUI_ID_BUTTON9,168,150,24,30,0,0},{BUTTON_CreateIndirect,"Y",GUI_ID_BUTTON7,120,150,24,30,0,0},{BUTTON_CreateIndirect,"U",GUI_ID_BUTTON8,144,150,24,30,0,0},{BUTTON_CreateIndirect,"T",GUI_ID_BUTTON6,96,150,24,30,0,0},{BUTTON_CreateIndirect,"R",GUI_ID_BUTTON5,72,150,24,30,0,0},{BUTTON_CreateIndirect,"E",GUI_ID_BUTTON4,48,150,24,30,0,0}, {BUTTON_CreateIndirect,"A",GUI_ID_BUTTON12,10,182,24,30,0,0}, {BUTTON_CreateIndirect,"S",GUI_ID_BUTTON13,34,182,24,30,0,0}, {BUTTON_CreateIndirect,"D",GUI_ID_BUTTON14,58,182,24,30,0,0},{BUTTON_CreateIndirect,"F",GUI_ID_BUTTON15,82,182,24,30,0,0},{BUTTON_CreateIndirect,"G",GUI_ID_BUTTON16,106,182,24,30,0,0}, {BUTTON_CreateIndirect,"H",GUI_ID_BUTTON17,130,182,24,30,0,0}, {BUTTON_CreateIndirect,"J",GUI_ID_BUTTON18,154,182,24,30,0,0}, {BUTTON_CreateIndirect,"K",GUI_ID_BUTTON19,178,182,24,30,0,0}, {BUTTON_CreateIndirect,"L",GUI_ID_BUTTON20,202,182,24,30,0,0}, {BUTTON_CreateIndirect,"Z",GUI_ID_BUTTON21,34,214,24,30,0,0},{BUTTON_CreateIndirect,"X",GUI_ID_BUTTON22,58,214,24,30,0,0},{BUTTON_CreateIndirect,"C",GUI_ID_BUTTON23,82,214,24,30,0,0},{BUTTON_CreateIndirect,"V",GUI_ID_BUTTON24,106,214,24,30,0,0},{BUTTON_CreateIndirect,"B",GUI_ID_BUTTON25,130,214,24,30,0,0},{BUTTON_CreateIndirect,"N",GUI_ID_BUTTON26,154,214,24,30,0,0}, {BUTTON_CreateIndirect,"M",GUI_ID_BUTTON27,178,214,24,30,0,0}, {BUTTON_CreateIndirect,"Shift",GUI_ID_BUTTON28,0,214,34,30,0,0},{BUTTON_CreateIndirect,"1",GUI_ID_BUTTON29,0,246,24,30,0,0},{BUTTON_CreateIndirect,"2",GUI_ID_BUTTON30,24,246,24,30,0,0}, {BUTTON_CreateIndirect,"3",GUI_ID_BUTTON31,48,246,24,30,0,0}, {BUTTON_CreateIndirect,"4",GUI_ID_BUTTON32,72,246,24,30,0,0},{BUTTON_CreateIndirect,"5",GUI_ID_BUTTON33,96,246,24,30,0,0},{BUTTON_CreateIndirect,"6",GUI_ID_BUTTON34,120,246,24,30,0,0}, {BUTTON_CreateIndirect,"7",GUI_ID_BUTTON35,144,246,24,30,0,0}, {BUTTON_CreateIndirect,"8",GUI_ID_BUTTON36,168,246,24,30,0,0},{BUTTON_CreateIndirect,"9",GUI_ID_BUTTON37,192,246,24,30,0,0},{TEXT_CreateIndirect,"status",GUI_ID_TEXT2,1,120,240,25,TEXT_CF_HCENTER},};/*****************************************************************************名稱:staticvoid_cbCallback(WM_MESSAGE*pMsg)*功能:ucgui回調(diào)函數(shù),是作為對話框動作響應(yīng)的函數(shù)*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:****************************************************************************/staticvoid_cbCallback(WM_MESSAGE*pMsg){unsignedchartext_buf[1]="";intNCode,Id;switch(pMsg->MsgId){caseWM_NOTIFY_PARENT: //通知父窗口有事件在窗口部件上發(fā)生Id=WM_GetId(pMsg->hWinSrc); //獲得對話框窗口里發(fā)生事件的部件的IDNCode=pMsg->Data.v; //通知代碼switch(NCode) {caseWM_NOTIFICATION_RELEASED: //窗體部件動作被釋放if(Id==GUI_ID_BUTTON1) { //按鍵CLEAR被松開memcpy(status_buf,"",20); //清空狀態(tài)文本緩沖區(qū) memcpy(rx_buf,"",32); //清空接收文本緩沖區(qū) TEXT_SetText(text3,(constchar*)status_buf); //清空狀態(tài)文本框 EDIT_SetText(edit2,(constchar*)rx_buf); //清空接收字符編輯框 memcpy(tx_buf,"",32); //清空發(fā)送文本緩沖區(qū) NRF24L01_TXBUF(tx_buf,32); //將發(fā)送字符緩沖區(qū)的字符通過NRF24L01發(fā)送出去 EDIT_SetText(edit1,(constchar*)tx_buf); //清空接收字符編輯框} elseif(Id==GUI_ID_BUTTON0) {//按鍵SEND被松開// memcpy(tx_buf,"1234567890abcdefghij!@#$%^&*()-=",32); //將32字節(jié)的文本拷貝到發(fā)送文本緩沖區(qū)//memcpy(tx_buf,"",32); //清空發(fā)送文本緩沖區(qū) memcpy(rx_buf,"",32); //清空接收文本緩沖區(qū) memcpy(status_buf,"",20); //清空狀態(tài)文本緩沖區(qū) EDIT_SetText(edit2,(constchar*)rx_buf); //清空接收字符編輯框 NRF24L01_TXBUF(tx_buf,32); //將發(fā)送字符緩沖區(qū)的字符通過NRF24L01發(fā)送出去 memcpy(tx_buf,"",32); //清空發(fā)送文本緩沖區(qū) EDIT_SetText(edit1,(constchar*)tx_buf); //清空接收字符編輯框 TEXT_SetText(text3,(constchar*)status_buf); //清空狀態(tài)文本框 }elseif(Id==GUI_ID_BUTTON28){if(Shift==0)Shift=1;elseShift=0;} elseif(Id==GUI_ID_BUTTON2) { if(Shift==0)memcpy(text_buf,"q",1); elsememcpy(text_buf,"Q",1); strcat((char*)tx_buf,(constchar*)text_buf); EDIT_SetText(edit1,(constchar*)tx_buf); } 。。。。。。 } elseif(Id==GUI_ID_BUTTON29) { memcpy(text_buf,"1",1); strcat((char*)tx_buf,(constchar*)text_buf); EDIT_SetText(edit1,(constchar*)tx_buf); } 。。。。。。 break; default:break;} default:WM_DefaultProc(pMsg); //默認(rèn)程序來處理消息 break;}}/*****************************************************************************名稱:voidFun(void)*功能:顯示及處理界面*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:無****************************************************************************/voidFun(void){GUI_CURSOR_Show();//翻開鼠標(biāo)圖形顯示/*建立對話框時(shí),包含了資源列表,資源數(shù)目,并且指定了用于動作響應(yīng)的回調(diào)函數(shù)*/hWin=GUI_CreateDialogBox(aDialogCreate,GUI_COUNTOF(aDialogCreate),_cbCallback,0,0,0);FRAMEWIN_SetFont(hWin,&GUI_FontComic18B_1); //對話框字體設(shè)置FRAMEWIN_SetClientColor(hWin,GUI_WHITE); //對話框的窗體顏色是黑色//memcpy(tx_buf,"1234567890abcdefghij!@#$%^&*()-=",32);//將長度為32字節(jié)的發(fā)送字符串拷貝到發(fā)送緩沖區(qū)memcpy(tx_buf,"",32);memcpy(rx_buf,"",32); //將接收緩存區(qū)清空text1=WM_GetDialogItem(hWin,GUI_ID_TEXT0); //獲得對話框里GUI_ID_TEXT0工程(文本框SendTextArea)的句柄text2=WM_GetDialogItem(hWin,GUI_ID_TEXT1); //獲得對話框里GUI_ID_TEXT1工程(文本框ReceiveTextArea)的句柄text3=WM_GetDialogItem(hWin,GUI_ID_TEXT2); //獲得對話框里GUI_ID_TEXT2工程(狀態(tài)字符文本框)的句柄TEXT_SetFont(text1,pFont); //設(shè)置對話框里文本框SendTextArea的字體TEXT_SetFont(text2,pFont); //設(shè)置對話框里文本框ReceiveTextArea的字體TEXT_SetFont(text3,pFont); //設(shè)置對話框里狀態(tài)字符文本框的字體TEXT_SetTextColor(text1,GUI_GREEN); //設(shè)置對話框里文本框SendTextArea的字體顏色TEXT_SetTextColor(text2,GUI_GREEN); //設(shè)置對話框里文本框ReceiveTextArea的字體顏色TEXT_SetTextColor(text3,GUI_RED); //設(shè)置對話框里狀態(tài)字符文本框的字體顏色edit1=WM_GetDialogItem(hWin,GUI_ID_EDIT1); //獲得對話框里GUI_ID_EDIT1工程(編輯框發(fā)送字符串顯示區(qū))的句柄EDIT_SetFont(edit1,pFont18); //設(shè)置對話框里編輯框發(fā)送字符串顯示區(qū)的字體EDIT_SetText(edit1,(constchar*)tx_buf); //設(shè)置對話框里編輯框發(fā)送字符串顯示區(qū)的字符串edit2=WM_GetDialogItem(hWin,GUI_ID_EDIT2); //獲得對話框里GUI_ID_EDIT2工程(編輯框接收字符串顯示區(qū))的句柄EDIT_SetFont(edit2,pFont18); //設(shè)置對話框里編輯框接收字符串顯示區(qū)的字體EDIT_SetText(edit2,(constchar*)rx_buf); //設(shè)置對話框里編輯框接收字符串顯示區(qū)的字符串bt[0]=WM_GetDialogItem(hWin,GUI_ID_BUTTON0); //獲得對話框里GUI_ID_BUTTON0工程(按鍵SEND)的句柄bt[1]=WM_GetDialogItem(hWin,GUI_ID_BUTTON1); //獲得對話框里GUI_ID_BUTTON0工程(按鍵CLEAR)的句柄BUTTON_SetFont(bt[0],pFont); //設(shè)置對話框里按鍵SEND的字體BUTTON_SetFont(bt[1],pFont); //設(shè)置對話框里按鍵CLEAR的字體BUTTON_SetTextColor(bt[0],0,GUI_WHITE); //設(shè)置對話框里按鍵SEND未被按下的字體顏色BUTTON_SetTextColor(bt[1],0,GUI_WHITE); //設(shè)置對話框里按鍵CLEAR未被按下的字體顏色nrf_Pipe=0; //NRF24L01初始發(fā)射通道設(shè)置為0 nrf_baud=0; //NRF24L01速率初始為2MPSRX_Mode(); //NRF24L01進(jìn)入接收模式while(1){ if(Rx_Succ==1){ //當(dāng)NRF24L01接收到有效數(shù)據(jù) EDIT_SetText(edit2,(constchar*)rx_buf); //將接收緩沖區(qū)的字符寫入到接收字符編輯框內(nèi) TEXT_SetText(text3,(constchar*)status_buf); //將狀態(tài)文本緩沖區(qū)的字符寫入到狀態(tài)文本框內(nèi) Rx_Succ=0; } WM_Exec(); //刷新屏幕} }〔5〕NRF24L01驅(qū)動設(shè)計(jì)/******************************************************************************文件名:NRF24L01.c*內(nèi)容簡述:*2.4G通信模塊NRF24L01+的驅(qū)動局部**文件歷史:*版本號日期作者說明*v0.12023-10-25wcc創(chuàng)立該文件*****************************************************************************/#defineNRF_GLOBALS#include"NRF24L01.h"#include"stm32f10x_gpio.h"#include"stm32f10x_spi.h"#include"globals.h"voidMODE_CE(BYTEa);voidSPI2_NRF24L01_Init(void);BYTESPI2_NRF_SendByte(BYTEbyte);BYTESPI_RW_Reg(BYTEdata1,BYTEdata2);BYTESPI_Write_Buf(BYTEreg,BYTE*pBuf,BYTEbytes);BYTESPI_Read(BYTEreg);BYTESPI_Read_Buf(BYTEreg,BYTE*pBuf,BYTEbytes);voidRX_Mode(void);voidTX_Mode(void);voidNRF24L01_TXBUF(uint8_t*data_buffer,uint8_tNb_bytes);/*****************************************************************************名稱:voidMODE_CE(BYTEa)*功能:NRF24L01收/發(fā)模式有效選擇*入口參數(shù):a:1:NRF24L01收/發(fā)有效0:關(guān)*出口參數(shù):無*說明:*調(diào)用方法:MODE_CE(1);****************************************************************************/voidMODE_CE(BYTEa){ //NRF24L01MODE-CE if(a==1)GPIO_SetBits(GPIOC,GPIO_Pin_6); //On elseGPIO_ResetBits(GPIOC,GPIO_Pin_6); //Off}/*****************************************************************************名稱:voidSPI2_NRF24L01_Init(void)*功能:NRF24L01SPI2接口初始化*入口參數(shù):無*出口參數(shù):無*說明:*調(diào)用方法:SPI2_NRF24L01_Init();****************************************************************************/voidSPI2_NRF24L01_Init(void){SPI_InitTypeDefSPI_InitStructure;GPIO_InitTypeDefGPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //使能SPI2外設(shè)時(shí)鐘/*配置SPI2引腳:SCK,MISOandMOSI〔PB13,PB14,PB15)*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用功能〔推挽〕輸出SPI2GPIO_Init(GPIOB,&GPIO_InitStructure);/*配置SPI2NRF24L01+片選PB0*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //輸出模式最大速度50MHzGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽輸出模式GPIO_Init(GPIOB,&GPIO_InitStructure);/*配置NRF24L01+模式選擇PC6*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//NR

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論