




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Zstack 的按鍵機制這一節(jié)看按鍵機制,后續(xù)會陸續(xù)看 UART 機制和綁定機制,通過這三大機制深入學習 Zstack 消息的傳遞機制,掌握 Zstack 開發(fā)流程。1、 了解 TI 的 EB 板按鍵TI 的 EB 板按鍵資源有一個獨立按鍵和一個搖桿。獨立按鍵連接到 P0_1,搖桿四個方向串聯(lián)電阻連接到 P0_6,搖桿的確認按鈕(中心按鍵)連接到 P0_5,類似與獨立按鍵。TI 的 EB 板按鍵部分原理圖:A) 獨立按鍵原理圖:圖 1:EB 板獨立按鍵原理圖由原理圖可以看出按鍵為低電平有效。B)搖桿按鍵原理圖圖 1:EB 板搖桿按鍵原理圖(這個圖想橫著占一頁)由原理圖可以看出搖桿的確認按鈕(中
2、心按鍵)是2、 輪詢與中斷有效。Zstack 中提供了兩種方式輪詢方式:中斷方式:3、 按鍵的初始化A)、相關宏定義按鍵數(shù)據(jù):輪詢方式和中斷方式。在 key.c 文件中定義了關于按鍵的宏。注意按鍵初始化配置屬于底層驅(qū)動的配置,在涉及到底層時會遇到大量的 CC2430 寄存器,要養(yǎng)成查看 datasheet 的好。、按鍵 6(SW6)對應原理圖的獨立按鍵 S1,按鍵 6(SW6)相關的宏定義:#define HAL_KEY_BIT0 #define HAL_KEY_BIT1 #define HAL_KEY_BIT2 #define HAL_KEY_BIT3 #define HAL_KEY_BIT
3、4 #define HAL_KEY_BIT5 #define HAL_KEY_BIT6#define HAL_KEY_BIT70 x010 x020 x040 x080 x100 x200 x400 x80#if defined (HAL_BOARD_CC2430EB) | defined (HAL_BOARD_CC2430BB)#define HAL_KEY_SW_6_ENABLE#define HAL_KEY_SW_6_PORT #define HAL_KEY_SW_6_BIT #define HAL_KEY_SW_6_SEL #define HAL_KEY_SW_6_DIR #defin
4、e HAL_KEY_SW_6_IEN #define HAL_KEY_SW_6_IENBIT #define HAL_KEY_SW_6_EDGE #define HAL_KEY_SW_6_EDGEBIT #define HAL_KEY_SW_6_ICTL #define HAL_KEY_SW_6_ICTLBIT#define HAL_KEY_SW_6_PXIFGP0 HAL_KEY_BIT1 P0SELP0DIR IEN1HAL_KEY_BIT5 HAL_KEY_RISING_EDGE HAL_KEY_BIT0PICTL HAL_KEY_BIT3 P0IFGHAL_KEY_SW_6_BIT#d
5、efine HAL_KEY_P0#endif_LOW_USED、按鍵 5(SW5)對應原理圖的搖桿的確認按鈕(中心按鍵),搖桿相關宏定義: #if defined (HAL_BOARD_CC2430EB)#define HAL_KEY_JOYSTICK_ENABLE#define HAL_KEY_JOY_CHNHAL_ADC_CHANNEL_6#define HAL_KEY_SW_5_ENABLE #define HAL_KEY_SW_5_PORT #define HAL_KEY_SW_5_BIT #define HAL_KEY_SW_5_SEL #define HAL_KEY_SW_5_DI
6、R #define HAL_KEY_SW_5_INP #define HAL_KEY_SW_5_IEN #define HAL_KEY_SW_5_IENBIT #define HAL_KEY_SW_5_EDGE #define HAL_KEY_SW_5_EDGEBIT#define HAL_KEY_SW_5_ICTLP0 HAL_KEY_BIT5 P0SELP0DIR P0INP IEN1HAL_KEY_BIT5 HAL_KEY_RISING_EDGE HAL_KEY_BIT2PICTL#define HAL_KEY_SW_5_ICTLBIT#define HAL_KEY_SW_5_PXIFG
7、HAL_KEY_BIT4P0IFG HAL_KEY_SW_5_BIT#define HAL_KEY_PO#endif_HIGH_USEDB)、代碼分析:按鍵的初始化屬于硬件的初始化,在 Zstack 中硬件驅(qū)動在 HalDriverInit()集中處理。在主函數(shù) Main 中調(diào)用了函數(shù) HalDriverInit()進行硬件驅(qū)動的初始化,該函數(shù)根據(jù)編譯選項對硬件逐個進行了初始化。HalDriverInit()代碼如下:程序代碼:void HalDriverInit (void)/* 定時器 */ HalTimerInit();/* ADC */#if (defined HAL_ADC) & (
8、HAL_ADC = TRUE) HalAdcInit();#endif/* LED 燈*/#if (defined HAL_LED) & (HAL_LED = TRUE) HalLedInit();#endif/* 串口 */#if (defined HAL_UART) & (HAL_UART = TRUE) HalUARTInit();#endif/* 按鍵 */#if (defined HAL_KEY) & (HAL_KEY = TRUE) HalKeyInit();#endif由上述代碼可以看出除定時器以外其它初始化都是根據(jù)條件進行初始化的,這里滿足按鍵初始化條件。注:硬件驅(qū)動初始化沒有
9、完全列舉,可以參見具體協(xié)議棧。程序代碼:/*Set to TRUE enable KEY usage, FALSE disable itNotes: On 2430EB/DBog joystick is used to simulatekeys. Keys wont work unless HAL_ADC is also setto TRUE*/#ifndef HAL_KEY #define HAL_KEY TRUE #endif上述代碼摘自 hal_board_cfg.h 文件,從上述代碼可以看出:TI 的 Zstack 協(xié)議棧默認是使用獨立按鍵的。使用搖桿的時候還要確保 HAL_ADC 為
10、真,即 Zstack 協(xié)議棧使用 AD HAL_ADC 代碼如下:程序代碼:/* Set to TRUE enable ADC usage, FALSE disable it */ #ifndef HAL_ADC#define HAL_ADC TRUE #endif上述代碼同樣摘自hal_board_cfg.h 文件,可以看出 Zstack 協(xié)議棧默認使用AD 轉(zhuǎn)換器。由上述#define HAL_KEY TRUE 和#define HAL_ADC TRUE 可以知道在 TI 的Zstack 協(xié)議棧默認情況既可以使用普通的獨立按鍵也可以使用模擬的搖桿。void HalKeyInit( void
11、 )#if (HAL_KEY = TRUE)halKeySavedKeys = 0;#if defined (HAL_KEY_SW_6_ENABLE)。關于HAL_KEY_SW_6_SEL &= (HAL_KEY_SW_6_BIT); HAL_KEY_SW_6_DIR &= (HAL_KEY_SW_6_BIT);#endif#if defined (HAL_KEY_SW_5_ENABLE) HAL_KEY_SW_5_SEL &= (HAL_KEY_SW_5_BIT); HAL_KEY_SW_5_DIR &= (HAL_KEY_SW_5_BIT); HAL_KEY_SW_5_INP |= HAL
12、_KEY_SW_5_BIT;#endif/設定為通用 I/O 口/設置為輸入模式/設定為通用 I/O 口/設置為輸入模式/設置為三態(tài)模式pHalKeyProsFunction= NULL;HalKeyConfigured = FALSE;#endif /* HAL_KEY */按鍵驅(qū)動初始化函數(shù) HalKeyInit()說明:、配置了三個全局變量。全局變量 halKeySavedKeys 是用來保存按鍵值的,初始化時將其初始化為 0;pHalKeyProsFunction 為指向按鍵處理函數(shù)的指針,當有按鍵按下時調(diào)用按鍵處理函數(shù)對按鍵進行處理,初始化時將其初始化為 NULL,在按鍵的配置函數(shù)中
13、對其進行配置;全局變量 HalKeyConfigured 用來標示按鍵是否被配置,初始化時沒有配置按鍵,所以此時該變量被初始化為 FALSE。、配置了兩個按鍵的 I/O 口。函數(shù)中用條件語句判定是否使能了 SW5 和 SW6,由前面的宏定義可以看出,如果使用的是 TI 的 EB 板,則 SW5 和 SW6 都將被使能。有上述代碼可以看出按鍵驅(qū)動初始化函數(shù) HalKeyInit()將與 SW5 和 SW6 相連接的 I/O 設定通用 I/O口,并都設置為輸入模式。而且將 SW5 的輸入模式設定為三態(tài)。4、按鍵的配置按鍵的初始化只是簡單的對按鍵進行了初始化與 I/O 的配置,如果要使用 Zstac
14、k 的按鍵仍需要進一步對按鍵進行配置,下面著重按鍵的配置。Zstack 對按鍵處理提供了兩種方詢法和中斷法。在配置按鍵時也是分為兩種情況與之對應。這里對兩種配置模式逐一說明。Zstack 默認使用輪詢的方式處理,A)、配置輪詢方式的按鍵先以輪詢?nèi)胧?。TI 的 Zstack 為什么會默認使用輪詢方式對按鍵進行處理?其實最重要的一點是因為 TI 的 EB 和 ED 板都有搖桿。因為搖桿的四個方向是以電壓的大小區(qū)分的,是不能產(chǎn)生中斷的。如果使用了中斷方式對按鍵進行處理那么搖桿的四個方向鍵就是擺設了,所以 TI 的 Zstack 采取輪詢的方式處理按鍵。為什么要使用搖桿?其實原因也很簡單,為了節(jié)省 I
15、/O口資源,CC2430 只有 21 個通用 I/O 口,如果使用一個搖桿就可以就可以節(jié)省使用三個獨立 I/O 口。代碼分析:按鍵的配置函數(shù)在板載初始化函數(shù)InitBoard()中被調(diào)用,函數(shù)InitBoard()負責板載的初始化與配置。HalKeyConfig()決定了將按鍵的處理方式為輪詢方式或者是中斷方式。程序代碼:#define HAL_KEY_#define HAL_KEY_ERRUPT_DISABLEERRUPT_ENABLE0 x000 x01void InitBoard( byOnboardKeyevel )Enable = HAL_KEY_ERRUPT_DISABLE;/使用
16、輪詢方式HalKeyConfig( OnboardKeyEnable, OnBoard_KeyCallback);板載初始化函數(shù) InitBoard()說明:由代碼 HAL_KEY_ERRUPT_DISABLE 得知處理方式被設置為輪詢方式。如果我們 要 設 置 為 中 斷 方 式 , 只 需 要 給 變 量 OnboardKeyEnable賦 值HAL_KEY_ERRUPT_ENABLE 即可。另一個參數(shù) OnBoard_KeyCallback 是按鍵處理的回調(diào)函數(shù)的函數(shù)名,如果有按鍵按下時將會調(diào)用這個回調(diào)函數(shù)進行處理。該按鍵回調(diào)函數(shù)會在按鍵處理詳細說明。程序代碼:void HalKeyCo
17、nfig (boolerruptEnable, halKeyCBack_t cback)#if (HAL_KEY = TRUE)Hal_KeyEnable =erruptEnable;/保存參數(shù)決定處理方式是輪詢或是中斷pHalKeyProsFunction = cback;/保存參數(shù)按鍵處理的回調(diào)函數(shù)if (Hal_KeyEnable)/如果為真則配置為中斷方式else/否則配置為輪詢方式#if defined (HAL_KEY_SW_6_ENABLE)HAL_KEY_SW_6_ICTL &= (HAL_KEY_SW_6_ICTLBIT); /清除中斷 HAL_KEY_SW_6_IEN &=
18、 (HAL_KEY_SW_6_IENBIT);#endif#if defined (HAL_KEY_SW_5_ENABLE) HAL_KEY_SW_5_ICTL &= (HAL_KEY_SW_5_ICTLBIT); HAL_KEY_SW_5_IEN &= (HAL_KEY_SW_5_IENBIT);#endifosal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, L_KEY_POLLING_VALUE);/定時觸發(fā)事件 HAL_KEY_EVENT,溢出時間為 HAL_KEY_POLLING_VALUE。HalKeyConfigured = TRUE; #
19、endif /* HAL_KEY */按鍵配置函數(shù) HalKeyConfig ()說明: 、配置三個全局變量。 Hal_KeyEnable 保存了按鍵處理方式, 全局變量pHalKeyProsFunction 保存了按鍵處理的回調(diào)函數(shù),在按鍵處理工程中將被調(diào)用。第三個變量仍是HalKeyConfigured 用來標示按鍵是否配置,當按鍵配置完成將其設定為 TRUE。、配置兩個按鍵。由于上述代碼使用的是輪詢方式對按鍵事件進行配置,就不允許按鍵產(chǎn)生中斷。在配置按鍵 SW5 和 SW6 時將其對應的中斷使能見按鍵相關宏定義和 CC2340 的 datasheet 進行理解。具體配置代碼需參、事件 H
20、AL_KEY_EVENT,在將按鍵配置為輪詢方式后,Zstack 會定時觸發(fā)事件HAL_KEY_EVENT 檢測是否有按鍵按下。定時器的溢出時長為 HAL_KEY_POLLING_ VALUE。事件的處理置為中斷方式。后續(xù)講解,這里完成了輪詢方式的配置,接下來看如何將按鍵配B)、配置中斷方式的按鍵為了讓大家能更加深入了解 Zstack 中機制和數(shù)據(jù)流的傳遞。雖然 TI 的 Zstack 默認是以輪詢方式處理按鍵,但其中斷方式的代碼都給可。下面一起看如何將按鍵配置為中斷方式。 程序代碼:代碼分析:準備好了,只需稍微改動一點即按鍵的配置函數(shù)在板載初始化函數(shù)InitBoard()中被調(diào)用,函數(shù)Ini
21、tBoard()負責板載的初始化與配置。在函數(shù) InitBoard()調(diào)用按鍵配置函數(shù) HalKeyConfig()根據(jù)參數(shù)值對按鍵進行配置,決定了將按鍵的處理方式為輪詢方式或者是中斷方式。程序代碼:#define HAL_KEY_#define HAL_KEY_ERRUPT_DISABLEERRUPT_ENABLE0 x000 x01void InitBoard( byevel )OnboardKeyEnable = HAL_KEY_ERRUPT_ENABLE;/使用中斷方式HalKeyConfig( OnboardKeyEnable, OnBoard_KeyCallback);程序代碼:v
22、oid HalKeyConfig (boolerruptEnable, halKeyCBack_t cback)#if (HAL_KEY = TRUE)Hal_KeyEnable =erruptEnable;/保存參數(shù)決定處理方式是輪詢或是中斷pHalKeyProsFunction = cback;/保存參數(shù)按鍵處理的回調(diào)函數(shù)if (Hal_KeyEnable)#if defined (HAL_KEY_SW_5_ENABLE)PICTL &= (HAL_KEY_SW_5_EDGEBIT);/設定上升沿或者下降沿觸發(fā)#if (HAL_KEY_SW_5_EDGE = HAL_KEY_FALLING
23、_EDGE) PICTL |= HAL_KEY_SW_5_EDGEBIT;#endifHAL_KEY_SW_5_ICTL |= HAL_KEY_SW_5_ICTLBIT; HAL_KEY_SW_5_IEN |= HAL_KEY_SW_5_IENBIT; HAL_KEY_SW_5_PXIFG = (HAL_KEY_SW_5_BIT);#endif/設定中斷使能/清除中斷標志#if defined (HAL_KEY_SW_6_ENABLE)PICTL &= (HAL_KEY_SW_6_EDGEBIT);/設定上升沿或者下降沿觸發(fā)#if (HAL_KEY_SW_6_EDGE = HAL_KEY_FA
24、LLING_EDGE) PICTL |= HAL_KEY_SW_6_EDGEBIT;#endifHAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT; HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT; HAL_KEY_SW_6_PXIFG = (HAL_KEY_SW_6_BIT);#endif/設定中斷使能/清除中斷標志elseHalKeyConfigured = TRUE; #endif /* HAL_KEY */按鍵配置函數(shù) HalKeyConfig ()說明:、配置三個全局變量。、配置兩個按鍵。這里是要將按鍵配置為中斷方式。需
25、要將按鍵配置為上升沿或是下降沿觸發(fā),同時需要將按鍵的對應 I/O 口配置為允許中斷,即中斷使能。在配置觸發(fā)沿時首先默認配置為上升沿,然后檢測按鍵相關宏定義決定是否需要配置為下降沿。在配置完中斷使能后清除中斷標志位允許按鍵中斷。具體配置代碼需參見按鍵相關宏定義和 CC2340 的 datasheet 進行理解。、將按鍵配置為中斷方式,在程序中沒有觸發(fā)類似 HAL_KEY_EVENT 的事件,而是交由中斷函數(shù)進行處理,當有按鍵按下時中斷函數(shù)就會捕獲中斷,從而調(diào)用按鍵的處理函數(shù)進一步進行相關處理。關于中斷方式的按鍵處理將在后面的進行梳理。5、按鍵的處理 A)、輪詢方式處理輪詢方式是 TI 的 Zst
26、ack 對按鍵默認的處理方式,Zstack 會每隔 100ms 對按鍵檢測一次, 如果有按鍵按 下就執(zhí)行相關 的處理。 Zstack 是以每隔 100ms 觸發(fā)一次 HAL_KEY_EVENT 事件實現(xiàn)的輪詢的,定時器溢出時間 HAL_KEY_POLLING_VALUE即為輪詢的的間隔。Zstack 每次輪詢按鍵都會與保存的按鍵值(halKeySavedKeys)進行對比,保存按鍵值在按鍵初始化函數(shù)被初始化為 0。如果沒有按下即與先前保存的按鍵值相等,Zstack 不進行處理。如果有按鍵按下,那么按鍵值與保存的按鍵值(halKeySavedKeys)不同,將會調(diào)用按鍵處理回調(diào)處理函數(shù)進行處理,
27、并將此時得到的按鍵值保存以便下次比較。在輪詢方式配置完成后,Zstack 便觸發(fā)了事件 HAL_KEY_EVENT,其任務 ID 為Hal_TaskID,則對應的處理函數(shù)即為 HAL 層的事件處理函數(shù) Hal_ProsEvent()。觸發(fā)了HAL 層的 HAL_KEY_EVENT 標志著開始了按鍵的輪詢。詳細代碼如下:程序代碼:u16 Hal_ProsEvent( u8 task_id, u16 events )if (events & HAL_KEY_EVENT)#if (defined HAL_KEY) & (HAL_KEY = TRUE) HalKeyPoll();if (!Hal_Ke
28、yEnable)osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);#endif / HAL_KEYreturn events HAL_KEY_EVENT;HAL_KEY_EVENT 事件處理說明:、在處理 HAL_KEY_EVENT 事件時調(diào)用了函數(shù) HalKeyPoll(),函數(shù) HalKeyPoll()負責檢測是否有按鍵按下,如果有按鍵按下會觸發(fā)相應的回調(diào)函數(shù)。、在調(diào)用函數(shù) HalKeyPoll()檢測完按鍵過后,用 if 條件判斷語句檢測按鍵是否是輪詢方式處理,這里是以輪詢方式處理按鍵,所以滿足 if 條件判斷語句的條件,即執(zhí)行函數(shù)
29、osal_start_timerEx()定時再次觸發(fā)事件 HAL_KEY_EVENT,定時長度為 100ms,由此可以看出如此的循環(huán)的觸發(fā)事件 HAL_KEY_EVENT 即完成了對按鍵的定時輪詢。處理 HAL_KEY_EVENT 事件時調(diào)用了函數(shù) HalKeyPoll(),HalKeyPoll()函數(shù)進一步來去檢測是否有按鍵按下,其詳細代碼如下:程序代碼:#define HAL_KEY_S#define HAL_KEY_SE_NORMALE_SHIFT0 x000 x01void HalKeyPoll (void)u8 keys = 0;/初始鍵值為 0#if defined (HAL_KE
30、Y_SW_6_ENABLE)if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)keys |= HAL_KEY_SW_6;#endif#if defined (HAL_KEY_SW_5_ENABLE)if (HAL_KEY_SW_5_PORT & HAL_KEY_SW_5_BIT)keys |= HAL_KEY_SW_5;#endif/SW6 低電平有效/SW5有效if (!Hal_KeyEnable)/輪詢方式if (keys = halKeySavedKeys)return;halKeySavedKeys = keys;/保存按鍵值下次比較if (keys
31、 & (pHalKeyProsFunction)/調(diào)用按鍵回調(diào)函數(shù)對按鍵進一步處理(pHalKeyProsFunction) (keys, HAL_KEY_SE_NORMAL);HalKeyPoll()函數(shù)說明:、HalKeyPoll()函數(shù)對所有的按鍵進行檢測,這里只是列舉了 SW5 和 SW6 兩個按鍵,搖桿的四個方向是利用 AD里不一一列舉了。的數(shù)值不同決定的,具體可以參見協(xié)議棧代碼,這。首先函數(shù)定義了一個 u8 的局部變量 keys 用來、按鍵值按鍵的值,并將其值初始化為 0。通過 if 條件語句判定是否有 SW5 或者 SW6 被按下。注意程序中的代碼在檢測 SW5 時是檢測對應位是
32、否為,而檢測 SW6 時檢測對應位是否為低電平。這里的高低電平與最初分析原理圖時一致。如果有按鍵按下則將其對應的數(shù)值賦給局部變量 keys。、輪詢處理。如果是輪詢方式首先要對上次的按鍵值直接返回不進行處理。如果的按鍵進行判別,如果的按鍵值為的按鍵值和上次的按鍵值不同,則將的按鍵值保存到全局變量 halKeySavedKeys 以便下一次比較。并調(diào)用函數(shù)進行處理。、回調(diào)函數(shù)處理按鍵。當有按鍵按下后則 keys 值不為 0,并且在按鍵配置函數(shù)HalKeyConfig ()的時候 (keys & (pHalKeyPro進行處理。為按鍵配置了回調(diào)函數(shù) OnBoard_KeyCallback ()。所以
33、 ifsFunction)中的兩個判斷條件都為真,即可以用回調(diào)函數(shù)對按鍵當有按鍵按下,Zstack 的底層獲取了按鍵的按鍵值會觸發(fā)按鍵的回調(diào)函數(shù) OnBoard_KeyCallback ()進一步處理,將按鍵信息傳到上層(應用層)。按鍵回調(diào)函數(shù)代碼如下:程序代碼:void OnBoard_KeyCallback ( u8 keys, u8 se )/調(diào)用 OnBoard_SendKeys 將到上層if ( OnBoard_SendKeys( keys, shift ) != ZSucs )OnBoard_KeyCallback ()函數(shù)說明:OnBoard_KeyCallback ()函數(shù)中調(diào)
34、用了函數(shù) OnBoard_SendKeys()進一步處理,但是 Zstack 并沒有給出 OnBoard_SendKeys()處理失敗的代碼,用戶可以根據(jù)實際需要自行添加。在函數(shù) OnBoard_SendKeys()將會將按鍵的值和按鍵的狀態(tài)進行“打包”發(fā)送到按鍵的那一層。具體代碼如下:程序代碼:byte OnBoard_SendKeys( byte keys, byte se )keyChange_t *msgPtr;if ( registeredKeysTaskID != NO_TASK_ID )/這里必須要被/分配內(nèi)存空間msgPtr = (keyChange_t *)osal_msg_
35、allocate( sizeof(keyChange_t) ); if ( msgPtr )/內(nèi)存分配成功msgPtr-hdr.event = KEY_CHANGE; msgPtr-se = se;msgPtr-keys = keys;過osal_msg_send( registeredKeysTaskID, (u8 *)msgPtr );return ( ZSucs );elsereturn ( ZFailure );OnBoard_SendKeys ()函數(shù)說明、按鍵的。if ( registeredKeysTaskID != NO_TASK_ID )用來判斷按鍵是否被注冊。在 Zstac
36、k 中,如果要使用按鍵必須要。類似于端點 endpo的。但按鍵的注冊只能在 S行按鍵給一個層。這里以 SleApp 實例進行說明。leApp 實例的應用層初始化代碼中調(diào)用了按鍵函數(shù) RegisterForKeys ()進函數(shù)代碼如下:,其傳遞的任務 ID 為 SleApp_TaskID。按鍵程序代碼:byte RegisterForKeys( byte task_id )/ 僅允許一次if ( registeredKeysTaskID = NO_TASK_ID ) /判斷條件,確定沒有被registeredKeysTaskID = task_id;/將傳來的 ID 賦給了 registered
37、KeysTaskID return ( true );elsereturn ( false );按鍵函數(shù)僅允許一次,即只能有一個層按鍵。在按鍵時首先檢測了全局變量 registeredKeysTaskID(初始化為 NO_TASK_ID)是否等于 NO_TASK_ID,如果等于則證明按鍵沒有被賦給,可以被。按鍵的實際上就是將函數(shù)傳遞來的任務 ID全局變量 registeredKeysTaskID 的過程。、數(shù)據(jù)的發(fā)送。在確定按鍵已經(jīng)被的前提下,Zstack 對按鍵信息進行打包處理,封裝到信息包 msgPtr 中,將將要觸發(fā)的事件 KEY_CHANGE,按鍵的狀態(tài) se 和按鍵的鍵值 keys
38、一并封裝。然后調(diào)用 osal_msg_send()將按鍵到按鍵的對應層。這里以 SleApp 工程為例,Zstack 最終觸發(fā)了 SleApp 應用層的處理函數(shù)中的 KEY_CHANGE 事件。代碼如下:程序代碼:u16 SleApp_ProsEvent( u8 task_id, u16 events )case KEY_CHANGE:SleApp_HandleKeys( (keyChange_t *)MSGpkt)-se, (keyChange_t*)MSGpkt)-keys );break;SleApp_ProsEvent()在處理 HAL_KEY_EVENT 事件時調(diào)用了應用層的按鍵處理
39、函數(shù) SleApp_HandleKeys()。按鍵處理函數(shù) SleApp_HandleKeys()對按鍵進一步處理,其代碼如下:程序代碼:void SleApp_HandleKeys( u8 shift, u8 keys )if ( keys & HAL_KEY_SW_1 )/如果按鍵值 keys&HAL_KEY_SW_1 為 1,執(zhí)行以下代碼SleApp_SendFlashMessage( SLEAPP_FLASH_DURATION );if ( keys & HAL_KEY_SW_2 )/如果按鍵值 keys&HAL_KEY_SW_2 為 1,執(zhí)行以下代碼在按鍵處理函數(shù) SleApp_Ha
40、ndleKeys()中根據(jù)按鍵值的不同調(diào)用了不同的函數(shù),按鍵完成了其使命。以上分析就是以輪詢方式處理按鍵。B)、中斷方式處理在按鍵配置函數(shù) HalKeyConfig ()將按鍵配置為中斷方式后,使能了按鍵相對應的 I/O口。這里以 P0 口為例進行梳理。P0 口中斷函數(shù)代碼如下:程序代碼:HAL_ISR_FUNCTION( halKeyPort0Isr, P0_VECTOR )halPro P0IF = 0;sKeyerrupt();P0 口外部中斷函數(shù)說明在該中斷函數(shù)調(diào)用了按鍵中斷處理函數(shù) halProsKeyerrupt()對中斷進行處理,且將 P0 口中斷標志位清零。中斷處理函數(shù) hal
41、Pro程序代碼:sKeyerrupt()代碼如下:void halProsKeyerrupt (void)boolvalid=FALSE;#if defined (HAL_KEY_SW_6_ENABLE)if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)HAL_KEY_SW_6_PXIFG = (HAL_KEY_SW_6_BIT);valid = TRUE;#endif#if defined (HAL_KEY_SW_5_ENABLE)if (HAL_KEY_SW_5_PXIFG & HAL_KEY_SW_5_BIT)HAL_KEY_SW_5_PXIFG = (
42、HAL_KEY_SW_5_BIT);valid = TRUE;#endifif (valid)osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT,HAL_KEY_DEBOUNCE_VALUE);按鍵中斷處理 halProsKeyerrupt ()說明:、局部變量 valid 說明。函數(shù)中的局部變量 valid 標示了是否有按鍵按下,如果有按鍵按下則定時觸發(fā) HAL_KEY_EVENT 事件。這里說明一點,P0 口外部中斷不只是里的兩個按鍵。、按鍵的檢測。在該函數(shù)中通過檢測按鍵對應位的中斷標志位是否為 1,判斷按鍵按下。CC2340 的每一個 I/O 都可
43、以產(chǎn)生中斷。如果有按鍵按下則要將對應位的中斷標志位置為 0,并將局部變量 valid 設置為 TRUE,從而觸發(fā)AL_KEY_EVENT 事件對按鍵處理。、HAL_KEY_EVENT 事件。如果有按鍵按下則會定時觸發(fā) HAL_KEY_EVENT 事件,定時長度為 HAL_KEY_DEBOUNCE_VALUE(25ms)。這里說明一下,在按鍵中斷處這理函數(shù) halProsKeyerrupt () 并 沒 有按 鍵 的 值 , 而 是 定 時 觸 發(fā) 了HAL_KEY_EVENT 事 件 , 在 處 理 HAL_KEY_EVENT 事 件 時HAL_KEY_DEBOUNCE_VALUE(25ms)是為了按鍵消抖。 定 時 時 長按鍵中斷處理 halProsKeyerrupt ()所觸發(fā)的 HAL_KEY_EVENT 事件在 HAL 層事件處理函數(shù) Hal_Pro程序代碼:sEvent()被處理,具體代碼如下:u16 Hal_ProsEvent( u8 task_id, u16 events )if
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商家合作協(xié)議合同
- 農(nóng)業(yè)技術(shù)服務合同協(xié)議
- 人力資源招聘合同
- 房改房二手房買賣合同
- 服務器維護服務類合同
- 集體土地買賣合同
- 砂石材料供貨合同
- 智慧園區(qū)開發(fā)建設合同
- 設備買賣居間合同
- 山西金融職業(yè)學院《數(shù)據(jù)可視化理論與實踐》2023-2024學年第二學期期末試卷
- 四川省達州市達川區(qū)2023-2024學年八年級下學期期末道德與法治試題
- 職業(yè)技術(shù)學院環(huán)境工程技術(shù)專業(yè)《水處理技術(shù)》課程標準
- 2024年中國國際航空股份有限公司校園招聘考試試題含答案
- 2023-2024學年統(tǒng)編版語文 七年級下冊第21課《古代詩歌五首-己亥雜詩(其五)》課件
- 駕駛證延期申請委托書
- 【公路工程的發(fā)展趨勢與思考探究6600字(論文)】
- Unit1RelationshipsLesson2HowDoWeLikeTeachers'Feedback-課件高中英語北師大版選擇性
- 適合老年病科護士小講課
- 中國下肢骨折術(shù)后負重專家共識
- 統(tǒng)編版道德與法治三年級下冊全冊教學課件
- 山東萊陽核電項目一期工程水土保持方案
評論
0/150
提交評論