以前看大牛的学习笔记都十分有含量,感觉自己写的很苍白那,不晓得这个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
#define OSC_PD BV(2) /* 0: Both oscillators powered up and stable * 1: oscillators not stable */
#ifndef BV #define BV(n) (1 << (n)) #endif可以看到是把1向左移动n位,因此OSC_PD的值是0x04,查看SLEEPCMD寄存器
跟自己想象的有点不一样,貌似没有提到打开高频振荡器的样子,而且赋值总感觉不对头,2位是保留位,SLEEPCMD &= ~OSC_PD是将这位置0,跟上面写的总是写作1矛盾那,(希望大牛给予解答),下面是时钟图
貌似手册里面没有提到SLEEPCMD.OSC_PD,我是不是被骗了那!!!总之对这个SLEEPCMD的寄存器多研究下吧,略过
CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ);可以查看他们的值均是0x00
这个寄存器是正常的,然后就是等待时钟稳定,说明文档里面有介绍
然后即是关闭16MHzRC振荡器,根据他注释来看,启动时是选择16MHz的RC振荡器,然后切换到32MHz晶振,手册上有说道,晶振的启动时间比较长,除却RF收发器以外,设备可以运行在16MHz振荡器,并且这样功耗要少些,晶振稳定之后才切换到32MHz振荡器。
LED1_DDR |= LED1_BV;
#define LED1_DDR P1DIR #define LED1_BV BV(0)
然后是P0DIR |= BV(7),看了下图
P0_7口是接的EEPROM设备,设置为输出,至于P0INP |= PUSH2_BV,是设置P0_2口为三态状态,也不晓得为啥子,留待以后探究吧。
PS:希望文章里面的错误的知识点或者观点有错误的大家可以指出来,让小弟多学习下,感激不尽。
===================================分割线=============================================
刚看了下CC2430的手册,或许可以解决下SLEEPCMD寄存器的问题
可以看到OSC_PD置0时,两个振荡器是打开。跟注释相符了。