in CORTEX_M0_FT32F072_KEIL/Source/Libraries/FT32F0xx_Driver/Src/ft32f0xx_opa.c [173:242]
uint8_t OPA_Cali(void)
{
uint32_t opadelay;
uint32_t outstate;
uint8_t CalDA, CalDB;
uint32_t opatmp32;
/* Enable the selected OPA peripheral */
OPA->CR |= (uint32_t) (1<<0);
/* Enable OP0TM */
OPA->CR |= (uint32_t) (1<<8);
/* OP0NSEL = 00 , SET TO GND */
OPA->CR &= (uint32_t) (~(3<<13));
/* OP0PSEL = 1 , SET TO GND */
OPA->CR |= (uint32_t) ((1<<15));
/* OP0FCAPE = 0 */
OPA->CR &= (uint32_t) (~(1<<9));
/* OPTODIG = 1 */
OPA->CR |= (uint32_t) ((1<<7));
/* OP0FR = 000 */
OPA->CR &= (uint32_t) (~(7<<10));
/* PA2 TO FLOAT */
GPIOA ->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)2 * 2));
//
/* OP0COF = 00000 */
OPA->CR &= (uint32_t) (~(0x1F<<1));
CalDA=0;
opadelay=0X0FFF;
while(opadelay--);
outstate=OPA->CR; // save
while(1){
CalDA++;
if(CalDA>=0x1F) break;
opatmp32=OPA->CR&(~(0x1f<<1));
OPA->CR=opatmp32|(CalDA<<1);
opadelay=0X0FFF;
while(opadelay--);
if((outstate^OPA->CR)&(1<<16)) break;
}
outstate=OPA->CR; // save
CalDB=CalDA;
while(1){
if(0==CalDB) break;
CalDB--;
opatmp32=OPA->CR&(~(0x1f<<1));
OPA->CR=opatmp32|(CalDB<<1);
opadelay=0X0FFF;
while(opadelay--);
if((outstate^OPA->CR)&(1<<16)) break;
}
//
CalDA+=CalDB;
CalDA/=2;
opatmp32=OPA->CR&(~(0x1f<<1));
OPA->CR=opatmp32|(CalDA<<1);
//
return CalDA;
}