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);
}
}