HAL_BOARD_INIT()分析:
源码:
#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)
#define HAL_BOARD_INIT() \
{ \
uint16 i; \
\
SLEEPCMD &= ~OSC_PD; \
while (!(SLEEPSTA & XOSC_STB)); \
asm("NOP"); \
for (i=0; i<504; i++) asm("NOP"); \
CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ); \
while (CLKCONSTA != (CLKCONCMD_32MHZ | OSC_32KHZ)); \
SLEEPCMD |= OSC_PD; \
PREFETCH_ENABLE(); \
LED1_DDR |= LED1_BV; \
LED2_DDR |= LED2_BV; \
LED3_DDR |= LED3_BV; \
P0INP |= PUSH2_BV; \
}
首选可以知道函数HAL_BOARD_INIT()的定义是有条件的,条件就是定义了HAL_BOARD_CC2530EB_REV17同时没有定义HAL_PA_LNA和HAL_PA_LNA_CC2590(HAL_BOARD_CC2530EB_REV17表示TI官方开发板的版本号),那么函数才会被定义,那么追踪下去我们发现语句如下:
#if !defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_BOARD_CC2530EB_REV13)
#define HAL_BOARD_CC2530EB_REV17
#endif
所以条件成立,函数被定义。
SLEEPCMD &= ~OSC_PD;
OSC_PD表示1<<2
SLEEPCMD是CC2530的睡眠模式控制寄存器,OSC_PD= 0x04;取反以后OSC_PD =0xFB也就是SLEEPCMD的第二位为0,SLEEPCMD的第二位在cc2530的技术手册介绍不详细,我们查看2430的技术手册可以知道第二位清零的作用是设置32MHz和16Mhz的晶振都会起振。
while (!(SLEEPSTA & XOSC_STB));
XOSC_STB表示1<<6
同样,CC2530手册里面介绍不是很详细,那么结合2430手册知道第6位XOSC_STB表明外部高速32M晶振是否上电并稳定起振,当稳定时该位为1;同样对于第5位HFRC_STB则表明内部16MHz高速RC振荡器是否起振,并是否稳定,当16MHz RC振荡器稳定时该位为1。等待32MHz的晶振起振平稳,否则会在此处循环等待。
asm("NOP"); for (i=0; i<504; i++) asm("NOP");
NOP延时,一个NOP为一个空操作,时间为一个机器周期。
CLKCONCMD = (CLKCONCMD_32MHZ | OSC_32KHZ);
CLKCONCMD_32MHZ = 0
OSC_32KHZ = 0x80
根据技术手册我们可以知道CLKCONCMD = 0x80,我们可以分析时钟速度32MHz,定时器输出设置32MHz,系统时钟源选择32MHz,选择32KHz的时钟振荡器。
上面是对于时钟的操作。
while (CLKCONSTA != (CLKCONCMD_32MHZ | OSC_32KHZ));
循环等待硬件完成前面的操作,完成以后CLKCONSTA 相应的位会返回对应的数值。
SLEEPCMD |= OSC_PD;
SLEEPCMD 的含义前面可以看见。
PREFETCH_ENABLE();
函数宏定义#define PREFETCH_ENABLE() st( FCTL = 0x08; )
FCTL = 0X08表示对于闪存有活跃的写入和擦除操作,其余的0设置对应可以了解响应的功能。
LED1_DDR |= LED1_BV;
LED2_DDR |= LED2_BV;
LED3_DDR |= LED3_BV;
P0INP |= PUSH2_BV;
LED1_DDR 、LED2_DDR 和LED3_DDR 表示P1DIR也就是P1端口的方向寄存器:
而LED1_BV、LED2_BV和LED3_BV表示P1.0、P1.1、P1.4设置为输出模式,对应分别是绿、红、黄三灯,这三个led在官方开发板上面分别对应了不同的指示功能。
P0INP |= PUSH2_BV;
PUSH2_BV = 1<<0
表示P0.0为上拉/下拉输入模式
对于IO口的设置响应的作用可以去官方查找响应的手册了解。
注:\表示连接,也就是说下一行是上一行的继续。
官方链接http://www.ti.com.cn/tool/cn/cc2530dk