ZigBee学习笔记_InitBoard()_1

本文详细介绍了ZigBee设备的InitBoard()函数,主要涉及LED的初始化和控制。在InitBoard()中,对输入参数进行处理并调用HalLedSet()关闭所有LED。HalLedSet()和HalLedBlink()函数协同工作,根据不同的条件控制LED的状态。此外,还讨论了HalLedOnOff()函数及其在不同模式下的行为。ChkRest()函数则进行了低压复位检测。文章在理解代码逻辑的同时,提出了对某些实现细节的疑问。
摘要由CSDN通过智能技术生成

InitBoard()看注释上说是初始化板子上的I/O资源,进入到该函数实现体中,

void InitBoard( byte level )
{
  if ( level == OB_COLD )
  {
    // Interrupts off
    osal_int_disable( INTS_ALL );
    // Turn all LEDs off
    HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );
    // Check for Brown-Out reset
    ChkReset();
  }
  else  // !OB_COLD
  {
#ifdef ZTOOL_PORT
    MT_SysResetInd();
#endif

     /* Initialize Key stuff */
    OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;
    HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
  }
}

从主函数中传递进来的是OB_COLD,该值为0,进来之后又是关闭中断,(貌似前面也没有打开过),之后进入HalLedSet()函数中,关闭所有LEDs,进入该函数中,

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 time, D% duty cycle */
      HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
      break;

    case HAL_LED_MODE_FLASH:
      /* Default flash, N times, D% duty cycle */
      HalLedBlink (leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
      break;

    case HAL_LED_MODE_ON:
    case HAL_LED_MODE_OFF:
    case HAL_LED_MODE_TOGGLE:

      led = HAL_LED_1;
      leds &= HAL_LED_ALL;
      sts = HalLedStatusControl.HalLedControlTable;

      while (leds)
      {
        if (leds & led)
        {
          if (mode != HAL_LED_MODE_TOGGLE)
          {
            sts->mode = mode;  /* ON or OFF */
          }
          else
          {
            sts->mode ^= HAL_LED_MODE_ON;  /* Toggle */
          }
          HalLedOnOff (led, sts->mode);
          leds ^= led;
        }
        led <<= 1;
        sts++;
      }
      break;

    default:
      break;
  }

#elif (HAL_LED == TRUE)
  LedOnOff(leds, mode);
#else
  // HAL LED is disabled, suppress unused argument warnings
  (void) leds;
  (void) mode;
#endif /* BLINK_LEDS && HAL_LED   */

  return ( HalLedState );

}

首先是两个宏定义判断BLINK_LEDS以及HAL_LED,用于判断板子是否有LED资源,是否使能闪烁功能,可以找到定义处两个条件都符合,而后是一个HalLedControl_t结构体变量,查看该结构体定义

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;

用该结构体来控制LED资源,了解一下就行,接下来就是对mode的判断有5的宏定义

/* Modes
这是一个函数 `osalInitTasks`,用于初始化任务。函数中的代码逐个初始化不同的任务,并分配任务ID。以下是代码的解析: 1. `tasksEvents` 是一个指向 `uint16` 类型数组的指针,用于存储任务事件。通过调用 `osal_mem_alloc` 函数动态分配内存空间,并将其初始化为0。`sizeof( uint16 ) * tasksCnt` 表示需要分配的内存空间大小,`osal_memset` 函数用于将分配的内存空间初始化为0。 2. `macTaskInit` 函数用于初始化 MAC 任务,`taskID++` 表示当前任务的 ID,然后自增。 3. `nwk_init` 函数用于初始化网络任务,同样通过 `taskID++` 分配任务 ID。 4. `Hal_Init` 函数用于初始化硬件抽象层任务,同样通过 `taskID++` 分配任务 ID。 5. 如果定义了 `MT_TASK`,则调用 `MT_TaskInit` 函数初始化 MT 任务,并分配任务 ID。 6. `APS_Init` 函数用于初始化 APS 任务,同样通过 `taskID++` 分配任务 ID。 7. 如果定义了 `ZIGBEE_FRAGMENTATION`,则调用 `APSF_Init` 函数初始化 APSF 任务,并分配任务 ID。 8. `ZDApp_Init` 函数用于初始化 ZDApp 任务,同样通过 `taskID++` 分配任务 ID。 9. 如果定义了 `ZIGBEE_FREQ_AGILITY` 或者 `ZIGBEE_PANID_CONFLICT`,则调用 `ZDNwkMgr_Init` 函数初始化 ZDNwkMgr 任务,并分配任务 ID。 10. 最后调用 `SampleApp_Init` 函数初始化 SampleApp 任务,不再分配任务 ID。 这样,通过调用 `osalInitTasks` 函数可以完成对所有任务的初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值