Z-Stack分析--HAL_BOARD_INIT()

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值