admin 发表于 2017-11-19 15:08:12

CC2530 修改按键驱动后 偶尔出现LED闪烁无法启动

现象描述: 上午测试两个模块+两个底板正常,下午修改按键驱动后,突然有个模块+底板出现偶尔LED1 闪烁无法启动

解决思路:第一步考虑供电,因为电池供电考虑是否电压太低,低电压报警,换供电方式后发现问题依然存在。
               第二步在线debug,看是否板载初始化无法完成,单步执行Main函数,发现可以执行到 osal_start_system(); 然后F5以后才开始LED闪烁,说明问题应该和逻辑有关。
               第三步ZDO部分的debug,在下面的部分下载断点            
// Start the device?
if ( devState != DEV_HOLD )
{
    ZDOInitDevice( 0 );
}
else
{
    // Blink LED to indicate HOLD_START
    HalLedBlink ( HAL_LED_4, 0, 50, 500 );
}发现没有执行ZDOInitDevice( 0 ); 问题基本可以确定了,就是这个判断条件的问题,向前追DEV_HOLD,发现是在如下函数里设定的void ZDAppCheckForHoldKey( void )
{
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
// Get Keypad directly to see if a HOLD_START is needed.
// Hold down the SW_BYPASS_START key (see OnBoard.h)
// while booting to avoid starting up the device.
if ( HalKeyRead () == SW_BYPASS_START)
{
    // Change the device state to HOLD on start up
    devState = DEV_HOLD;
}
#endif // HAL_KEY
}这个的作用就是阻断正常的启动,协议栈之前有个具体使用这个的例子,好久之前看过了。在 ZDApp_Init( uint8 task_id ) 把这个函数的调用注释掉,一切就OK了。

回头看,为何修改了按键驱动就导致出现这个问题,那还需要继续看HalKeyRead ()
uint8 HalKeyRead ( void )
{
uint8 keys = 0;

if (HAL_PUSH_BUTTON1())
{
    keys |= HAL_KEY_SW_6;
}

if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT))/* Key is active low */
{
    keys |= halGetJoyKeyInput();
}

return keys;
}可以看到这里有个halGetJoyKeyInput(), 这个是摇杆模拟量读取,因为我们没有摇搞,而且我们的摇杆通路P06 是悬空的,会导致一些不稳定的因素。 终极绝招,将halGetJoyKeyInput()注释掉,一直返回0即可
#define HAL_KEY_JOY_CHN   HAL_ADC_CHANNEL_6

页: [1]
查看完整版本: CC2530 修改按键驱动后 偶尔出现LED闪烁无法启动