自学笔记①Zmain.c中主函数main:二

本文介绍了Zigbee协议栈启动过程中,Zmain.c中的主函数main如何进行电源电压检测和外设初始化。通过zmain_vdd_check()函数确保电源达到最低2V的要求,并使用HalAdcCheckVdd()进行ADC转换来判断。接着,InitBoard(OB_COLD)函数用于初始化板级IO,包括中断关闭、复位按键检查等操作。对于代码中的疑惑,进行了初步分析和解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继前一篇:自学笔记①Zmain.c中主函数main:一

int main( void )
{
.................
 

  // Make sure supply voltage is high enough to run ad检测电源电压
  zmain_vdd_check();

  // Initialize board I/O  初始化外设io   不太明白

  InitBoard( OB_COLD );   

.....................

} // main()


第一个函数 zmain_vdd_check(); 检查采集vdd/3,监测电源是否满足最低2V的供电要求

/*********************************************************************
 * @fn      zmain_vdd_check
 * @brief   Check if the Vdd is OK to run the processor.
 * @return  Return if Vdd is ok; otherwise, flash LED, then reset
 *********************************************************************/

static void zmain_vdd_check( void )
{
  uint8 cnt = 16;
  
  do {
    while (!HalAdcCheckVdd(VDD_MIN_RUN));   //内部基准1.15V 最低供电2V 等于73.6
  } while (--cnt);
}


其中有一个函数 HalAdcCheckVdd


bool HalAdcCheckVdd(uint8 vdd)
{
  ADCCON3 = 0x0F;       // ad输入vdd/3 内部基准 64抽取率(7位分辨率)
  while (!(ADCCON1 & 0x80));    //等待转换完成
  return (ADCH > vdd);          //比较ad转换数据高位与设定的vdd
}


第二个函数  InitBoard( OB_COLD );   初始化外设io   不太明白

void InitBoard( uint8 level )
{
  if ( level == OB_COLD )
  {
  // IAR does not zero-out this byte below the XSTACK.
    *(uint8 *)0x0 = 0; //看不懂(底下有一点猜测)
    // Interrupts off
    osal_int_disable( INTS_ALL ); //关中断
    // Check for Brown-Out reset
    ChkReset();
  }
  else  // !OB_COLD
  {
    /* Initialize Key stuff */
    HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback);
  }
}

  一:分析猜测 *(uint8 *)0x0 = 0;作用:(希望大神看到之后指导我一下)


0x00是指向CODE存储空间,猜测是清除代码段中之前的程序。。。


二:函数ChkReset(); 检测复位按键(检测低电压复位)

/*********************************************************************
 * @fn      ChkReset()
 * @brief   Check reset bits - if reset cause is unknown, assume a
 *          brown-out (low power), assume batteries are not reliable,
 *          hang in a loop and sequence through the LEDs.
 * @param   None
 * @return  None
 *********************************************************************/

void ChkReset( void )
{
  uint8 rib;


  // Isolate reset indicator bits
  rib = SLEEPSTA & LRESET;


  if ( rib == RESETPO )
  {
    // Put code here to handle Power-On reset
  }
  else if ( rib == RESETEX )
  {
    // Put code here to handle External reset
  }
  else if ( rib == RESETWD )
  {
    // Put code here to handle WatchDog reset
  }
  else  // Unknown reason - not expected.
  {
    HAL_ASSERT(0);
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值