ZigBee学习笔记_HAL_BOARD_INIT()

以前看大牛的学习笔记都十分有含量,感觉自己写的很苍白那,不晓得这个ZigBee能不能搞透那,发个牢骚,继续……

HAL_BOARD_INIT()看注释是初始化一些与板子相关的资源例如LED什么的,

#define HAL_BOARD_INIT()                                         \
{                                                                \
  uint16 i;                                                      \
                                                                 \
  SLEEPCMD &= ~OSC_PD;                       /* turn on 16MHz RC and 32MHz XOSC */                \
  while (!(SLEEPSTA & XOSC_STB));            /* wait for 32MHz XOSC stable */                     \
  asm("NOP");                                /* chip bug workaround */                            \
  for (i=0; i<504; i++) asm("NOP");          /* Require 63us delay for all revs */                \
  CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ); /* Select 32MHz XOSC and the source for 32K clock */ \
  while (CLKCONSTA != (CLKCONCMD_32MHZ | OSC_32KHZ)); /* Wait for the change to be effective */   \
  SLEEPCMD |= OSC_PD;                        /* turn off 16MHz RC */                              \
                                                                 \
  /* set direction for GPIO outputs  */                          \
  LED1_DDR |= LED1_BV;                                           \
                                                                 \
  /* Set PA/LNA HGM control P0_7 */                              \
  P0DIR |= BV(7);                                                \
                                                                 \
  /* configure tristates */                                      \
  P0INP |= PUSH2_BV;                                             \
}

#endif

可以看到这是一个宏定义,看来宏定义在某些方便比函数要好那,如果是自己的话肯定会用函数写这个的,这个还是自己慢慢体会吧,这个看着注释要好懂一些,查看OSC_PD发现又是一个宏

#define OSC_PD     BV(2)  /* 0: Both oscillators powered up and stable
                           * 1: oscillators not stable */

但是却找到了两个宏定义,本质也是一样的,BV宏定义是一个移位操作

#ifndef BV
#define BV(n)      (1 << (n))
#endif
可以看到是把1向左移动n位,因此OSC_PD的值是0x04,查看SLEEPCMD寄存器

ZigBee学习笔记_HAL_BOARD_INIT()_第1张图片

跟自己想象的有点不一样,貌似没有提到打开高频振荡器的样子,而且赋值总感觉不对头,2位是保留位,SLEEPCMD &= ~OSC_PD是将这位置0,跟上面写的总是写作1矛盾那,(希望大牛给予解答),下面是时钟图

ZigBee学习笔记_HAL_BOARD_INIT()_第2张图片

貌似手册里面没有提到SLEEPCMD.OSC_PD,我是不是被骗了那!!!总之对这个SLEEPCMD的寄存器多研究下吧,略过

CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ);可以查看他们的值均是0x00

ZigBee学习笔记_HAL_BOARD_INIT()_第3张图片

这个寄存器是正常的,然后就是等待时钟稳定,说明文档里面有介绍


然后即是关闭16MHzRC振荡器,根据他注释来看,启动时是选择16MHz的RC振荡器,然后切换到32MHz晶振,手册上有说道,晶振的启动时间比较长,除却RF收发器以外,设备可以运行在16MHz振荡器,并且这样功耗要少些,晶振稳定之后才切换到32MHz振荡器。

LED1_DDR |= LED1_BV;

查看宏定义可知

#define LED1_DDR          P1DIR
#define LED1_BV           BV(0)

是设置P1_0为输出,控制一个LED灯

ZigBee学习笔记_HAL_BOARD_INIT()_第4张图片ZigBee学习笔记_HAL_BOARD_INIT()_第5张图片

然后是P0DIR |= BV(7),看了下图

ZigBee学习笔记_HAL_BOARD_INIT()_第6张图片

P0_7口是接的EEPROM设备,设置为输出,至于P0INP |= PUSH2_BV,是设置P0_2口为三态状态,也不晓得为啥子,留待以后探究吧。

PS:希望文章里面的错误的知识点或者观点有错误的大家可以指出来,让小弟多学习下,感激不尽。

===================================分割线=============================================

刚看了下CC2430的手册,或许可以解决下SLEEPCMD寄存器的问题

ZigBee学习笔记_HAL_BOARD_INIT()_第7张图片

可以看到OSC_PD置0时,两个振荡器是打开。跟注释相符了。

你可能感兴趣的:(ZigBee学习笔记_HAL_BOARD_INIT())