ZigBee Z-Stack 3.18 串列埠1-傳送
(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)
這一節,基於《ZigBee CC2530 Z-Stack 06 建立基於Z-Stack的全新工程》一節中建立的全新工程ProjectApp進行進一步實驗,實現呼叫Z-Stack中現成的串列埠驅動函式實現串列埠傳送功能,具體效果為系統一上電CC2530晶片即通過串列埠0打印出“hello world !\r\n”。
CC2530晶片的所有片上外設中,總共有2個串列埠,分別稱為串列埠0和串列埠1。在實際專案開發當中,一般我們會將串列埠0用作“除錯串列埠”,用於列印一些提示資訊;而將串列埠1用於與外圍硬體裝置對接,實現實際的專案需求。本節中我們將通過串列埠0實現字串列印功能。
ProjectApp建立成功後,僅是通過編譯測試了工程建立是否成功,實際上並沒有做任何實質性的更改。因此我們實際現在才算是真正基於Z-Stack進行開發!為了使用Z-Stack中自帶的串列埠驅動程式,實現串列埠傳送功能,具體操作步驟如下:
1、協議棧中MT層相關的程式碼全都是基於CC2530的串列埠寫的,所以我們在寫串列埠程式時,最好的辦法就是參考MT層對應程式碼來寫我們自己的串列埠程式;具體是參考MT_UART.c中的MT_UartInit( )函式程式碼和MT_UART.h中相關的巨集定義,來實現我們的uart0.c和uart0.h兩個檔案,兩個檔案具體程式碼如下:
檔案uart0.c中程式碼:
#include "uart0.h" #include "hal_uart.h" void Uart0_Init(uint8 baudRate) { halUARTCfg_t uartConfig; uartConfig.configured = TRUE; uartConfig.baudRate = baudRate; uartConfig.flowControl = FALSE; uartConfig.flowControlThreshold = UART0_THRESHOLD; uartConfig.rx.maxBufSize = UART0_RX_BUFF_MAX; uartConfig.tx.maxBufSize = UART0_TX_BUFF_MAX; uartConfig.idleTimeout = UART0_IDLE_TIMEOUT; uartConfig.intEnable = TRUE; uartConfig.callBackFunc = NULL; HalUARTOpen (HAL_UART_PORT_0, &uartConfig); }
檔案uart0.h中程式碼:
其中:#ifndef UART0_H #define UART0_H #ifdef __cplusplus extern "C" { #endif #include "hal_types.h" #define UART0_RX_BUFF_MAX 60 #define UART0_TX_BUFF_MAX 60 #define UART0_THRESHOLD (UART0_RX_BUFF_MAX / 2) #define UART0_IDLE_TIMEOUT 6 void Uart0_Init(uint8 baudRate); #ifdef __cplusplus } #endif #endif /* UART0_H */
uartConfig.callBackFunc = NULL;
關於這句程式碼,由於本節暫不實現串列埠接收處理資料的功能,所以此處的串列埠回撥函式為NULL(空)!關於具體為何uart0.c和uart0.h兩個檔案的格式如此,是嵌入式C語言模組化程式設計的基礎,參考協議棧中類似的檔案依葫蘆畫瓢即可,此處就不再贅述~
2、往工程中APP分組下新增我們參考MT_UART.c和MT_UART.h寫成的uart0.c和uart0.h兩個檔案:將uart0.c和uart0.h兩個檔案放到C:\Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\ProjectApp\Source目錄下,然後按照下圖所示將兩個檔案新增到APP分組下即可;
3、由於協議棧中MT的相關程式碼全都是基於串列埠寫的,而我們又是參考MT_UART相關程式碼寫的,所以需要將協議棧中原本與MT層相關的程式碼全部註釋掉。具體操作如下圖所示:
右擊工程名,進入“Options”選項後,找到如下圖中所示的“Defined symbols”,其中總共有5個預編譯選項,依次為:ZTOOL_P1、MT_TASK、MT_SYS_FUNC、MT_ZDO_FUNC、LCD_SUPPORTED=DEBUG;
前4個均與MT層相關,所以均需註釋掉,在需要註釋的預編譯選項前面加上“x”即可;
第5個預編譯選項是與LCD液晶有關的,由於我們一般不使用TI原裝的LCD,所以一般也會將這個註釋掉,則工程中相關的程式碼都不會被編譯!
4、此外,協議棧中還有一個名為hal_board_cfg.h的檔案,裡面定義了與協議棧相關的大多數硬體的使能巨集定義,這邊我們暫時只關心HAL_LCD和HAL_UART,我們想遮蔽LCD相關的所有程式碼,並使能與UART相關的底層驅動程式,檔案所處位置及需修改位置如下圖所示,需要將HAL_LCD和HAL_UART的巨集定義分別修改為FALSE和TRUE;
5、至此,基於Z-Stack協議棧的串列埠驅動程式的傳送部分就基本全部完成,就差最後來檢驗一下串列埠是否能夠正常傳送了!
雙擊開啟ProjectApp.c檔案,在ProjectApp_Init( )函式中最後的位置加入如下兩行程式碼:
Uart0_Init(HAL_UART_BR_115200);
HalUARTWrite(HAL_UART_PORT_0,"hello world !\r\n",sizeof("hello world !\r\n")-1);
我們既然在ProjectApp.c檔案中呼叫了uart0.c檔案中的函式,則一定要在ProjectApp.c中加入對應的標頭檔案——uart0.h!
具體實現程式碼如下:
#include "uart0.h"
最後點選“編譯”圖示,完成對整個工程的編譯,順利的話,肯定是 0 error(s), 0 warning(s)!點選IAR介面上方“Download and Deubug”圖示,將程式下載到CC2530晶片中(下載之前,請保證下載器、串列埠線和電腦三者已經連線正確!),如下圖所示:
並自動進入除錯介面,如下圖所示:
連上串列埠除錯助手,選擇正確的串列埠配置後開啟串列埠,點選上圖中所示“全速執行”圖示後,就可以看到串列埠除錯助手收到了來自CC2530串列埠0列印的資料,正好15個位元組!如下圖所示:
(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)