创建Zigbee Z-Stack 3.0.1 BSP(四)--移植UltraIot开发板LED

概述

UltraIot开发板LED开发板上有三个用户LED指示灯,这三个指示灯所使用的IO口与IT的评估板有所不同,所以需要根据UltraIot开发板底板的原理图来修改IO口。
UltraIot开发板LED原理图如下所示:
创建Zigbee Z-Stack 3.0.1 BSP(四)--移植UltraIot开发板LED_第1张图片
有图可以得到:
1、P1.0 ,P1.1,P1.4分别控制LED2,LED3,LED1
2、P1.0 ,P1.1,P1.4输出高电平时LED高亮,P1.0 ,P1.1,P1.4输出低电平时LED为灭。

协议栈相关文件

协议栈中于LED控制功能相关的几个文件分别是:
1.Z-Stack_3_0_1_UltraIot\Z-Stack 3.0.1_Template\Components\hal\common\hal_drivers.c
2.Z-Stack_3_0_1_UltraIot\Z-Stack 3.0.1_Template\Components\hal\include\hal_led.h
3.EZ-Stack_3_0_1_UltraIot\Z-Stack 3.0.1_Template\Components\hal\target\UltraIot\hal_led.c
4.Z-Stack_3_0_1_UltraIot\Z-Stack 3.0.1_Template\Components\hal\target\UltraIot\hal_board_cfg.h

hal_drivers.c:在该文件中定义了硬件层的事件任务。
hal_led.h:抽象出的LED控制接口定义
hal_led.c:LED控制功能的抽象实现。
hal_board_cfg.h:开发板相关的配置及资源会在这里定义。也是主要要修改的地方

协议栈修改

1、在hal_board_cfg.h修改LED定义
主要修改LEDx_BV,LEDx_SBIT,LEDx_DDR,LEDx_POLARITY.
由于IT的评估板也是3个LED灯,所以直接在上面修改就可以了。

/* LED1 */
#define LED1_BV           BV(4)
#define LED1_SBIT         P1_4
#define LED1_DDR          P1DIR
#define LED1_POLARITY     ACTIVE_HIGH

#if defined (HAL_BOARD_CC2530EB_REV17)
/* LED2 */
#define LED2_BV           BV(0)
#define LED2_SBIT         P1_0
#define LED2_DDR          P1DIR
#define LED2_POLARITY     ACTIVE_HIGH

/* LED3 */
#define LED3_BV           BV(1)
#define LED3_SBIT         P1_1
#define LED3_DDR          P1DIR
#define LED3_POLARITY     ACTIVE_HIGH

#ifdef ENABLE_LED4_DISABLE_S1
  /* 4 - Orange */
  #define LED4_BV             BV(1)
  #define LED4_SBIT           P0_1
  #define LED4_DDR            P0DIR
  #define LED4_POLARITY       ACTIVE_HIGH
  #define LED4_SET_DIR()      do {LED4_DDR |= LED4_BV;} while (0)
#else
  #define LED4_SET_DIR()
#endif
#endif

在IT评估板中还有一个LED4,在UltraIot中没有使用到,所以不用管,只要不要开启ENABLE_LED4_DISABLE_S1宏定义,就不会编译到代码里面。

2、LED控制宏定义

/* ----------- LED's ---------- */
#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && \
    !defined (HAL_PA_LNA_CC2590) && !defined (HAL_PA_LNA_SE2431L) && \
    !defined (HAL_PA_LNA_CC2592)

  #define HAL_TURN_OFF_LED1()       st( LED1_SBIT = LED1_POLARITY (0); )
  #define HAL_TURN_OFF_LED2()       st( LED2_SBIT = LED2_POLARITY (0); )
  #define HAL_TURN_OFF_LED3()       st( LED3_SBIT = LED3_POLARITY (0); )
#ifdef ENABLE_LED4_DISABLE_S1
  #define HAL_TURN_OFF_LED4()       st( LED4_SBIT = LED4_POLARITY (0); )
#else
  #define HAL_TURN_OFF_LED4()       HAL_TURN_OFF_LED1()
#endif

  #define HAL_TURN_ON_LED1()        st( LED1_SBIT = LED1_POLARITY (1); )
  #define HAL_TURN_ON_LED2()        st( LED2_SBIT = LED2_POLARITY (1); )
  #define HAL_TURN_ON_LED3()        st( LED3_SBIT = LED3_POLARITY (1); )
#ifdef ENABLE_LED4_DISABLE_S1
  #define HAL_TURN_ON_LED4()        st( LED4_SBIT = LED4_POLARITY (1); )
#else
  #define HAL_TURN_ON_LED4()        HAL_TURN_ON_LED1()
#endif

  #define HAL_TOGGLE_LED1()         st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} )
  #define HAL_TOGGLE_LED2()         st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} )
  #define HAL_TOGGLE_LED3()         st( if (LED3_SBIT) { LED3_SBIT = 0; } else { LED3_SBIT = 1;} )
#ifdef ENABLE_LED4_DISABLE_S1
  #define HAL_TOGGLE_LED4()         st( if (LED4_SBIT) { LED4_SBIT = 0; } else { LED4_SBIT = 1;} )
#else
  #define HAL_TOGGLE_LED4()         HAL_TOGGLE_LED1()
#endif

  #define HAL_STATE_LED1()          (LED1_POLARITY (LED1_SBIT))
  #define HAL_STATE_LED2()          (LED2_POLARITY (LED2_SBIT))
  #define HAL_STATE_LED3()          (LED3_POLARITY (LED3_SBIT))
#ifdef ENABLE_LED4_DISABLE_S1
  #define HAL_STATE_LED4()          (LED4_POLARITY (LED4_SBIT))
#else
  #define HAL_STATE_LED4()          HAL_STATE_LED1()
#endif

在hal_board_cfg.h中定义了LED的控制宏。通过这些宏控制LED的亮/灭/翻转功能

代码分析

在协议栈中,当LED被初始化后,在应用层主要通过hal_led.h中提供的API来控制LED,其分别为:

/*
 * 控制LED 亮/灭/翻转
 */
extern uint8 HalLedSet( uint8 led, uint8 mode );

/*
 *控制LED闪烁
 * leds:那个LED灯要闪烁
 * cnt:闪烁次数,如果为0则一直闪烁
 * duty:亮灭占空比 0-100%
 * time:闪烁周期 单位ms
 */
extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time );

但是这个函数最后会调用一个内部的函数:
void HalLedOnOff (uint8 leds, uint8 mode)

/***************************************************************************************************
 * @fn      HalLedOnOff
 *
 * @brief   Turns specified LED ON or OFF
 *
 * @param   leds - LED bit mask
 *          mode - LED_ON,LED_OFF,
 *
 * @return  none
 ***************************************************************************************************/
void HalLedOnOff (uint8 leds, uint8 mode)
{
  if (leds & HAL_LED_1)
  {
    if (mode == HAL_LED_MODE_ON)
    {
      HAL_TURN_ON_LED1();
    }
    else
    {
      HAL_TURN_OFF_LED1();
    }
  }

  if (leds & HAL_LED_2)
  {
    if (mode == HAL_LED_MODE_ON)
    {
      HAL_TURN_ON_LED2();
    }
    else
    {
      HAL_TURN_OFF_LED2();
    }
  }

  if (leds & HAL_LED_3)
  {
    if (mode == HAL_LED_MODE_ON)
    {
      HAL_TURN_ON_LED3();
    }
    else
    {
      HAL_TURN_OFF_LED3();
    }
  }

  if (leds & HAL_LED_4)
  {
    if (mode == HAL_LED_MODE_ON)
    {
      HAL_TURN_ON_LED4();
    }
    else
    {
      HAL_TURN_OFF_LED4();
    }
  }

  /* Remember current state */
  if (mode)
  {
    HalLedState |= leds;
  }
  else
  {
    HalLedState &= (leds ^ 0xFF);
  }
}

在HalLedOnOff 函数中最终实现LED控制的是在hal_board_cfg.h中定义的LED控制逻辑。

你可能感兴趣的:(Zigbee,Zigbee深入浅出实战)