z-stack中的voidHalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period)函數(shù)的深度解析
?z-stack中的voidHalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period)函數(shù)的深度解析?:
參數(shù):
????? Leds:???????????????? 哪個led;
????? numBlinks:?????? 閃爍次數(shù)
????? percent:??????? 閃爍的占空比(就是高電平持續(xù)的時間)
????? period:???????? 一個閃爍的周期多少
///////////////////////////////////////////////////////////////////////////////
HalLedBlink函數(shù)原型------
第一段代碼:
void HalLedBlink (uint8 leds, uint8numBlinks, uint8 percent, uint16 period)
{
#if (defined (BLINK_LEDS)) &&(HAL_LED == TRUE)
?uint8 led;
?HalLedControl_t *sts;
?
? if(leds && percent && period)
? {
???if (percent < 100)
??? {
?????led = HAL_LED_1;
?????leds &= HAL_LED_ALL;
?????sts = HalLedStatusControl.HalLedControlTable;
?
????? while (leds)?????????? ????? //循環(huán)通過led <<= 1 找出需要閃爍的燈;sts++相對應的狀態(tài)
?????{
??????? if (leds & led)??????????? //找出我們設置閃爍的燈后滿足條件進入設置對應的參數(shù),這里涉及兩個結(jié)構體
//HalLedControl_t和HalLedStatus_t,里面分別定義了相應的屬性(請看其定義這里不列出);
// HalLedControlTable這個是HalLedControl_t結(jié)構體變量,用來存放控制燈模式的表,
//這個在HalLedStatus_t結(jié)構體里面定義,其實就相當一個結(jié)構體數(shù)組,
?
???????{
?????????/* Store the current state of the led before going to blinking if notalready blinking */
?????????if(sts->mode < HAL_LED_MODE_BLINK )
??????????? preBlinkState |= (led &HalLedState);
?
?????????sts->mode? =HAL_LED_MODE_OFF;??????????????????? /*Stop previous blink */
?????????sts->time? = period;????????????????????????????? /* Time for oneon/off cycle */
?????????sts->onPct = percent;???????????????????????????? /* % of cycle LED ison */
?????????sts->todo? = numBlinks;?????????????????????????? /* Number of blinkcycles */
?????????if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH;? /* Continuous */
?????????sts->next = osal_GetSystemClock();??????????????? /* Start now */
???? ?????sts->mode |= HAL_LED_MODE_BLINK;????????????????? /* Enable blinking */
?????????leds ^= led;
???????}
???????led <<= 1;
???????sts++;
?????}
?????// Cancel any overlapping timer for blink events
?????osal_stop_timerEx(Hal_TaskID, HAL_LED_BLINK_EVENT);
?????osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT);??????? //設置led閃爍事件,通過這個事件對燈進行控制,跳到第二段程序執(zhí)行
??? }
???else
??? {
?????HalLedSet (leds, HAL_LED_MODE_ON);??????????????????? /* >= 100%, turn on */
??? }
? }
?else
? {
???HalLedSet (leds, HAL_LED_MODE_OFF);???????????????????? /* No on time, turn off */
? }
#elif (HAL_LED == TRUE)
?percent = (leds & HalLedState) ? HAL_LED_MODE_OFF : HAL_LED_MODE_ON;
?HalLedOnOff (leds, percent);????????????????????????????? /* Toggle */
#else
? //HAL LED is disabled, suppress unused argument warnings
?(void) leds;
?(void) numBlinks;
?(void) percent;
?(void) period;
#endif /* BLINK_LEDS && HAL_LED */
}
////////////////////////////////////////////////////////
第二段代碼:
if ( events & HAL_LED_BLINK_EVENT )
? {
#if (defined (BLINK_LEDS)) &&(HAL_LED == TRUE)
???HalLedUpdate();?????????????????????????? ????? //如果定義了BLINK_LEDS和HAL_LED == TRUE就執(zhí)行此句,下面繼續(xù)看第三段代碼
#endif /* BLINK_LEDS && HAL_LED */
???return events ^ HAL_LED_BLINK_EVENT;
? }
?
/////////////////////////////////////////////////////////
第三段代碼:
void HalLedUpdate (void)
{
? ……
……
???while (leds)
??? {
?????if (leds & led)
?????{
???????if (sts->mode & HAL_LED_MODE_BLINK)
???????{
?????????time = osal_GetSystemClock();
?????????if (time >= sts->next)
?????????{
???????????if (sts->mode & HAL_LED_MODE_ON)
???????????{
????????????? pct = 100 - sts->onPct;????????????? /* Percentage of cycle for off */
????????????? sts->mode &=~HAL_LED_MODE_ON;????? ?/* Say it's not on */
????????????? HalLedOnOff (led,HAL_LED_MODE_OFF); /* Turn it off */ //重點來了,這個就是操作led電平函數(shù),繼續(xù)看第四段代碼
??????????????????????????????????????????????????????? //由于這個函數(shù)太多沒有完全列出來,也沒分析完我們就看重點
????????????? if (!(sts->mode &HAL_LED_MODE_FLASH))
????????????? {
??????????????? sts->todo--;??????????????????????? /* Not continuous,reduce count */
????????????? }
???????????}???????????
???????????else if ( (!sts->todo) && !(sts->mode &HAL_LED_MODE_FLASH) )
???????????{
????????????? sts->mode ^=HAL_LED_MODE_BLINK;????? /* No moreblinks */?
???????????}???????????
???????????else
???????????{
????????????? pct = sts->onPct;???????????????????? /* Percentage of cycle foron */
????????????? sts->mode |= HAL_LED_MODE_ON;???????? /* Say it's on */
????????????? HalLedOnOff (led,HAL_LED_MODE_ON);?? /* Turn it on */
???????????}
?????……
……
///////////////////////////////////
第四段代碼
void HalLedOnOff (uint8 leds, uint8 mode)
{
? if(leds & HAL_LED_1)
? {
???if (mode == HAL_LED_MODE_ON)
??? {
?????HAL_TURN_ON_LED1();?????????????? //繼續(xù)追蹤下去,就找到對應的管腳,這里就不多說了,先介紹到這自己搞定后面的
??? }
???else
??? {
?????HAL_TURN_OFF_LED1();
??? }
? }
……
……
}
本人,剛寫博客,這是我學習心得,有過之處望指出