51uwb.cn

标题: CC2530 修改按键驱动后 偶尔出现LED闪烁无法启动 [打印本页]

作者: admin    时间: 2017-11-19 15:08
标题: CC2530 修改按键驱动后 偶尔出现LED闪烁无法启动
现象描述: 上午测试两个模块+两个底板正常,下午修改按键驱动后,突然有个模块+底板出现偶尔LED1 闪烁无法启动

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

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

  4.   if (HAL_PUSH_BUTTON1())
  5.   {
  6.     keys |= HAL_KEY_SW_6;
  7.   }

  8.   if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT))  /* Key is active low */
  9.   {
  10.     keys |= halGetJoyKeyInput();
  11.   }

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



作者: 范文芳    时间: 2022-4-8 19:42
有问题打赛
作者: 范文芳    时间: 2022-4-8 19:43

0

主题       
3

帖子       
8

积分
新手上路

Rank: 1


积分8
沙发
发表于 48 秒前 | 只看该作者
有问题打赛




欢迎光临 51uwb.cn (http://51uwb.cn/) Powered by Discuz! X3.3