ZStack-CC2530-2.3.0-1.4.0中simpleApp函数中led的驱动

来源:互联网 发布:hoya镜片怎么样知乎 编辑:程序博客网 时间:2024/05/18 02:16

led驱动的编写。首先打开主函数int main( void ),找到  HalDriverInit();这个函数是硬件驱动初始化函数,我们打开源代码:


void HalDriverInit (void)
{
 
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
  HalTimerInit();
#endif

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

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

 
#if (defined HAL_FLASH) && (HAL_FLASH == TRUE)
  // Must be called before the init call to any module that uses Flash access or NV.
  HalFlashInit();
#endif

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

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

 
#if (defined HAL_LED) && (HAL_LED == TRUE)
  HalLedInit();//好,我们进入此函数中查看如何初始化LED灯。
#endif

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

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

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

 
#if (defined HAL_HID) && (HAL_HID == TRUE)
  usbHidInit();
#endif
}

 

进入到HalLedInit()中:

void HalLedInit (void)
{
#if (HAL_LED == TRUE)//经查看,在hal_board_cfg文件中确实宏定义了  HAL_LED==TRUE
   HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF);//即在初始化工作中关闭所有的LED灯,在这里出现了一个非常重要的函数,即HalLedSet函数。此函数其实就是LED的驱动函数,后面应用层调用的也是此函数。我们查看其源代码进行详细的解析。
#endif
#ifdef BLINK_LEDS
  HalLedStatusControl.sleepActive = FALSE;
#endif
}

 

 

我们可以在hal_led.c文件中找到该函数的定义

 

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://闪烁模式
     
      HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
      break;

    case HAL_LED_MODE_FLASH://周期性闪烁模式
     
      HalLedBlink (leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
      break;

    case HAL_LED_MODE_ON://点亮模式   #define HAL_LED_MODE_ON      0x01
    case HAL_LED_MODE_OFF://关闭模式  #define HAL_LED_MODE_OFF     0x00
    case HAL_LED_MODE_TOGGLE://状态反转模式即  亮变灭,灭变亮。  #define HAL_LED_MODE_TOGGLE  0x08

      led = HAL_LED_1;//        #define HAL_LED_1     0x01
      leds &= HAL_LED_ALL;//#define HAL_LED_ALL   (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4)
      sts = HalLedStatusControl.HalLedControlTable;

      while (leds)//进入到循环中
      {
        if (leds & led)//第一次先判断LED_1要不要操作,接下来在循环中会左移led,来判断其他的灯
        {
          if (mode != HAL_LED_MODE_TOGGLE)//如果不是反转模式,讲mode传入到sts中保存
          {
            sts->mode = mode;  
          }
          else//若是反转模式,与点亮模式异或后存入
          {
            sts->mode ^= HAL_LED_MODE_ON;  //sts->mode存放的是自身的状态,原本是灭的话,异或后就亮
          }
          HalLedOnOff (led, sts->mode);//根据此模式来设置led灯的状态,该函数的作用是设置亮灭,稍后会看到源代码。
          leds ^= led;//取消leds中与led对应的置一的位,以防止到最后循环跳不出来。
        }
        led <<= 1;//将led左移一位,在第二个循环当中,led是指LED_2;
        sts++;//指向下一个LED灯
      }
      break;

    default:
      break;
  }

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

  return ( HalLedState );

}

 

 

好,我们进入到HalLedOnOff (led, sts->mode);函数中,看看到底是怎么设置LED灯的,源代码如下:

 

void HalLedOnOff (uint8 leds, uint8 mode)
{
  if (leds & HAL_LED_1)//判断是不是LED_1
  {
    if (mode == HAL_LED_MODE_ON)//如果是点亮模式,执行下面的函数
    {
      HAL_TURN_ON_LED1();
    }
    else//如果是灭的模式,执行下面函数
    {
      HAL_TURN_OFF_LED1();
    }
  }

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

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

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

   if (mode)//记住当前的状态
  {
    HalLedState |= leds;
  }
  else
  {
    HalLedState &= (leds ^ 0xFF);
  }
}

 

好,我们去看看HAL_TURN_ON_LED1();是如何点亮LED_1的,在hal_board_cfg.h中,我们可以找到如下代码:

 

  #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); )
  #define HAL_TURN_OFF_LED4()       HAL_TURN_OFF_LED1()

  #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); )
  #define HAL_TURN_ON_LED4()        HAL_TURN_ON_LED1()

 

其中st语句是AVR特色,就拿点亮LED_1来举例把,st语句的源代码是:

#define st(x)      do { x } while (__LINE__ == -1) ,这个宏定义很简单,就是X执行一次。

st( LED1_SBIT = LED1_POLARITY (1); )的意思,就是LED1_SBIT = LED1_POLARITY (1); 执行一次

#define LED1_SBIT   P1_0              LED_1 在电路板上就是接在P1_0口的

而#define LED3_POLARITY     ACTIVE_HIGH                  #define ACTIVE_HIGH       !!

那么LED1_POLARITY(1)的值就是1,   即P1_0=1,LED_1点亮。  其他的同理可得。

 

以上讲了case HAL_LED_MODE_ON://点亮模式       

        case HAL_LED_MODE_OFF://关闭模式        

        case HAL_LED_MODE_TOGGLE://状态反转模式。


0 0
原创粉丝点击