08 在ZStack里的led灯控制

在ZStack里已经在hal层里把led的功能封装起来了.

在工程的HAL目录
	   include子目录
		   hal_led.h头文件里:

//下面的宏表示第几个led灯, 逻辑上的表示,与具体硬件并没有直接的关系
#define HAL_LED_1     0x01
#define HAL_LED_2     0x02
#define HAL_LED_3     0x04
#define HAL_LED_4     0x08
#define HAL_LED_ALL   (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4)

//下面的宏表示led灯的工作状态
#define HAL_LED_MODE_OFF     0x00
#define HAL_LED_MODE_ON      0x01
#define HAL_LED_MODE_BLINK   0x02   //可定时,限定次数的闪烁
#define HAL_LED_MODE_FLASH   0x04   //闪烁50次
#define HAL_LED_MODE_TOGGLE  0x08   //就亮变灭,灭变亮


extern void HalLedInit( void ); //led的IO口初始化函数
extern uint8 HalLedSet( uint8 led, uint8 mode ); //设置led灯的工作状态
extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time );  //设置led灯的闪烁, cnt表示闪的次数, duty表示亮的时间(占空比), time表示间隔时间(频率)


/
同时需要注意,在ZStack的众多代码里也有控制led灯的代码,可能会对我们造成影响.
可以在菜单"Edit" --> “Find and Replace” --> "Find in Files"弹出的界面里输入要查找的关键字, 如要查找出现"HAL_LED_1"的源码:
这里写图片描述
//选上"Match regular expression"可以模糊查找

通过上面的方法,可以找出MT_UTIL.c, ZDApp.c里有控制led灯的代码.
在工程的配置里可以去除MT的功能即可以让其对led灯不进行控制,如图下:
这里写图片描述

在MT字符开头的项前加’x’符号. 不加’x’符号相当于在源码里"#define MT_TASK", 加了’x’符号则表示不定义相关的宏,相应的功能就不会编译进系统。

同时也需要注意下,烧录器对LED d3 也有影响.
这里写图片描述

//led灯的调用过程//
控制led灯只需调用hal_led.h里提供的函数就可以了, 如:

HalLedSet(HAL_LED_3, HAL_LED_MODE_ON); //但灯是不会亮的,因现用的开发板与TI原开发板的led控制电平不同,原TI是高电平时灯亮的,现开发板是低电平.

uint8 HalLedSet (uint8 leds, uint8 mode)
{
	...
  switch (mode)
  {
	...
    case HAL_LED_MODE_ON:
    case HAL_LED_MODE_OFF:
    case HAL_LED_MODE_TOGGLE:
		...
          HalLedOnOff (led, sts->mode); //这里控制led灯
		...
    default:
      break;
  }
}

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();
    }
  }
}
//上面都写好4个led灯的控制了, 灯亮调用HAL_TURN_ON_LEDn(), 灯灭调用HAL_TURN_OFF_LEDn()
  #define st(x)      do { x } while (__LINE__ == -1)

  #define HAL_TURN_OFF_LED1()       st( LED1_SBIT = LED1_POLARITY (0); )  //就是控制LED灯的IO口电平,让灯亮起来
  #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() //注意第4个LED就是第1个LED

  #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()

  #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;} )
  #define HAL_TOGGLE_LED4()         HAL_TOGGLE_LED1()
//
//再进一步查看led的定义
#define BV(n)      (1 << (n))
#define ACTIVE_LOW        !
#define ACTIVE_HIGH       !!

#define LED1_BV           BV(0)  //表示LED1占用P1里的第0位IO口
#define LED1_SBIT         P1_0   //LED1的IO口
#define LED1_DDR          P1DIR  //LED1的IO口的电平控制寄存器
#define LED1_POLARITY     ACTIVE_HIGH //什么电平有效, 这里是高,我们需要根据现开发板来改

#if defined (HAL_BOARD_CC2530EB_REV17)
  /* 2 - Red */
  #define LED2_BV           BV(1)
  #define LED2_SBIT         P1_1
  #define LED2_DDR          P1DIR
  #define LED2_POLARITY     ACTIVE_HIGH

  /* 3 - Yellow */
  #define LED3_BV           BV(4)
  #define LED3_SBIT         P1_4
  #define LED3_DDR          P1DIR
  #define LED3_POLARITY     ACTIVE_HIGH
#endif

//
修改led灯的定义:

#define LED1_POLARITY     ACTIVE_LOW
#define LED2_POLARITY     ACTIVE_LOW
#define LED3_POLARITY     ACTIVE_LOW

在MyApp任务的初始化函数里对led灯的控制:

#include "hal_led.h"

void MyApp_Init(uint8 task_id )
{
   mytask_id = task_id; 

   HalLedSet(HAL_LED_ALL, HAL_LED_MODE_ON); //让led1, led2, led3灯亮,注意接着烧录器led3不会亮
   
   //HalLedSet(HAL_LED_ALL, HAL_LED_MODE_FLASH); // leds闪烁50次
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值