产品有五个LED,并且都需独立控制,包括亮灭,不同次数的闪烁。LED的驱动实在太过精妙复杂,研究了很长时间不得要领。
BLE协议栈定义了四个,我照着添加了一个,但是没有用,以下是修改的地方:
void HalLedInit (void)
{
….
LED5_DDR |= LED5_BV;
…
}
void HalLedOnOff (uint8 leds, uint8 mode)
{
…
if (leds & HAL_LED_5)
{
if (mode == HAL_LED_MODE_ON)
{
HAL_TURN_ON_LED5();
}
else
{
HAL_TURN_OFF_LED5();
}
}
…
}
头文件中:
#define LED5_BV BV(1)
#define LED5_SBIT P1_1
#define LED5_DDR P1DIR
#define LED5_POLARITY ACTIVE_LOW
#define HAL_LED_5 0x10
#define HAL_LED_ALL (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4 | HAL_LED_5)
还有一些开关宏如#define HAL_TURN_ON_LED5() st( LED5_SBIT = LED5_POLARITY (1); )都添加了
调试发现新添加的LED不起作用,比如调用HalLedBlink(HAL_LED_5,3,50,1000); HAL_LED_5的值没有传递到HalLedOnOff();而前4个LED都正常。
求道友指点,还有什么地方遗漏了
Light J:
也曾想过在应用层自己进行控制,但由于五个LED相互独立,情况复杂,要么事件数量暴增,要么在同一事件中通过较短的时基和标志位进行管理,但这样功耗又难以控制,还是希望能够将LED的工作放在hal任务中。
Yu-tsun Chen:
/* Defaults */#define HAL_LED_DEFAULT_MAX_LEDS 4
這有改成 5 嗎?
Light J:
回复 Yu-tsun Chen:
谢谢回复,确实是这个原因,申请的结构体空间不够,控制LED_5时匿名访问了栈空间的某个不为0的值,条件不满足导致无法执行开关宏。