在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次
}