ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=31) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **相关 API 说明** 打开SampleSwitch这个工程,在hal_led.h文件中可以找到操作LED的API,文件所在位置如图所示。 ![](https://img.kancloud.cn/20/f7/20f789801615cae8ea8761bef18a7c1b_1680x1011.png =500x) ### 在这个头文件中,有3个常用的API,代码如下: ``` /* * 初始化LED */ extern void HalLedInit( void ); /* * 开关LED */ extern uint8 HalLedSet( uint8 led, uint8 mode ); /* * 闪烁LED */ extern void HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time ); ``` ### HalLedInit()的作用是初始化LED。在上一章节中,我们讲解过在hal_drivers.c文件中的驱动程序初始化函数HalDriverInit()里面调用了这个函数。 ### 在Z-Stack 3.0中,HAL默认支持了4个LED,LED的逻辑定义如下: ``` /* LEDS - The LED number is the same as the bit position */ #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) ``` ### HalLedSet( uint8 led, uint8 mode )用来设定LED的工作模式。其中的第1个参数led用于指定待设定的LED,第2个参数mode用于指定工作模式,这个工作模式有3种: (1)开启,对应的宏定义是HAL_LED_MODE_ON。 (2)关闭,对应的宏定义是HAL_LED_MODE_OFF。 (3)反转,对应的宏定义是HAL_LED_MODE_TOGGLE。 例如如果要开启第1盏LED,可以按这个方式调用: ``` HalLedSet( HAL_LED_1,//指定第1盏LED HAL_LED_MODE_ON);//开启 ``` ### HalLedBlink( uint8 leds, uint8 cnt, uint8 duty, uint16 time )的作用是让LED闪烁。其中的第1个参数leds用于指定LED,第2个参数cnt用于指定闪烁的次数,第3个参数duty用于指定LED是开启状态时的占空比,第4个参数time用于指定每次闪烁的时间周期(单位:ms)。 ### 举个例子说明一下使用方法,例如如果需要让第1盏LED闪烁10次,每次闪烁的时间周期是2000ms,而且在这2000ms中有60%的时间LED要处于开启状态,那么可以按照以下方式调用: ``` HalLedBlink( HAL_LED_1,//指定第1盏LED 10,//指定闪烁次数是10次 60,//指定60%的时间LED是处于开启状态 2000);//指定1次闪烁的时间周期是2000ms,也就是在1次闪烁周期中,LED的开启时长是1200ms,关闭时长是800ms ``` <br/> ## **LED的物理映射** 在调用LED API之前,需要配置好LED的物理映射定义。LED的物理映射定义在hal\_board\_cfg.h文件中,文件所在位置如图所示。 ![](https://img.kancloud.cn/e9/69/e969a6125d26718dd84d829ef50e3a6d_327x365.png =300x) ### 默认的LED的物理映射定义如下: ``` //LED1 #define LED1_BV BV(0) #define LED1_SBIT P1_0 #define LED1_DDR P1DIR #define LED1_POLARITY ACTIVE_HIGH #if defined (HAL_BOARD_CC2530EB_REV17) //LED2 #define LED2_BV BV(1) #define LED2_SBIT P1_1 #define LED2_DDR P1DIR #define LED2_POLARITY ACTIVE_HIGH //LED3 #define LED3_BV BV(4) #define LED3_SBIT P1_4 #define LED3_DDR P1DIR #define LED3_POLARITY ACTIVE_HIGH #ifdef ENABLE_LED4_DISABLE_S1 //LED4 #define LED4_BV BV(1) #define LED4_SBIT P0_1 #define LED4_DDR P0DIR #define LED4_POLARITY ACTIVE_HIGH #define LED4_SET_DIR() do {LED4_DDR |= LED4_BV;} while (0) #else #define LED4_SET_DIR() #endif #endif ``` 这里以LED1为例讲解一下物理映射定义的含义。 (1)其中的BV(N)表示数值1向左移动N位,等价于(1 << N),因此BV(0)的值为1<<0,也就是等于1。 >[info] <<是向左移位运算符,1<<0表示数值1向左移动0个位,移位后的值不变,仍等于1。举多一个例子,例如数值1的二进制数是0000 0001,1<<2表示把0000 0001中的所有位向左移动两位,并且在低位补0、把移出的高位丢弃,所以计算结果也就是0000 0100,对应的十进制数是3。如果读者不了解这个运算符,需要补充一下相关的知识。 (2)#define LED1_SBIT P1_0表示LED1与CC2530的P1_0连接。 (3)#define LED1_DDR P1DIR表示LED1对应的方向寄存器为P1DIR。P1DIR在前面的章节已经讲解过,这里不再讲解了。 (4)#define LED1_POLARITY ACTIVE_HIGH表示LED1是高电平驱动的,也就是给P1_0输入高电平,LED1就会被点亮。 ### 这些是协议栈的默认配置,开发者需要根据实际的硬件连接情况进行修改。例如,配套的ZigBee开发板是把LED连接到P0\_4的,因此可以把LED1的引脚修改为P0_4,修改后代码如下: ``` //LED1 #define LED1_BV BV(4) #define LED1_SBIT P0_4 #define LED1_DDR P0DIR #define LED1_POLARITY ACTIVE_HIGH ``` ### 剩下的LED2、LED3和LED4由于没有用到,因此可以暂时忽略。 <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持