Z-Stack分析--zmain_vdd_check()

zmain_vdd_check()函数分析

源码:

static void zmain_vdd_check( void )
{
  uint8 vdd_passed_count = 0;
  bool toggle = 0;
  while ( vdd_passed_count < MAX_VDD_SAMPLES )
  {
    if ( HalAdcCheckVdd (ZMAIN_VDD_LIMIT) )
    {
      vdd_passed_count++; 
      MicroWait (10000);
    }
    else
    {
      vdd_passed_count = 0; 
      MicroWait (50000);  
      MicroWait (50000);  
    }

    if (vdd_passed_count == 0)
    {
      if ((toggle = !(toggle)))
        HAL_TOGGLE_LED1();
      else
        HAL_TOGGLE_LED2();
    }
  }

  HAL_TURN_OFF_LED1();
  HAL_TURN_OFF_LED2();
}

这个函数的作用是对于工作电压的检测。

while ( vdd_passed_count < MAX_VDD_SAMPLES ){}

MAX_VDD_SAMPLES = 3 最大的标准电压

vdd_passed_count初始化为0,所以进入while()循环,执行条件语句判断HalAdcCheckVdd()返回值

HalAdcCheckVdd()函数源码:

传入参数ZMAIN_VDD_LIMIT = 0x04

bool HalAdcCheckVdd (uint8 limit)
{
  uint16 value;
  uint8 tmpADCCON3 = ADCCON3; 
  ADCIF = 0;

  ADCCON3 = (HAL_ADC_REF_125V | HAL_ADC_DEC_064 | HAL_ADC_CHN_VDD3);

  while ( !ADCIF );

  value = ADCL;
  value |= ((uint16) ADCH) << 8;

  ADCCON3 = tmpADCCON3;
  
  return ( value >= HalAdcVddLimit[limit] );
}

uint8 tmpADCCON3 = ADCCON3; 

ADCCON3--> ADC控制3寄存器


此句代码是对ADC控制3寄存器的内容做一个保存。

ADCIF = 0;


可以知道将此寄存器清零是为了清楚ADC中断的标志。

ADCCON3 = (HAL_ADC_REF_125V | HAL_ADC_DEC_064 | HAL_ADC_CHN_VDD3)

等效于ADCCON3  = 0X00 | 0X00 | 0X0F = 0X0F,可以根据前面ADCCON3 的内容来判定0x0f所对应的作用

while ( !ADCIF );

通过对ADCIF的值来判断是否转换完成

  value = ADCL;
  value |= ((uint16) ADCH) << 8;

ADC的转换结果就放在 ADCL和ADCH里面,所以value的值就是存放ADC转换的最终结果。

  ADCCON3 = tmpADCCON3;

将前面保存的ADCCON3的内容返回到ADCCON3 寄存器里面

return ( value >= HalAdcVddLimit[limit] )

返回值,HalAdcVddLimit[limit]存储的是温度的限定值,根据传入的实参来从数组中查找响应的电压值,然后返回实际电压值和数组中电压值大小比较的结果,由此来判断实际电压值与参考电压值的关系。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值