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