OSAL中LED灯工作方式简介


  
        /*  关于LED灯的使用,如果需要使用LED的闪烁功能,则需要用到两个比较重要的结构体,
            若不需要则可不定义
        */
        typedef struct {
            uint8 mode;                                 /*  LED的操作模式                               */
            uint8 left;                                 /*  打开和关闭LED的次数                         */
            uint8 onPct;                                /*  ON状态的占空比                              */
            uint16 time;                                /*  完成打开和关闭一次的时间                    */
            uint32 next;                                /*  离下一次状态改变的时间                      */
        } HalLedControl_t;

        typedef struct
        {
            HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS];
            uint8           sleepActive;                /*  LED的是进入睡眠状态                         */
        } HalLedStatus_t;       
                
        #ifdef BLINK_LEDS
        static HalLedStatus_t HalLedStatusControl;
        #endif

        
        /*  首先系统初始化时会初始化                    */
        HalLedInit();			                        /*  设置GPIO口的工作方式,并把所有的灯设置为OFF */
            -> HalLedSet();                             /*  初始化时调用该函数设置所有LED灯OFF          */
                -> HalLedOnOff();                       /*  最终是该函数设置所有LED灯OFF                */
                
        /*  当用户使用控制LED灯时调用下面函数           */ 
        HalLedSet();                                    /*  若用户只是单纯的打开关闭LED灯,直接在调用HalLedOnOff()操作  */        
            -> HalLedOnOff();                           /*  最终是该函数设置所有LED灯OFF                */
                
        HalLedSet();                                    /*  若用户需要开启灯闪烁                        */
            -> HalLedBlink();                           /*  填充上面说的结构体                          */        
                -> osal_set_event();                    /*  发送 HAL_LED_BLINK_EVENT 事件               */ 
                
        Hal_ProcessEvent();                             /*  事件发送之后,系统会调用该函数              */
            -> HalLedUpdate();                          /*  根据结构体更新LED的状态,                   */
                ->osal_start_timerEx();                 /*  在最小的next之后发送HAL_LED_BLINK_EVENT事件 */
                       ......
                         
        Hal_ProcessEvent();                             /*  然后就一直循环,直到闪烁的次数完成          */   

        在LED的控制中,有两个变量是很重要的,大家需要注意

        static uint8 HalLedState;              // LED state at last set/clr/blink update

        static uint8 preBlinkState;            // Original State before going to blink mode
                                                                  // bit 0, 1, 2, 3 represent led 0, 1, 2, 3

以下是一个基于CC2530的点对点控制LED闪烁的示例代码: ```c #include "ZComDef.h" #include "ZComDef.h" #include "OSAL.h" #include "OSAL_Tasks.h" #include "ZGlobals.h" #include "AF.h" #include "APS.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include "OnBoard.h" #include "hal_led.h" #define LED_BLINK_TIME 500 const cId_t myCluster = 0x0001; // 自定义cluster ID uint8 myEndpoint = 1; // 自定义endpoint // 处理来自其它节点的消息 void processMsg(afIncomingMSGPacket_t *msg) { if (msg->clusterId == myCluster) { if (msg->cmd == 0x01) { HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); // 开 osal_start_timerEx(myTaskID, 1, LED_BLINK_TIME); // 定时关闭 } } } // 处理定时器事件 uint16 myEventLoop(uint8 taskID, uint16 events) { if (events & 1) { HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); // 关 } return 0; } // 初始化节点 void myAppInit(void) { HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); // 关 } // 应用程序入口 void myAppTask(uint8 taskId) { myTaskID = taskId; afRegister(myEndpoint, &processMsg); // 注册消息处理函数 while (TRUE) { osal_start_timerEx(taskId, 0, 1000); // 定时发送消息 afAddrType_t dstAddr; dstAddr.addr.shortAddr = 0x0002; // 目标节点短地址 dstAddr.addrMode = afAddr16Bit; dstAddr.endPoint = myEndpoint; uint8 buf[1]; buf[0] = 0x01; // 发送命令 AF_DataRequest(&dstAddr, &myAppID, myCluster, 1, buf, &mySeqNum, AF_ACK_REQUEST, AF_DEFAULT_RADIUS); osal_start_timerEx(taskId, 2, 5000); // 暂停5秒 } } // 应用程序入口函数 void myAppMain(void) { myAppID = afGetMyAppId(); mySeqNum = 0; myAppInit(); osal_start_system(); } ``` 以上代码实现了一个简单的点对点通信,节点1每隔1秒向节点2发送一个命令,命令内容为0x01,节点2收到命令后控制LED闪烁。请注意,这只是一个示例代码,实际应用还需要考虑异常处理、数据校验等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值