ZigBee TI ZStack CC2530 3.12 LED驅動移植及使用
(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)
一、前言
關於Z-Stack協議棧中的LED控制,如果使用協議棧中自帶的驅動,很簡單就可以實現非常豐富的功能。除了基本的“亮”、“滅”之外,可以通過改變引數,同時控制多個LED亮滅、指定LED可調佔空比閃爍等等。
本節將從詳細講述Z-Stack中LED的驅動原理,以及相關移植操作。
二、LED配置
相關程式碼全部位於hal_board_cfg.h檔案中,這是我們唯一需要修改的檔案,原版的程式碼如下:
從上述程式碼就可以看出,在TI的V1.7版本的官方評估板上,總共有3個LED,分別位於P1_0、P1_1、P1_4三個位置,並且都是高電平有效(即高電平亮,低電平滅)。對於一般應用來說,3個LED完全夠用了,所以我們也不必再增加到LED4、LED5等,直接在這部分程式碼上修改即可。如果有特殊應用,需要增加LED,依葫蘆畫瓢即可。/* 1 - Green */ #define LED1_BV BV(0) #define LED1_SBIT P1_0 #define LED1_DDR P1DIR #define LED1_POLARITY ACTIVE_HIGH #if defined (HAL_BOARD_CC2530EB_REV17) /* 2 - Red */ #define LED2_BV BV(1) #define LED2_SBIT P1_1 #define LED2_DDR P1DIR #define LED2_POLARITY ACTIVE_HIGH /* 3 - Yellow */ #define LED3_BV BV(4) #define LED3_SBIT P1_4 #define LED3_DDR P1DIR #define LED3_POLARITY ACTIVE_HIGH #endif
目前我手上使用的微雪的ZigBee開發板用的是ZB502底板,LED部分原理圖如下:
正好和程式碼完全匹配,所以LED部分就不必做修改了,也就是不必做任何移植就可以直接使用。但為了演示,就假設我們要將LED3從原本的“P1_4 高電平有效”移植到“P0_5 低電平有效”,那麼我們僅需要做細微的改動,修改後的程式碼如下:
這樣就OK了!與原版的程式碼簡單對比即可完全理解!#define LED3_BV BV(5) #define LED3_SBIT P0_5 #define LED3_DDR P0DIR #define LED3_POLARITY ACTIVE_LOW
三、LED初始化
相關程式碼先後位於兩個位置,並且都不需要我們做任何修改:
hal_board_cfg.h檔案中對應程式碼如下:
可見在實際初始化IO時,僅初始化了對應IO的PxDIR,並未初始化PxSEL。因為PxSEL預設值為0x00,Px_y本身就是工作在“普通IO”模式,所以就算不初始化PxSEL也並不會有影響。#define HAL_BOARD_INIT() \ { \ ...... HAL_TURN_OFF_LED1(); \ LED1_DDR |= LED1_BV; \ HAL_TURN_OFF_LED2(); \ LED2_DDR |= LED2_BV; \ HAL_TURN_OFF_LED3(); \ LED3_DDR |= LED3_BV; \ ...... }
hal_led.c檔案中對應程式碼如下:
可見HalLedInit( )函式中只是將所有LED都設定為“熄滅”狀態,並沒有更多的操作;void HalLedInit (void) { #if (HAL_LED == TRUE) /* Initialize all LEDs to OFF */ HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF); #endif /* HAL_LED */ #ifdef BLINK_LEDS /* Initialize sleepActive to FALSE */ HalLedStatusControl.sleepActive = FALSE; #endif }
四、LED驅動
Z-Stack中提供了豐富的LED控制介面,一般最常用的是HalLedSet( )和HalLedBlink( )兩個函式,相關說明見hal_led.c檔案:
/*************************************************************************************************** * @fn HalLedSet * * @brief Tun ON/OFF/TOGGLE given LEDs * * @param led - bit mask value of leds to be turned ON/OFF/TOGGLE * mode - BLINK, FLASH, TOGGLE, ON, OFF * @return None ***************************************************************************************************/ uint8 HalLedSet (uint8 leds, uint8 mode) { ...... }
/*************************************************************************************************** * @fn HalLedBlink * * @brief Blink the leds * * @param leds - bit mask value of leds to be blinked * numBlinks - number of blinks * percent - the percentage in each period where the led * will be on * period - length of each cycle in milliseconds * * @return None ***************************************************************************************************/ void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) { ...... }
五、驗證
本來這裡最好的驗證方式應該是通過按鍵點燈來實現,由於按鍵的講解在後面,這裡就以前面講過的串列埠輸入命令來實現“串列埠點燈”!
具體步驟很簡單:
a、按照前面的講述,完成LED驅動移植(若你用的也是微雪的ZB502底板,那可以直接跳過這一步);
b、編寫測試程式碼,這裡採取串列埠輸入命令,CC2530根據判斷不同的串列埠命令,實現不同的點燈功能,需要更改的只有Uart0_Handle( )函式:
(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)void Uart0_Handle(void) { ...... else if(strstr((const char*)UART0_RX_BUFF,"led_1")) { HalLedSet(HAL_LED_1,HAL_LED_MODE_TOGGLE); } else if(strstr((const char*)UART0_RX_BUFF,"led_2")) { HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE); } else if(strstr((const char*)UART0_RX_BUFF,"led_3")) { HalLedSet(HAL_LED_3,HAL_LED_MODE_TOGGLE); } ...... }
上述程式碼很好理解,編譯下載到晶片中後,通過串列埠傳送“led_1\r\n”、“led_2\r\n”、“led_3\r\n”即可分別實現對LED1、LED2、LED3的狀態取反。
親測成功!