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

来源:互联网 发布:数字矩阵蜂鸣器电子琴 编辑:程序博客网 时间:2024/05/02 18:16

概述

UltraIot开发板LED开发板上有三个用户LED指示灯,这三个指示灯所使用的IO口与IT的评估板有所不同,所以需要根据UltraIot开发板底板的原理图来修改IO口。
UltraIot开发板LED原理图如下所示:
这里写图片描述
有图可以得到:
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控制逻辑。

阅读全文
1 0
原创粉丝点击