/* 关于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