把学习当做是一种乐趣,(学得懂的肯定是很乐, 学不懂的话可就不是乐趣是煎熬了,半懂不懂的就装懂吧)中午没睡,静等崩溃……
static void zmain_vdd_check( void )
{
uint8 vdd_passed_count = 0;
bool toggle = 0;
// Repeat getting the sample until number of failures or successes hits MAX
// then based on the count value, determine if the device is ready or not
while ( vdd_passed_count < MAX_VDD_SAMPLES )
{
if ( HalAdcCheckVdd (ZMAIN_VDD_LIMIT) )
{
vdd_passed_count++; // Keep track # times Vdd passes in a row
MicroWait (10000); // Wait 10ms to try again
}
else
{
vdd_passed_count = 0; // Reset passed counter
MicroWait (50000); // Wait 50ms
MicroWait (50000); // Wait another 50ms to try again
}
/* toggle LED1 and LED2 */
if (vdd_passed_count == 0)
{
if ((toggle = !(toggle)))
HAL_TOGGLE_LED1();
else
HAL_TOGGLE_LED2();
}
}
/* turn off LED1 */
HAL_TURN_OFF_LED1();
HAL_TURN_OFF_LED2();
}
这个函数是检测VDD是否能够运行器MCU,本质就是检测供电电压的大小,我想一般都能运行起吧,不得不说程序很严谨那。。。
查看宏定义可发现MAX_VDD_SAMPLES的值是3,ZMAIN_VDD_LIMIT的值是4,也就是说循环检测了3次,HalAdcCheckVdd()就是检测的实现,如果检测的电压达到要求就延时10ms继续下一次检测,否则的话重新去检测,重置检测计数器,并且LED灯闪烁。
下面看下具体实现
bool HalAdcCheckVdd (uint8 limit)
{
uint16 value;
/* Clear ADC interrupt flag */
ADCIF = 0;
/* Setup the new value for conversion */
ADCCON3 = (HAL_ADC_REF_125V | HAL_ADC_DEC_064 | HAL_ADC_CHN_VDD3);
/* Wait for the conversion to finish */
while ( !ADCIF );
/* Get the result */
value = ADCL;
value |= ((uint16) ADCH) << 8;
/* Check the limit and return */
return ( value >= HalAdcVddLimit[limit] );
}
这个寄存器是用来控制单个ADC转换的,这里的ADC输入是AVDD5/3,实现电池检测功能,
#define HAL_ADC_REF_125V 0x00 /* Internal 1.25V Reference */
#define HAL_ADC_DEC_064 0x00 /* Decimate by 64 : 8-bit resolution */
#define HAL_ADC_CHN_VDD3 0x0f /* VDD/3 */
可以看到是采用内部1.25V作为参考电压、抽取率为64,输入通道为VDD/3,因为目前没有AD转换序列进行,因此对ADCCON3赋值完毕后即开始AD转换,单个ADC转换将触发ADC中断,而完成一个序列转换是触发一个DMA中断,转换完毕,我们即可以取值了,这里他是用结果跟一个数组里面的值进行比较,数组如下
static __code const uint16 HalAdcVddLimit[] =
{
0x369C, /* VDD Limit - 1.6v */
0x3A06, /* VDD Limit - 1.7v */
0x3D70, /* VDD Limit - 1.8v */
0x40D9, /* VDD Limit - 1.9v */
0x4443, /* VDD Limit - 2.0v */
0x47AD, /* VDD Limit - 2.1v */
0x4B17, /* VDD Limit - 2.2v */
0x4E81, /* VDD Limit - 2.3v */
0x51EA, /* VDD Limit - 2.4v */
};
当检测的电压大于等于2.0V时返回true,回到zmain_vdd_check()函数中,当检测结果返回false时,LED灯会闪烁,这个toggle变量不晓得是起什么作用,
#define HAL_TOGGLE_LED2() st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} )
#define HAL_TURN_OFF_LED1() st( LED1_SBIT = LED1_POLARITY (0); )
#define LED1_POLARITY ACTIVE_HIGH
#define ACTIVE_HIGH ! /* double negation forces result to be '1' */