|
现象描述: 上午测试两个模块+两个底板正常,下午修改按键驱动后,突然有个模块+底板出现偶尔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
复制代码
|
|