Zigbee 之SerialApp HalDriverInit()

 // Initialze HAL drivers

  HalDriverInit();

1、

/**************************************************************************************************
 * @fn      Hal_DriverInit
 *
 * @brief   Initialize HW - These need to be initialized before anyone.
 *
 * @param   task_id - Hal TaskId
 *
 * @return  None
 **************************************************************************************************/
void HalDriverInit (void)
{
  /* TIMER */
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
  #error "The hal timer driver module is removed."
#endif

  /* ADC */
#if (defined HAL_ADC) && (HAL_ADC == TRUE)
  HalAdcInit();
#endif

  /* DMA */
#if (defined HAL_DMA) && (HAL_DMA == TRUE)
  // Must be called before the init call to any module that uses DMA.
  HalDmaInit();
#endif

  /* AES */
#if (defined HAL_AES) && (HAL_AES == TRUE)
  HalAesInit();
#endif

  /* LCD */
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
  HalLcdInit();
#endif

  /* LED */
#if (defined HAL_LED) && (HAL_LED == TRUE)
  HalLedInit();
#endif

  /* UART */
#if (defined HAL_UART) && (HAL_UART == TRUE)
  HalUARTInit();
#endif

  /* KEY */
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
  HalKeyInit();
#endif

  /* SPI */
#if (defined HAL_SPI) && (HAL_SPI == TRUE)
  HalSpiInit();
#endif

  /* HID */
#if (defined HAL_HID) && (HAL_HID == TRUE)
  usbHidInit();
#endif
}
2、

HalAdcInit();
void HalAdcInit (void)
{
#if (HAL_ADC == TRUE)
  adcRef = HAL_ADC_REF_VOLT;
#endif
}

#if (HAL_ADC == TRUE)
static uint8 adcRef;
#endif

#define HAL_ADC_REF_VOLT    HAL_ADC_REF_AVDD

#define HAL_ADC_REF_AVDD          0x80    /* AVDD_SOC Pin Reference */


2、

/* LED control structure */
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;


typedef struct
{
  HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS];
  uint8           sleepActive;
} HalLedStatus_t;

/***************************************************************************************************
 * @fn      HalLedInit
 *
 * @brief   Initialize LED Service
 *
 * @param   init - pointer to void that contains the initialized value
 *
 * @return  None
 ***************************************************************************************************/

void HalLedInit (void)
{
#if (HAL_LED == TRUE)
  /* Initialize all LEDs to OFF */
  HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF);
#endif /* HAL_LED */
#ifdef BLINK_LEDS
  /* Initialize sleepActive to FALSE */
  HalLedStatusControl.sleepActive = FALSE;
#endif
}


#ifdef BLINK_LEDS
  static HalLedStatus_t HalLedStatusControl;
#endif


/***************************************************************************************************
 * @fn      HalLedSet
 *
 * @brief   Tun ON/OFF/TOGGLE given LEDs
 *
 * @param   led - bit mask value of leds to be turned ON/OFF/TOGGLE
 *          mode - BLINK, FLASH, TOGGLE, ON, OFF
 * @return  None
 ***************************************************************************************************/

uint8 HalLedSet (uint8 leds, uint8 mode)
{


#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
  uint8 led;
  HlaLedControl_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://状态反转模式即  亮变灭,灭变亮。  #define HAL_LED_MODE_TOGGLE  0x08


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


      while (leds)//依次判断LED1...LED4是否要进行操作
      {
        if (leds & led)//
        {
          if (mode != HAL_LED_MODE_TOGGLE)
          {
            sts->mode = mode;  /* ON or OFF */ //如果不是反转模式,讲mode传入到sts中保存
          }
          else//若是反转模式,与点亮模式异或后存入
          {
            sts->mode ^= HAL_LED_MODE_ON;  /* Toggle */
          }
          HalLedOnOff (led, sts->mode);//根据此模式来设置led灯的状态,该函数的作用是设置亮灭
          leds ^= led;//取消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 );


}

// LED控制结构体 
//已有人这么分析了!!
typedef struct { 
uint8 mode; /*操作模式 */ 
uint8 todo; /*剩余的闪烁周期数 */ 
uint8 onPct; /* 周期中所占的比例 */ 
uint16 time; /* 开关周期时间(msec) */ 
uint32 next; /* 下次改变的时间 */ 
} HalLedControl_t; 
switch (mode) 

case HAL_LED_MODE_BLINK: 
HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME); 
//LED设置的一些默认参数【hal_led.h】 
#define HAL_LED_DEFAULT_MAX_LEDS 4 
#define HAL_LED_DEFAULT_DUTY_CYCLE 5 
#define HAL_LED_DEFAULT_FLASH_COUNT 50 
#define HAL_LED_DEFAULT_FLASH_TIME 1000 
//LED闪烁函数【hal_led.c】 
void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period) 

#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) 
//同样先判断是否启用了LED并且使用LED闪烁功能 
uint8 led; 
HalLedControl_t *sts; 
if (leds && percent && period) 
//判断参数的有效性,percent参数指明一个周期中LED将开启的时间 

if (percent < 100) 
//如果一个周期中开启时间小于100% 

led = HAL_LED_1; 
leds &= HAL_LED_ALL; 
//屏蔽掉不想要操作的LED 
sts = HalLedStatusControl.HalLedControlTable; 
//HalLedStatusControl是事先定义好的一个结构体 
typedef struct 



HalLedControl_t HalLedControlTable【HAL_LED_DEFAULT_MAX_LEDS】; 

uint8 sleepActive; 

} HalLedStatus_t; 

#define HAL_LED_DEFAULT_MAX_LEDS 4 

#ifdef BLINK_LEDS 
static HalLedStatus_t HalLedStatusControl; 
#endif 


while (leds) 
//这个循环主要是对传进来的每一个LED进行独立的设置,比如传进来的是需要设置LED1和LED2,那么此循环会先设置LED1然后再设置LED2 

if (leds & led) 
//检测当前LED是否是需要设置的 

preBlinkState |= (led & HalLedState); 
//储存目前的额LED状态 
//static uint8 preBlinkState; 
sts->mode = HAL_LED_MODE_OFF; /*关闭先前的模式 */ 
sts->time = period; /* Time for one on/off cycle */ 
sts->onPct = percent; /* % of cycle LED is on */ 
sts->todo = numBlinks; /* Number of blink cycles */ 
if (!numBlinks) sts->mode |= HAL_LED_MODE_FLASH; 
//如果规定的次数未达到则继续闪烁 
sts->next = osal_GetSystemClock(); /* Start now */ 
//读取当前系统时钟【OSAL_Timers.c】 
uint32 osal_GetSystemClock( void ) 

return ( osal_systemClock ); 

//static uint32 osal_systemClock; 
//这样看来第一次运行的时候osal_systemClock=0,系统中应该启动了定时器,用来记录系统运行时间。 
sts->mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ 
leds ^= led; 
//屏蔽掉已设置好的这个LED 

led <<= 1; 
//检测下一个LED 
sts++; 
}//真的是高手才能写出的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值