1、/ #define HAL_LED_MODE_OFF 0x00/#define HAL_LED_MODE_ON 0x01/#define HAL_LED_MODE_BLINK 0x02/#define HAL_LED_MODE_FLASH 0x04/#define HAL_LED_MODE_TOGGLE 0x08/LED设置函数【hal_led.c】uint8 HalLedSet (uint8 leds, uint8 mode)#if (defined (BLINK_LEDS) & (HAL_LED = TRUE)/前提条件是定义了闪烁LED和LED硬件驱动服务使能;/ HAL_LED定义在【
2、hal_board_cfg.h】#ifndef HAL_LED#define HAL_LED TRUE/当设为FALSE时就不使用LED#endif#if (!defined BLINK_LEDS) define BLINK_LEDSuint8 led;HalLedControl_t *sts;/ LED控制结构体typedef struct uint8 mode; /* 操作模式 */uint8 todo; /* 剩余的闪烁周期数 */uint8 onPct; /* 周期中所占的比例 */uint16 time; /* 开关周期时间(msec) */uint32 next; /* 下次改
3、变的时间 */ HalLedControl_t;switch (mode)case HAL_LED_MODE_BLINK:HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);/LED设置的一些默认参数【hal_led.h】#define HAL_LED_DEFAULT_MAX_LEDS 4#define HAL_LED_DEFAULT_DUTY_CYCLE 5#define HAL_LED_DEFAULT_FLASH_COUNT 50#define HAL_LED_DEFAULT_FLASH
4、_TIME 1000/LED闪烁函数【hal_led.c】void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period)/同样先判断是否启用了LED并且使用LED闪烁功能if (leds & percent & period)/判断参数的有效性,percent参数指明一个周期中LED将开启的时间if (percent mode = HAL_LED_MODE_OFF; /*关闭先前的模式 */time = period; /* Time for one on/off cycle */onPct = perc
5、ent; /* % of cycle LED is on */todo = numBlinks; /* Number of blink cycles */if (!numBlinks) sts-mode |= HAL_LED_MODE_FLASH;/如果规定的次数未达到则继续闪烁next = osal_GetSystemClock(); /* Start now */ /读取当前系统时钟【OSAL_Timers.c】 uint32 osal_GetSystemClock( void )return ( osal_systemClock );/static uint32 osal_systemC
6、lock; /这样看来第一次运行的时候osal_systemClock=0,系统中应该启动了定时器,用来记录系统运行时间。mode |= HAL_LED_MODE_BLINK; /* Enable blinking */leds = led;/屏蔽掉已设置好的这个LEDled = 1;/检测下一个LEDsts+;/真的是高手才能写出的函数啊!自叹,C语言编程能力还差的远啊osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT);/【hal_drivers.h】/#define HAL_LED_BLINK_EVENT 0x0002/extern uint8
7、 Hal_TaskID;/此函数为用户设置任务标志【OSAL.c】/第一个参数是任务ID,第二个参数是要设置的事件byte osal_set_event( byte task_id, UINT16 event_flag )if ( task_id tasksCnt )/【sapi.c】const pTaskEventHandlerFn tasksArr = macEventLoop,nwk_event_loop,Hal_ProcessEvent,#if defined( MT_TASK )MT_ProcessEvent,APS_event_loop,ZDApp_event_loop,SAPI_
8、ProcessEvent;/【OSAL_Tasks.h】/事件处理函数原型:typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );/定义事件处理函数的函数指针类型/tasksArr中任务事件循环中的顺序必须和osalInitTask中任务的初始化顺序一致const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr0 );/得到任务数/只有当任务ID小于总任务数时才继续执行,也就是说只有当此为有效任务才执行
9、。halIntState_t intState;/【hal_mcu.h】其实就是一个无符号字符类型/typedef unsigned char halIntState_t;HAL_ENTER_CRITICAL_SECTION(intState); / 维持全局中断状态/【hal_mcu.h】#define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); )/保存当前全局中断状态,然后关闭全局中断#define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x;#define H
10、AL_CRITICAL_STATEMENT(x) st( halIntState_t s; HAL_ENTER_CRITICAL_SECTION(s); x; HAL_EXIT_CRITICAL_SECTION(s);tasksEventstask_id |= event_flag; / Stuff the event bit(s)/uint16 *tasksEvents;HAL_EXIT_CRITICAL_SECTION(intState); / Release interruptselsereturn ( INVALID_TASK );/如果任务ID超出返回则返回任务无效/返回值类型定义在【ZComDef.h】/#define INVALID_TASK 1return ( ZSUCCESS );Else/如果点亮时间百分比超过100%也就相当于常亮了,就执行LED常亮的设置HalLedSet (leds, HAL_LED_MODE_ON);/【hal_led.c】/一样的前提是开始了LED硬件驱动服务/检测要切换的LED模式HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1