新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM9 S3C2440—ADC和觸摸屏控制詳解

        ARM9 S3C2440—ADC和觸摸屏控制詳解

        作者: 時間:2016-11-28 來源:網絡 收藏

        intMain(void)

        {

        intScom=0;

        Set_Clk();

        Uart_Init(0,115200);

        Uart_Select(Scom);

        Test_Touchpanel();

        while(1);

        return0;

        }

        voidTest_Touchpanel(void)

        {

        rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms

        preScaler=ADC_FREQ;

        preScaler=50000000/ADC_FREQ-1;//PCLK=50M

        rADCCON=(1<<14)|(preScaler<<6);//ADCPRSEn,PRSCVL

        rADCTSC=0xd3;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

        rSRCPND=0x80000000;

        rINTPND=0x80000000;

        ClearSubPending(BIT_SUB_TC);

        pISR_ADC=(U32)AdcTsAuto;

        rINTMSK=0x7fffffff;

        EnableSubIrq(BIT_SUB_TC);

        }

        staticvoid__irqAdcTsAuto(void)

        {

        U32saveAdcdly;

        if(rSUBSRCPND&(BIT_SUB_TC))

        {

        if(!(rADCDAT0&0x8000))

        Uart_Printf("Stylusdown");

        else

        Uart_Printf("Stylusup");

        }

        rADCTSC=(1<<3)|(1<<2);

        saveAdcdly=rADCDLY;

        rADCDLY=40000;//Normalconversionmodedelayabout(1/50M)*40000=0.8ms

        rADCCON|=0x1;//startADC

        while(rADCCON&0x1);//checkifEnable_startislow

        while(!(rADCCON&0x8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~!!

        while(!(rSRCPND&0x80000000));//checkifADCisfinishedwithinterruptbit

        xdata=(rADCDAT0&0x3ff);

        ydata=(rADCDAT1&0x3ff);

        ClearSubPending(BIT_SUB_TC);

        //ClearPending(BIT_ADC);

        rSRCPND=0x80000000;

        rINTPND=0x80000000;

        EnableSubIrq(BIT_SUB_TC);

        //EnableIrq(BIT_ADC);

        rINTMSK=0x7fffffff;

        rADCTSC=0xd3;//Waitingforinterrupt

        rADCTSC=rADCTSC|(1<<8);//Detectstylusupinterruptsignal.

        while(1)//tocheckPen-upstate

        {

        if(rSUBSRCPND&(BIT_SUB_TC))//checkifADCisfinishedwithinterruptbit

        {

        Uart_Printf("StylusUpInterrupt~!");

        break;//ifStylusisup(1)state

        }

        }

        Uart_Printf("count=dXP=d,YP=d",count++,xdata,ydata);

        rADCDLY=saveAdcdly;

        rADCTSC=0xd3;//Waitingforinterrupt

        ClearSubPending(BIT_SUB_TC);

        //ClearPending(BIT_ADC);

        rSRCPND=0x80000000;

        rINTPND=0x80000000;

        EnableSubIrq(BIT_SUB_TC);

        //EnableIrq(BIT_ADC);

        rINTMSK=0x7fffffff;

        }

        voidSet_Clk(void)

        {

        inti;

        U8key;

        U32mpll_val=0;

        i=2;//dontuse100M!

        //boot_params.cpu_clk.val=3;

        switch(i){

        case0://200

        key=12;

        mpll_val=(92<<12)|(4<<4)|(1);

        break;

        case1://300

        key=13;

        mpll_val=(67<<12)|(1<<4)|(1);

        break;

        case2://400

        key=14;

        mpll_val=(92<<12)|(1<<4)|(1);

        break;

        case3://440!!!

        key=14;

        mpll_val=(102<<12)|(1<<4)|(1);

        break;

        default:

        key=14;

        mpll_val=(92<<12)|(1<<4)|(1);

        break;

        }

        //initFCLK=400M,sochangeMPLLfirst

        ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3);//settheregister--rMPLLCON

        ChangeClockDivider(key,12);//theresultofrCLKDIVN[0:1:0:1]3-0bit

        cal_cpu_bus_clk();//HCLK=100MPCLK=50M

        }

        staticvoidcal_cpu_bus_clk(void)

        {

        staticU32cpu_freq;

        staticU32UPLL;

        U32val;

        U8m,p,s;

        val=rMPLLCON;

        m=(val>>12)&0xff;

        p=(val>>4)&0x3f;

        s=val&3;

        //(m+8)*FIN*2不要超出32位數!

        FCLK=((m+8)*(FIN/100)*2)/((p+2)*(1<//FCLK=400MFIN=12000000

        val=rCLKDIVN;

        m=(val>>1)&3;

        p=val&1;

        val=rCAMDIVN;

        s=val>>8;

        switch(m){

        case0:

        HCLK=FCLK;

        break;

        case1:

        HCLK=FCLK>>1;

        break;

        case2:

        if(s&2)

        HCLK=FCLK>>3;

        else

        HCLK=FCLK>>2;

        break;

        case3:

        if(s&1)

        HCLK=FCLK/6;

        else

        HCLK=FCLK/3;

        break;

        }

        if(p)

        PCLK=HCLK>>1;

        else

        PCLK=HCLK;

        if(s&0x10)

        cpu_freq=HCLK;

        else

        cpu_freq=FCLK;

        val=rUPLLCON;

        m=(val>>12)&0xff;

        p=(val>>4)&0x3f;

        s=val&3;

        UPLL=((m+8)*FIN)/((p+2)*(1<UCLK=(rCLKDIVN&8)?(UPLL>>1):UPLL;

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 高邮市| 庆阳市| 镇赉县| 垦利县| 安康市| 招远市| 运城市| 泌阳县| 蒙自县| 泽州县| 濉溪县| 正阳县| 阳新县| 资兴市| 东平县| 宁南县| 进贤县| 鄄城县| 沧州市| 玉屏| 东乌| 波密县| 湖州市| 瓦房店市| 务川| 汉川市| 临泽县| 伊吾县| 平远县| 平定县| 大邑县| 南汇区| 深州市| 台山市| 嘉峪关市| 宜黄县| 汉阴县| 密云县| 句容市| 武义县| 嵊泗县|