ZigBee学习之25InitBoardWord文件下载.docx
《ZigBee学习之25InitBoardWord文件下载.docx》由会员分享,可在线阅读,更多相关《ZigBee学习之25InitBoardWord文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
![ZigBee学习之25InitBoardWord文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/b08c8219-f77c-4b81-baf7-69a5db1df890/b08c8219-f77c-4b81-baf7-69a5db1df8901.gif)
//#defineHAL_LED_MODE_OFF0x00
//#defineHAL_LED_MODE_ON0x01
//#defineHAL_LED_MODE_BLINK0x02
//#defineHAL_LED_MODE_FLASH0x04
//#defineHAL_LED_MODE_TOGGLE0x08
//LED设置函数【hal_led.c】
uint8HalLedSet(uint8leds,uint8mode)
#if(defined(BLINK_LEDS))&
&
(HAL_LED==TRUE)
//前提条件是定义了闪烁LED和LED硬件驱动服务使能;
//HAL_LED定义在【hal_board_cfg.h】
#ifndefHAL_LED
#defineHAL_LEDTRUE
//当设为FALSE时就不使用LED
#endif
#if(!
definedBLINK_LEDS)&
#defineBLINK_LEDS
uint8led;
HalLedControl_t*sts;
//LED控制结构体
typedefstruct{
uint8mode;
/*操作模式*/
uint8todo;
/*剩余的闪烁周期数*/
uint8onPct;
/*周期中所占的比例*/
uint16time;
/*开关周期时间(msec)*/
uint32next;
/*下次改变的时间*/
}HalLedControl_t;
switch(mode)
caseHAL_LED_MODE_BLINK:
HalLedBlink(leds,1,HAL_LED_DEFAULT_DUTY_CYCLE,HAL_LED_DEFAULT_FLASH_TIME);
//LED设置的一些默认参数【hal_led.h】
#defineHAL_LED_DEFAULT_MAX_LEDS4
#defineHAL_LED_DEFAULT_DUTY_CYCLE5
#defineHAL_LED_DEFAULT_FLASH_COUNT50
#defineHAL_LED_DEFAULT_FLASH_TIME1000
//LED闪烁函数【hal_led.c】
voidHalLedBlink(uint8leds,uint8numBlinks,uint8percent,uint16period)
//同样先判断是否启用了LED并且使用LED闪烁功能
if(leds&
percent&
period)
//判断参数的有效性,percent参数指明一个周期中LED将开启的时间
if(percent<
100)
//如果一个周期中开启时间小于100%
led=HAL_LED_1;
leds&
=HAL_LED_ALL;
//屏蔽掉不想要操作的LED
sts=HalLedStatusControl.HalLedControlTable;
//HalLedStatusControl是事先定义好的一个结构体
typedefstruct
HalLedControl_tHalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS];
uint8sleepActive;
}HalLedStatus_t;
#ifdefBLINK_LEDS
staticHalLedStatus_tHalLedStatusControl;
while(leds)
//这个循环主要是对传进来的每一个LED进行独立的设置,比如传进来的是需要设置LED1和LED2,那么此循环会先设置LED1然后再设置LED2
led)
//检测当前LED是否是需要设置的
preBlinkState|=(led&
HalLedState);
//储存目前的额LED状态
//staticuint8preBlinkState;
sts->
mode=HAL_LED_MODE_OFF;
/*关闭先前的模式*/
time=period;
/*Timeforoneon/offcycle*/
onPct=percent;
/*%ofcycleLEDison*/
todo=numBlinks;
/*Numberofblinkcycles*/
if(!
numBlinks)sts->
mode|=HAL_LED_MODE_FLASH;
//如果规定的次数未达到则继续闪烁
next=osal_GetSystemClock();
/*Startnow*/
//读取当前系统时钟【OSAL_Timers.c】
uint32osal_GetSystemClock(void)
return(osal_systemClock);
}
//staticuint32osal_systemClock;
//这样看来第一次运行的时候osal_systemClock=0,系统中应该启动了定时器,用来记录系统运行时间。
mode|=HAL_LED_MODE_BLINK;
/*Enableblinking*/
leds^=led;
//屏蔽掉已设置好的这个LED
led<
<
=1;
//检测下一个LED
sts++;
}//真的是高手才能写出的函数啊!
自叹,C语言编程能力还差的远啊
osal_set_event(Hal_TaskID,HAL_LED_BLINK_EVENT);
//【hal_drivers.h】
//#defineHAL_LED_BLINK_EVENT0x0002
//externuint8Hal_TaskID;
//此函数为用户设置任务标志【OSAL.c】
//第一个参数是任务ID,第二个参数是要设置的事件
byteosal_set_event(bytetask_id,UINT16event_flag)
if(task_id<
tasksCnt)
//【sapi.c】
constpTaskEventHandlerFntasksArr[]={
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#ifdefined(MT_TASK)
MT_ProcessEvent,
APS_event_loop,
ZDApp_event_loop,
SAPI_ProcessEvent
};
//【OSAL_Tasks.h】
//事件处理函数原型:
typedefunsignedshort(*pTaskEventHandlerFn)(unsignedchartask_id,unsignedshortevent);
//定义事件处理函数的函数指针类型
//tasksArr中任务事件循环中的顺序必须和osalInitTask中任务的初始化顺序一致
constuint8tasksCnt=sizeof(tasksArr)/sizeof(tasksArr[0]);
//得到任务数
//只有当任务ID小于总任务数时才继续执行,也就是说只有当此为有效任务才执行。
halIntState_tintState;
//【hal_mcu.h】其实就是一个无符号字符类型
//typedefunsignedcharhalIntState_t;
HAL_ENTER_CRITICAL_SECTION(intState);
//维持全局中断状态
//【hal_mcu.h】
#defineHAL_ENTER_CRITICAL_SECTION(x)st(x=EA;
HAL_DISABLE_INTERRUPTS();
)
//保存当前全局中断状态,然后关闭全局中断
#defineHAL_EXIT_CRITICAL_SECTION(x)st(EA=x;
#defineHAL_CRITICAL_STATEMENT(x)st(halIntState_ts;
HAL_ENTER_CRITICAL_SECTION(s);
x;
HAL_EXIT_CRITICAL_SECTION(s);
tasksEvents[task_id]|=event_flag;
//Stufftheeventbit(s)
//uint16*tasksEvents;
HAL_EXIT_CRITICAL_SECTION(intState);
//Releaseinterrupts
else
return(INVALID_TASK);
//如果任务ID超出返回则返回任务无效
//返回值类型定义在【ZComDef.h】
//#defineINVALID_TASK1
return(ZSUCCESS);
Else
//如果点亮时间百分比超过100%也就相当于常亮了,就执行LED常亮的设置
HalLedSet(leds,HAL_LED_MODE_ON);
//【hal_led.c】
//一样的前提是开始了LED硬件驱动服务
//检测要切换的LED模式
HalLedBlink(leds,1,HAL_LED_DEFAULT_DUTY_CYCLE,