




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
課程設計說明書題目:基于STM32的無線通信系統設計課程:ARM課程設計院〔部〕:計算機科學與技術學院專業:計算機科學與技術專業班級:學生姓名:學號:指導教師:完成日期:目錄18943課程設計說明書I15334課程設計任務書1269441.課程設計題目2214942.課程設計目的219723.課程設計內容2277213.1硬件資源2278533.2軟件資源759973.3調試環境準備與使用10118293.4系統設計步驟1052043.4.1需求分析10223423.4.2概要設計1142093.4.3詳細設計15310063.4.4系統實現及調試19296923.4.5功能測試39205743.4.6系統評價〔結果分析〕40207933.5.結論〔體會〕41219723.6.參考文獻415865課程設計指導教師評語42山東建筑大學計算機科學與技術學院課程設計任務書設計題目基于STM32的無線通信系統設計指導教師班級學號技術參數和設計要求技術參數:基于Cortex-M3內核的奮斗STM32開發板,無線射頻收發器nRF24L01P工作于2.4GHz頻段,STM32和nRF24L01P之間采用SPI接口方式,嵌入式操作系統平臺采用uC/OS-II。設計要求:用STM32開發板和nRF24L01擴展板設計一個基于uC/OS-II的無線通信系統,能夠實現兩個無線節點間的數據收發。設計內容與步驟設計內容:編寫STM32和nRF24L01P的初始化程序。將uC/OS-II移植至STM32。設計簡單的無線通信協議,編寫無線通信任務和射頻收發中斷效勞子程序。設計步驟:uC/OS-II任務劃分及概要設計,ISR的功能設計。編寫STM32和nRF24L01P的初始化程序,調試STM32的片內定時器模塊,編寫基于nRF24L01P模塊的數據收發ISR。編寫與移植相關的幾個函數,將uC/OS-II移植至STM32。擬定通信協議,編寫無線通信任務。利用兩套STM32開發板和nRF24L01擴展板調試上述功能,總結分析,撰寫課程設計說明書。設計工作方案與進度安排奮斗STM32開發版資源及應用:10學時《CortexM3權威指南》、《STM32F10X參考手冊》、《STM32固件庫手冊》:20學時MDK安裝及使用:5學時概要設計:15學時uC/OS-II移植及所用外設的驅動程序編寫:10學時無線通信任務編程及調試:15學時撰寫課程設計說明書:15學時設計考核要求考勤20%課程設計說明書50%。成果演示30%課程設計題目基于STM32的無線通信系統設計課程設計目的《ARM課程設計》是計算機科學與技術專業的專業限定選修實踐課程,是學習《嵌入式系統設計》課程后必要的實踐教學環節。通過本課程設計使學生加深理解、穩固課堂教學和平時實驗內容,使學生初步具備嵌入式應用系統分析、系統設計、系統實現與測試的實際能力,強化學生的實踐意識、提高動手能力,發揮學生的想象力和創新能力,從而實現課程教學目標。提高綜合運用所學知識進行系統分析、設計的能力。加深對嵌入式軟件開發流程以及工程開發步逐的認識,進一步熟悉UC/OS-II的一直與使用,進一步熟悉UCGUI的使用,提高嵌入式軟件開發所必須的技能。本課程設計主要培養學生在嵌入式系統設計方面的能力。通過本課程的學習和實踐,學生應能在嵌入式系統組成形式、構造方法、設計流程以及基于集成開發環境調試嵌入式系統的方法等方面得到鍛煉,在硬件系統設計〔整合〕、操作系統移植、應用程序編寫等方面得到全面訓練。3.課程設計內容3.1硬件資源基于奮斗STM32開發板,完成<基于STM32的無線通信系統設計>的設計及調試。系統涉及的硬件資源主要有:電源模塊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)電源基準。RT9166-2.5〔N2〕和RT9166-2.8〔N3〕輸入+5V,提供2.5V及2.8V的固定電壓輸出,為MP3電路VS1003提供所需的電壓。為RTC的備份電源采用V13.3V鋰離子片狀電池,如圖3.1。圖3.1復位時鐘模塊外部晶體/陶瓷諧振器(HSE)〔P12、P13〕:B1:8MHz晶體諧振器,C8,C9諧振電容選擇10P。系統的時鐘經過PLL模塊將時鐘提高到72MHz。低速外部時鐘源(LSE)〔P8、P9〕:B2:32.768KHz晶體諧振器。C10,C11諧振電容選擇10P。注意:根據ST公司的推薦,B2要采用電容負載為6P的晶振,否那么有可能會出現停振的現象,時鐘模塊如圖3.2所示。圖3.2主控芯片采用STM32F103VET6作為開發板的MCU平臺。這個MCU是STM32F103里的高容量芯片,具有512K字節的內部FLASH,64K字節的SRAM,外設資源有全速USBDevice,SDIO,SPI,I2C,I2S,FSMC,定時器,USART,ADC,DAC,CAN等接口,如圖3.3所示。圖3.3LCD液晶顯示模塊LCD顯示模塊采用STM32的FSMC接口模式。顯示速度更快。3寸屏,分辨率240X400,64K色,數據接口16位,背光源是4LED并聯模式,背光驅動采用白光驅動器提供背光用的橫流源,使背光更加均勻,背光明暗控制采用TTL電平或者PWM模式控制。屏上帶電阻式觸摸屏,模塊板上帶SPI控制方式的觸摸屏控制電路,如圖3.4所示。圖3.4串行接口擁有1路RS-232接口,CPU的PA9-US1-TX〔P68〕、PA10-US1-RX〔P69〕通過MAX3232實現1路RS-232接口,分別連接在XS5和XS17接口上。USART1在系統存儲區啟動模式下,可以通過該口通過PC對板上的CPU進行ISP,該口也可作為普通串口功能使用,XS6接口作為TTL異步通信接口USART2的接口,在一些應用的調試上有作用,比方通過XS6連接GPSOEM板,可以接收GPS的協議數據。串行接口如圖3.5所示。USART1地址:0x40013800-0x40013BFFUSART2地址:0x40004400-0x400047FF圖3.5NRF24L01模塊簡介本實驗采用的無線模塊芯片型號為NRF24L01+,是工作在2.4~2.5GHz頻段的,具備自動重發功能,6個數據傳輸通道,最大無線傳輸速率為2Mbits。MCU可與該芯片通過SPI接口訪問芯片的存放器進行配置,模塊規格如圖3.6所示。圖3.6SPI寫操作圖3.7SPI讀操作圖3.83.2軟件資源操作系統操作系統介紹本設計所使用的UC/OS-II操作系統版本號為2.85,是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實時多任務操作系統內核。它被廣泛應用于微處理器、微控制器和數字信號處理器μC/OS-II是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實時多任務操作系統內核。它被廣泛應用于微處理器、微控制器和數字信號處理器;最小編譯內核可到達2KB,結構精簡,硬件要求低。目錄結構UC-OS-II/Port在此目錄下包含三個文件,OS_CPU_C.C,OS_DBG.C,OS_CPU_A.ASM;在OS_CPU_C.C中,定義了系統初始化,系統滴答,系統堆棧初始化等鉤子函數函數,其中,除了系統堆棧初始化是“可重入的〞,其他函數都是不可沖入函數,在執行期間必須關閉中斷,否那么系統將會出現不可預料的錯誤。在OS_DBG.C中,聲明了調試相關的數據結構,以及全局的數據結構配置聲明數據信息,以及系統調試初始化函數;在OS_CPU_A.ASM中,使用arm匯編程序完成了全局中斷的保存于回復,最高就緒態的執行,系統上下文切換,系統異常掛起以及進入異常的堆棧操作等函數;UC-OS-II/CPU在此目錄下僅有CPU_A.asm這一個文件,通篇使用arm匯編完成;主要操作有中斷的使能與去除;臨界區操作〔進出臨界區〕;UC-OS-II/Source在此目錄下是操作系統的平臺無關性源碼,保存了系統核心代碼、郵箱,內存管理,信號量,消息隊列,臨界資源控制,時間控制等操作系統的各種高級應用API接口函數,是操作系統的主要功能實現局部;修改內容在通過以上的了解之后,UC-OS-II系統的源碼結構十分清晰,在此只需要修改UC-OS-II/Port,UC-OS-II/CPU這兩個文件中的少量代碼即可〔細節將在詳細設計中介紹〕。固件庫stm32f10x_stdperiph_lib,系統庫的結構如圖3.9所示:圖3.9CMSCS文件夾內包含的內容與cpu內核和cpu啟動相關的文件,stm32F10x_stdperiph_driver文件內包含了stm32f10x系列所有外設的驅動庫;stm32f10x_stdperiph_example內包含了多個關于本系列芯片的一些例程;stm32f10x_stdperiph_templete內包含了多種開發平臺的模板;最下面的chm文件為關于固件庫的使用說明;MSICS文件,如圖3.10所示:圖3.10core_m3.c為內核相關源碼;start_up_stm32f10x.hd.s為stm32f10x高容量系列的啟動文件;system_stm32f10x.c為系統時鐘和cpu設置相關配置的源碼;stm32F10x_stdperiph_driver這個文件夾內容如圖3.11,包含兩個局部,為庫的外設驅動源碼文件夾,inc中保存頭文件,src保存相關外設的源文件。圖3.11圖3.12所示的是外設驅動庫的頭文件的內容:圖3.12圖3.13所示的是外設驅動庫的C文件內容:圖3.13在本設計中僅使用FSMC,GPIO,RCC,MSIC,EXTI,SPI六個局部;因此只需添加這三個原文件即可;其中FSMC用來做液晶顯示驅動;RCC為操作系統提供systick;MSIC提供了中斷相關的函數;GPIO用來做USB的開關控制;EXTI使用外部中斷;SPI提供SPI總線操作,為NRF24C01和觸摸屏提供支持;因此以上局部必須添加;頭文件在工程設置中C/C++現象卡中的includePATH里面選擇;UCGUIuC/GUI是Micrium公司研發的通用的嵌入式用戶圖像界面軟件。他給任何使用圖像LCD的應用程序提供單獨于處理器和LCD控制器之外的有效的圖形用戶接口。能夠應用于單一任務環境,也能夠應用于多任務環境中。uC/GUI能夠應用于任何LCD控制器和CPU的任何尺寸的物理顯示或模擬顯示中。在此,使用的UCGUI已經封裝成庫文件,所有的調用接口可以在GUI.h等頭文件里面看到。用戶應用程序只需描述關于窗口的數據結構,GUI顯示初始化函數,回調函數,以及用戶界面任務函數四個局部;進行顯示任務設計時可以借助UCGUIBulider,通過圖形界面設計產生比擬準確的界面布局數據,在本設計中,由于涉及到較多的按鍵,因此UCGUIBulider只能編輯到BUTTON9,需要注意的是GUI.H里面定義了用戶自定義ID,可以借助這個ID在根底上增加數字實現大范圍ID定義。3.3調試環境準備與使用MDK編譯調試環境安裝MDK安裝:首先安裝MDK,是常規安裝,next,agree。。。。最后選擇不安裝ULINK等;安裝完畢后,以管理員身份運行keil,在file-》lisenceManagement拷給CID,然后翻開破解軟件,拷貝CID,generation拷貝lisence碼至keil的lisenceManagement內的license欄,add添加lisence看到2023年的使用期限那么破解成功;JLINK驅動安裝JLINK安裝與常規軟件安裝無異,最后可以不建立桌面快捷方式和菜單啟動選項;MDK建立工程MDK工程屬性設置使用MDK調試工程使用MDK下載運行3.4系統設計步驟3.4.1需求分析本設計需要實現功能:編寫STM32和nRF24L01P的初始化程序。將uC/OS-II移植至STM32。設計簡單的無線通信協議,編寫無線通信任務和射頻收發中斷效勞子程序。性能價格要求:在開發板固有硬件資源上盡量不增加硬件資源;選擇免費開源嵌入式操作系統;使用操作系統,提高任務調度,資源管理,系統穩定性;使用中斷提高響應速度。熱設計要求:開發板功耗相對較低,發熱元器件分布為分散,不需要其他措施來提高散熱能力;信息平安要求:本設計為實驗產品,暫不考慮在PC機與開發板通信過程中增加加密模塊;如果是在工程工程中,有必要開率增加通信加密模塊〔AES或者LBLock都可考慮〕。3.4.2概要設計(1)軟件結構圖圖形輸入輸出界面和無線收發任務圖形輸入輸出界面和無線收發任務uCGUI庫文件uCOSII實時操作系統uCGUI庫文件uCOSII實時操作系統ST庫NRF驅動LCD驅動ST庫NRF驅動LCD驅動圖3.14(2)程序流程圖開始開始底層驅動初始化系統時鐘、中斷向量、LED指示燈、串口、uCOS操作系統、uCGUI、觸摸屏初始化檢測無線模塊連接情況繪制搜索無線模塊界面NRF模塊是否連接初始化NRF無線模塊配置NRF為接收模式繪制輸入輸出界面是否是否有輸入接收數據,并將數據顯示在液晶屏上是否否是是否有發送請求NRF切換成發送模式發送數據NRF切換成發送模式發送數據發送完成后是否接到響應是否到達最大發送次數NRF切換至接收模式是是否否A.任務描述編號任務名稱英文簡稱優先級堆棧容量〔BYTE〕任務描述1開始任務App_TaskStart2128創立其他子任務2用戶界面AppTaskUserIF5256創立輸入輸出窗體3觸摸輸入AppTaskKbd4512檢測觸摸屏輸入4空閑Idle1016空閑任務ISR描述編號ISR名稱英文簡稱優先級ISR描述1復位RST_ISR1上電復位,看門狗復位,按鍵復位2系統時鐘SysTickHandler2系統時鐘中斷3外部中斷0EXTI0_IRQHandler組優先級0,次優先級1〔NRF24L01中斷〕〔3〕接口設計用戶接口HMI硬件:TFT3.2寸液晶屏 控制器ILI9341TFT觸摸控制器TSC2046 軟件:uCGUI窗體文本編輯框控件,顯示要發送的內容TXT文本顯示控件,顯示接收到的內容按鍵控件,sendclear發送和清空按鍵,大小寫轉換按鍵和數字和字母組合按鍵。內部接口UART接口:用于串口調試。Uart1管腳配置管腳名稱管腳名稱輸入輸出模式Uart_TXGPIOAGPIO_Pin_9復用推完輸出模式Uart_RXGPIOAGPIO_Pin_10浮空輸入模式Uart1模式配置 波特率:115200 數據位:8 停止位:1 校驗位:無SPI接口:NRF24L01模塊通信接口SPI2管腳配置管腳名稱對應管腳管腳輸入輸出模式SCKGPIOBGPIO_Pin_13復用推挽輸出模式MISOGPIOBGPIO_Pin_14MOSIGPIOBGPIO_Pin_15CEGPIOCGPIO_Pin_6通用推挽輸出模式CSGPIOBGPIO_Pin_0IRQGPIOAGPIO_Pin_0上拉輸入模式NRF24L01模塊通信接口SPI2管腳模式配置 雙線全雙工 主模式數據大小8位上升沿采樣高位在前3.4.3詳細設計數據存儲空間分配,包括每種數據的名稱、作用域、數據類型、占用物理空間大小、涉及的任務或ISR數據名稱描述作用域數據類型大小涉及的任務或ISRRx_Succ接收成功標志全局unsignedchar1BAppTaskUserIF任務和EXTI0_IRQn中斷TX_ADDRESS0-5通道地址0-5全局unsignedchar5BEXTI0_IRQn中斷rx_buf接收緩存區全局unsignedchar32BAppTaskUserIF任務tx_buf發射緩存區全局unsignedchar32BAppTaskUserIF任務status_buf狀態緩沖區全局unsignedchar32BAppTaskUserIF任務和EXTI0_IRQn中斷nrf_baud波特設置全局unsignedchar1BAppTaskUserIF任務nrf_Pipe發射通道選擇全局unsignedchar1BAppTaskUserIF任務nrf_Pipe_r接收通道選擇全局unsignedchar1BEXTI0_IRQn中斷主要任務及中斷效勞子程序的流程圖3.14:執行main〔〕執行main〔〕禁止CPU的中斷禁止CPU的中斷-CPU_IntDis()ucosII內核初始化OSInit()ucosII內核初始化OSInit()外設初始化BSP_Init()外設初始化BSP_Init()顯示器接口FSMC進行配置tp_config()NVIC_Configuration()GPIO_Configuration()系統時鐘的設置RCC_Configuration〔〕顯示器接口FSMC進行配置tp_config()NVIC_Configuration()GPIO_Configuration()系統時鐘的設置RCC_Configuration〔〕圖3.14建立主任務,該任務是為了在內核啟動后,建立另外2個用戶任務,并清0節拍計數器,啟動ucOSII內核。主任務的任務名為App_TaskStart,主任務有自己的堆棧,堆棧尺寸為APP_TASK_START_STK_SIZE*4〔字節〕,然后執行ucosII內部函數OSTimeSet(0),將節拍計數器清0,節拍計數器范圍是0-4294967295,對于節拍頻率100hz時,每隔497天就重新計數,調用內部函數OSStart(),啟動ucosII內核,此時ucosII內核開始運行。對任務表進行監視,主任務因為已經處于就緒狀態,于是開始執行主任務App_TaskStart(),uCOSII的任務結構規定必須為無返回的結構,也就是無限循環模式如3.15所示SPI2_NRF24L01_Init(void)SPI2_NRF24L01_Init(void):使能SPI2外設時鐘使能SPI2外設時鐘配置SPI2引腳配置SPI2引腳配置SPI2NRF24L01+片選SPI2配置SPI2NRF24L01+片選SPI2配置NRF24L01+模式選擇配置NRF24L01+模式選擇配置NRF24L01+中斷信號產生連接到PA0配置NRF24L01+中斷信號產生連接到PA0禁止SPI2NRF24L01+的片選。禁止SPI2NRF24L01+的片選。SPI2配置SPI2配置使能SPI2使能SPI2圖3.15通過SPI2發送一個字節的數據:開始開始發送緩沖區是否是空發送緩沖區是否是空是是否否通過SPI2外設發出數據通過SPI2外設發出數據是接收緩沖區是否是空是接收緩沖區是否是空否否返回讀出的數據返回讀出的數據圖3.16voidEXTI0_IRQHandler(void)為NRF24L01發送及接收中斷響應程序:開始開始保存全局中斷標志,關總中斷保存全局中斷標志,關總中斷恢復全局中斷標志恢復全局中斷標志判斷是否產生了EXTI0中斷判斷是否產生了EXTI0中斷否是否是判斷是否是PA0線變低 判斷是否是PA0線變低 否是否是否發射到達最大復發次數 否發射到達最大復發次數 判斷是否接收到數據 是是是是去除發送緩沖區否讀取狀態存放其來判斷數據接收狀況 去除發送緩沖區否讀取狀態存放其來判斷數據接收狀況 進入接收模式 去除07存放器標志進入接收模式 去除07存放器標志去除EXTI0上的中斷標志 去除EXTI0上的中斷標志 執行一次任務切換執行一次任務切換結束結束圖3.17〔3〕液晶顯示器界面含有發送數據、接收數據、鍵盤,通過點擊按鍵顯示所輸入內容,點擊發送后,顯示器接收數據內顯示所發送內容,另外一塊液晶顯示器接收數據后,顯示所發送內容,實現無線通信功能。其中所涉及的函數有GUI_WIDGET_CREATE_INFO〔定義了對話框資源列表〕、GUI_WIDGET_CREATE_INFO〔定義了對話框資源列表〕、_cbCallback(WM_MESSAGE*pMsg)〔ucgui回調函數,是作為對話框動作響應的函數〕、Fun(void)〔顯示及處理界面〕。3.4.4系統實現及調試〔1〕主程序intmain(void){//CPU_INT08Uos_err;/*禁止所有中斷*/CPU_IntDis();/*ucosII初始化*/OSInit();/*硬件平臺初始化*/BSP_Init();//建立主任務,優先級最高建立這個任務另外一個用途是為了以后使用統計任務//os_err=OSTaskCreate((void(*)(void*))App_TaskStart, //指向任務代碼的指針(void*)0, //任務開始執行時,傳遞給任務的參數的指針 (OS_STK*)&App_TaskStartStk[APP_TASK_START_STK_SIZE-1], //分配給任務的堆棧的棧頂指針從頂向下遞減(INT8U)APP_TASK_START_PRIO); //分配給任務的優先級OSTimeSet(0); //ucosII的節拍計數器清0節拍計數器是0-4294967295OSStart();//啟動ucosII內核return(0);}任務設計/*****************************************************************************名稱:staticvoidApp_TaskStart(void*p_arg)*功能:開始任務建立*入口參數:無*出口參數:無*說明:*調用方法:無****************************************************************************/staticvoidApp_TaskStart(void*p_arg){(void)p_arg;//初始化ucosII時鐘節拍OS_CPU_SysTickInit();//使能ucos的統計任務#if(OS_TASK_STAT_EN>0)OSStatInit();//統計任務初始化函數#endifApp_TaskCreate(); //建立其他的任務while(1){ /*100ms間隔LED閃爍*/Led_ON(); OSTimeDlyHMSM(0,0,0,100); Led_OFF(); OSTimeDlyHMSM(0,0,0,100);}}/*****************************************************************************名稱:staticvoidApp_TaskCreate(void)*功能:建立其余任務的函數*入口參數:無*出口參數:無*說明:*調用方法:無****************************************************************************/staticvoidApp_TaskCreate(void){/*建立用戶界面任務*/OSTaskCreateExt(AppTaskUserIF, //指向任務代碼的指針 (void*)0, //任務開始執行時,傳遞給任務的參數的指針 (OS_STK*)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],//分配給任務的堆棧的棧頂指針從頂向下遞減 APP_TASK_USER_IF_PRIO, //分配給任務的優先級 APP_TASK_USER_IF_PRIO, //預備給以后版本的特殊標識符,在現行版本同任務優先級 (OS_STK*)&AppTaskUserIFStk[0], //指向任務堆棧棧底的指針,用于堆棧的檢驗APP_TASK_USER_IF_STK_SIZE, //指定堆棧的容量,用于堆棧的檢驗(void*)0, //指向用戶附加的數據域的指針,用來擴展任務的任務控制塊OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); //選項,指定是否允許堆棧檢驗,是否將堆棧清0,任務是否要 //進行浮點運算等等。/*建立觸摸驅動任務*/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)*功能:用戶界面任務*入口參數:無*出口參數:無*說明:*調用方法:無****************************************************************************/staticvoidAppTaskUserIF(void*p_arg){ (void)p_arg; GUI_Init(); //ucgui初始化while(1){ Fun(); //界面主程序}}/*****************************************************************************名稱:staticvoidAppTaskKbd(void*p_arg)*功能:觸摸屏坐標獲取*入口參數:無*出口參數:無*說明:*調用方法:無****************************************************************************/staticvoidAppTaskKbd(void*p_arg){(void)p_arg;while(1){ /*延時10ms會讀取一次觸摸坐標 */OSTimeDlyHMSM(0,0,0,10); GUI_TOUCH_Exec();}}〔3〕中斷效勞子程序voidSysTickHandler(void){OS_CPU_SRcpu_sr;OS_ENTER_CRITICAL();//保存全局中斷標志,關總中斷/*TelluC/OS-IIthatwearestartinganISR*/OSIntNesting++; //OSSemPost(NMEA_MBOX);OS_EXIT_CRITICAL(); //恢復全局中斷標志OSTimeTick();/*CalluC/OS-II'sOSTimeTick(),在os_core.c文件里定義,主要判斷延時的任務是否計時到*/ OSIntExit();//在os_core.c文件里定義,如果有更高優先級的任務就緒了,那么執行一次任務切換}voidEXTI0_IRQHandler(void){unsignedcharstatus;OS_CPU_SRcpu_sr;OS_ENTER_CRITICAL();//保存全局中斷標志,關總中斷TelluC/OS-IIthatwearestartinganISROSIntNesting++;OS_EXIT_CRITICAL(); //恢復全局中斷標志 if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //判斷是否產生了EXTI0中斷{ if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){//判斷是否是PA0線變低 status=SPI_Read(READ_REG1+STATUS); //讀取狀態存放其來判斷數據接收狀況 if(status&0x40) //判斷是否接收到數據 { SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//從接收緩沖區里讀出數據 if((status&0x0e)<=0x0a) { nrf_Pipe_r=(status&0x0e)>>1; //讀出是在哪個通道接收的 } else { nrf_Pipe_r=0; } Rx_Succ=1; //讀取數據完成標志 /*根據讀出的接收通道號,將相應信息寫入狀態文本緩沖區*/ 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) { //發射到達最大復發次數 SPI_RW_Reg(0xe1,0); //去除發送緩沖區 RX_Mode(); //進入接收模式 Rx_Succ=1; /*根據發送通道,將相應信息寫入狀態文本緩沖區*/ 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) { //發射后收到應答 SPI_RW_Reg(0xe1,0); //去除發送緩沖區 RX_Mode(); //進入接收模式 Rx_Succ=1; /*根據發送通道,將相應信息寫入狀態文本緩沖區*/ 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存放器標志 } EXTI_ClearITPendingBit(EXTI_Line0); //去除EXTI0上的中斷標志}OSIntExit();//在os_core.c文件里定義,如果有更高優先級的任務就緒了,那么執行一次任務切換}〔4〕界面實現設計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回調函數,是作為對話框動作響應的函數*入口參數:無*出口參數:無*說明:*調用方法:****************************************************************************/staticvoid_cbCallback(WM_MESSAGE*pMsg){unsignedchartext_buf[1]="";intNCode,Id;switch(pMsg->MsgId){caseWM_NOTIFY_PARENT: //通知父窗口有事件在窗口部件上發生Id=WM_GetId(pMsg->hWinSrc); //獲得對話框窗口里發生事件的部件的IDNCode=pMsg->Data.v; //通知代碼switch(NCode) {caseWM_NOTIFICATION_RELEASED: //窗體部件動作被釋放if(Id==GUI_ID_BUTTON1) { //按鍵CLEAR被松開memcpy(status_buf,"",20); //清空狀態文本緩沖區 memcpy(rx_buf,"",32); //清空接收文本緩沖區 TEXT_SetText(text3,(constchar*)status_buf); //清空狀態文本框 EDIT_SetText(edit2,(constchar*)rx_buf); //清空接收字符編輯框 memcpy(tx_buf,"",32); //清空發送文本緩沖區 NRF24L01_TXBUF(tx_buf,32); //將發送字符緩沖區的字符通過NRF24L01發送出去 EDIT_SetText(edit1,(constchar*)tx_buf); //清空接收字符編輯框} elseif(Id==GUI_ID_BUTTON0) {//按鍵SEND被松開// memcpy(tx_buf,"1234567890abcdefghij!@#$%^&*()-=",32); //將32字節的文本拷貝到發送文本緩沖區//memcpy(tx_buf,"",32); //清空發送文本緩沖區 memcpy(rx_buf,"",32); //清空接收文本緩沖區 memcpy(status_buf,"",20); //清空狀態文本緩沖區 EDIT_SetText(edit2,(constchar*)rx_buf); //清空接收字符編輯框 NRF24L01_TXBUF(tx_buf,32); //將發送字符緩沖區的字符通過NRF24L01發送出去 memcpy(tx_buf,"",32); //清空發送文本緩沖區 EDIT_SetText(edit1,(constchar*)tx_buf); //清空接收字符編輯框 TEXT_SetText(text3,(constchar*)status_buf); //清空狀態文本框 }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); //默認程序來處理消息 break;}}/*****************************************************************************名稱:voidFun(void)*功能:顯示及處理界面*入口參數:無*出口參數:無*說明:*調用方法:無****************************************************************************/voidFun(void){GUI_CURSOR_Show();//翻開鼠標圖形顯示/*建立對話框時,包含了資源列表,資源數目,并且指定了用于動作響應的回調函數*/hWin=GUI_CreateDialogBox(aDialogCreate,GUI_COUNTOF(aDialogCreate),_cbCallback,0,0,0);FRAMEWIN_SetFont(hWin,&GUI_FontComic18B_1); //對話框字體設置FRAMEWIN_SetClientColor(hWin,GUI_WHITE); //對話框的窗體顏色是黑色//memcpy(tx_buf,"1234567890abcdefghij!@#$%^&*()-=",32);//將長度為32字節的發送字符串拷貝到發送緩沖區memcpy(tx_buf,"",32);memcpy(rx_buf,"",32); //將接收緩存區清空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工程(狀態字符文本框)的句柄TEXT_SetFont(text1,pFont); //設置對話框里文本框SendTextArea的字體TEXT_SetFont(text2,pFont); //設置對話框里文本框ReceiveTextArea的字體TEXT_SetFont(text3,pFont); //設置對話框里狀態字符文本框的字體TEXT_SetTextColor(text1,GUI_GREEN); //設置對話框里文本框SendTextArea的字體顏色TEXT_SetTextColor(text2,GUI_GREEN); //設置對話框里文本框ReceiveTextArea的字體顏色TEXT_SetTextColor(text3,GUI_RED); //設置對話框里狀態字符文本框的字體顏色edit1=WM_GetDialogItem(hWin,GUI_ID_EDIT1); //獲得對話框里GUI_ID_EDIT1工程(編輯框發送字符串顯示區)的句柄EDIT_SetFont(edit1,pFont18); //設置對話框里編輯框發送字符串顯示區的字體EDIT_SetText(edit1,(constchar*)tx_buf); //設置對話框里編輯框發送字符串顯示區的字符串edit2=WM_GetDialogItem(hWin,GUI_ID_EDIT2); //獲得對話框里GUI_ID_EDIT2工程(編輯框接收字符串顯示區)的句柄EDIT_SetFont(edit2,pFont18); //設置對話框里編輯框接收字符串顯示區的字體EDIT_SetText(edit2,(constchar*)rx_buf); //設置對話框里編輯框接收字符串顯示區的字符串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); //設置對話框里按鍵SEND的字體BUTTON_SetFont(bt[1],pFont); //設置對話框里按鍵CLEAR的字體BUTTON_SetTextColor(bt[0],0,GUI_WHITE); //設置對話框里按鍵SEND未被按下的字體顏色BUTTON_SetTextColor(bt[1],0,GUI_WHITE); //設置對話框里按鍵CLEAR未被按下的字體顏色nrf_Pipe=0; //NRF24L01初始發射通道設置為0 nrf_baud=0; //NRF24L01速率初始為2MPSRX_Mode(); //NRF24L01進入接收模式while(1){ if(Rx_Succ==1){ //當NRF24L01接收到有效數據 EDIT_SetText(edit2,(constchar*)rx_buf); //將接收緩沖區的字符寫入到接收字符編輯框內 TEXT_SetText(text3,(constchar*)status_buf); //將狀態文本緩沖區的字符寫入到狀態文本框內 Rx_Succ=0; } WM_Exec(); //刷新屏幕} }〔5〕NRF24L01驅動設計/******************************************************************************文件名:NRF24L01.c*內容簡述:*2.4G通信模塊NRF24L01+的驅動局部**文件歷史:*版本號日期作者說明*v0.12023-10-25wcc創立該文件*****************************************************************************/#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收/發模式有效選擇*入口參數:a:1:NRF24L01收/發有效0:關*出口參數:無*說明:*調用方法: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接口初始化*入口參數:無*出口參數:無*說明:*調用方法:SPI2_NRF24L01_Init();****************************************************************************/voidSPI2_NRF24L01_Init(void){SPI_InitTypeDefSPI_InitStructure;GPIO_InitTypeDefGPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //使能SPI2外設時鐘/*配置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;//復用功能〔推挽〕輸出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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年腫瘤精準醫療臨床實踐案例集:精準診療新視角
- 理解2025年西方政治制度的國民參與試題及答案
- 2024年重慶標準件工業有限責任公司招聘筆試真題
- 2024年湛江市吳川市機關事務管理局招聘筆試真題
- 數字化轉型下的公路貨運行業:2025年效率提升與運營成本控制研究
- 廣西百色數字科技信息有限公司招聘考試真題2024
- 社會公平與公共政策設計試題及答案
- 2025年氫燃料電池汽車關鍵零部件國產化產業鏈布局與投資價值研究報告
- 企業文化塑造與管理創新的相互作用
- 提升企業科學管理水平的背景意義及必要性
- 2025年中國稀土磁性材料行業市場規模調研及投資前景研究分析報告
- T/DGGC 005-2020全斷面隧道掘進機再制造檢測與評估
- 湖南省永州市冷水灘區京華中學2025年中考二模 歷史試題(含答案)
- (三模)煙臺市2025屆高三高考診斷性測試地理試卷(含答案)
- 水權與水資源管理考試試題及答案
- 公路防汛安全培訓課件
- 安徽卓越縣中聯盟2024-2025學年高三下學期5月份檢測物理試題+答案
- 2024年廣東省中考生物+地理試卷(含答案)
- 產品質量法企業培訓講座課件
- 鋼結構網架施工方案
- 路基路面工程試卷及答案二十套期末復習
評論
0/150
提交評論