Z-STACK之cc2530LED驱动详解

这篇博客详细解析了Z-STACK协议栈中cc2530的LED驱动代码,从hal_led.h头文件的宏定义到hal_led.c的实现。内容涵盖LED模式、控制结构体、驱动函数如HalLedSet的运作原理,展示了如何利用Z-STACK驱动LED进行亮灭、闪烁等操作,并提到了HalLedEnterSleep和HalLedExitSleep在系统睡眠时的角色。
摘要由CSDN通过智能技术生成

                                               Z-STACK 之LED驱动详解
     最近一段时间学习ZigBee,用的TI公司的cc2530,协议栈是z-stack,为了深入了解整个Z-stack,我从底层的驱动代码开始看起,首先是LED驱动。虽然是简单的LED亮灭,但是z-stack中的LED驱动却写的非常好,在这给我们提供了很好的写驱动的思路。

         首先看一下hal_led.h头文件中的一些宏定义,其中定义了四个LED,分别是HAL_LED_1,HAL_LED_2,HAL_LED_3,HAL_LED_4,分别对应板子上的Green,Red,Yellow,Blue四个LED,然后定义了五种LED模式,HAL_LED_MODE_OFF,灯灭,HAL_LED_MODE_ON,灯亮,HAL_LED_MODE_BLINK,灯闪烁,HAL_LED_MODE_FLASH,灯闪亮,在这里,当调用HalLedSet (uint8 leds, uint8 mode)这个函数就会看到HAL_LED_MODE_BLINK和HAL_LED_MODE_FLASH的区别。HAL_LED_MODE_TOGGLE,灯状态切换。还定义了LED的一些默认参数,HAL_LED_DEFAULT_MAX_LEDS,LED最大个数为4个,HAL_LED_DEFAULT_DUTY_CYCLE,LED闪烁的默认亮灭的占空比,HAL_LED_DEFAULT_FLASH_COUNT,默认的闪烁次数,HAL_LED_DEFAULT_FLASH_TIME,默认的闪烁一次的时间为1000,这个是相对osal_systemClock这个系统tick的,具体单位时间是多少还要看用于tick的定时器,先不管,以后再分析。

          再看hal_led.c这个源文件,其中定义了HalLedControl_t的结构体,这个结构体主要是对led控制的一些参数,

typedef struct {
  uint8 mode;       /* Operation mode */
  uint8 todo;       /* Blink cycles left */
  uint8 onPct;      /* On cycle percentage */
  uint16 time;      /* On/off cycle time (msec) */
  uint32 next;      /* Time for next change */
} HalLedControl_t;

看这个结构体,mode为led的操作模式,就是头文件中定义的那5种mode,todo即为LED剩余闪烁的次数,onPct为LED闪烁的亮的时间所占的比例,time即为LED每一次闪烁的时间,next为LED作出下一次转变的时间,其单位是相对于系统的tick即osal_systemClock这个系统变量。然后定义了HalLedStatus_t这个结构体,其中HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS]是对四个LED的控制情况的数组,sleepActive是指在系统睡眠时候是否启用LED,如果是则为true,否则为false。接下来看HalLedState这个全局变量记录的是LED上次更新时候的状态,通过后面的代码,我的理解是HalLedState的低四位分别表示四个LED,如果某一位为1,则它上次的状态为ON,否则为OFF。HalSleepLedState这个全局变量主要是记录了系统进入睡眠模式之前的四个LED的状态。preBlinkState这个全局变量记录了LED在进入闪烁模式之前的状态。然后定义了这个HalLedStatus_t结构体的全局变量HalLedStatusControl记录四个LED的控制状态。

       HalLedInit这个函数式LED的初始化,调用HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF)将四个LED置OFF,然后HalLedStatusControl.sleepActive = FALSE即在睡眠状态下不启用LED;下面看下HalLedSet这个驱动函数:

uint8 HalLedSet (uint8 leds, uint8 mode)
{

#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
  uint8 led;
  HalLedControl_t *sts;

  switch (mode)
  {
    case HAL_LED_MODE_BLINK:
      /* Default blink, 1 ti

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值