新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440時鐘電源管理

        S3C2440時鐘電源管理

        作者: 時間:2016-11-21 來源:網絡 收藏
        S3C2440時鐘可以選用晶振(XTAL),也可以使用外部時鐘(EXTCLK),由系統復位時,在復位信號上升沿對引腳OM3、OM2所測的狀態來確定。由于我所用的開發板這兩個引腳接地,故外部晶振作為主鎖相環(MPLL)和usb鎖相環(UPLL)的時鐘源。

        含有兩個鎖相環MPLL、UPLL產生系統所需要的不同頻率的時鐘
        MPLL:
        為CPU產生FCLK時鐘
        為AHB產生HCLK時鐘
        為APB產生PCLK時鐘

        本文引用地址:http://www.104case.com/article/201611/319196.htm

        UPLL:
        為usb(Host and Device)產生UCLK(48M)


        FCLK,HCLK和 PCLK
        FCLK是提供給ARM920T 的時鐘。
        HCLK 是提供給用于 ARM920T,存儲器控制器,中斷控制器,LCD 控制器,DMA 和 USB 主機模塊的 AHB
        總線的時鐘。
        PCLK 是提供給用于外設如WDT,IIS,I2C,PWM 定時器,MMC/SD 接口,ADC,UART,GPIO,RTC 和
        SPI的APB 總線的時鐘。


        下圖為PLL(鎖相環)方框圖

        設置FCLK要用到PLL控制寄存器MPLLCON

        例如:如果外部晶振Fin為12MHZ,設置FCLK為400MHZ,

        由公式Fout = 2 × m × Fin / ( p*2^s) 此處:m =MDIV+8, p=PDIV+2, s=SDIV

        可知rMPLLCON=((92<<12)|(1<<4)|1) 其中(MDIV=92, PDIV=1,SDIV=1)。

        下面的這個函數是配置FCLK HCLK PCLK的比例的函數,用到時鐘分頻寄存器CLKDIVN

        1. voidChangeClockDivider(inthdivn,intpdivn)
        2. {
        3. //hdivn,pdivnFCLK:HCLK:PCLK
        4. //0,01:1:1
        5. //0,11:1:2
        6. //1,01:2:2
        7. //1,11:2:4
        8. //2,01:4:4
        9. //2,11:4:8
        10. //3,01:3:3
        11. //3,11:3:6
        12. rCLKDIVN=(hdivn<<1)|pdivn;
        13. if(hdivn==2)
        14. rCAMDIVN=(rCAMDIVN&~(3<<8))|(1<<9);
        15. if(hdivn==3)
        16. rCAMDIVN=(rCAMDIVN&~(3<<8))|(1<<8);
        17. }


        [cpp]view plaincopy
        1. //**************************[UPLL]*******************************
        2. voidChangeUPllValue(intmdiv,intpdiv,intsdiv)//配置UPLLCON寄存器
        3. {
        4. rUPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv;
        5. }
        [cpp]view plaincopy
        1. voidCalcBusClk(void)//計算總線頻率
        2. {
        3. U32val;
        4. U8m,p,s;
        5. val=rMPLLCON;
        6. m=(val>>12)&0xff;
        7. p=(val>>4)&0x3f;
        8. s=val&3;
        9. //(m+8)*FIN*2不要超出32位數!
        10. FCLK=((m+8)*(FIN/100)*2)/((p+2)*(1<
        11. val=rCLKDIVN;
        12. m=(val>>1)&3;//HDIVN的值
        13. p=val&1;//PDIVN的值
        14. val=rCAMDIVN;
        15. s=val>>8;//CAMDIVN[8:9],為HDIVN分頻改變位
        16. switch(m)//計算HCLK頻率
        17. {
        18. case0:
        19. HCLK=FCLK;
        20. break;
        21. case1:
        22. HCLK=FCLK>>1;
        23. break;
        24. case2:
        25. if(s&2)//見CAMDIVN寄存器HCLK4_HALF
        26. HCLK=FCLK>>3;
        27. else
        28. HCLK=FCLK>>2;
        29. break;
        30. case3:
        31. if(s&1)//見CAMDIVN寄存器HCLK3_HALF
        32. HCLK=FCLK/6;
        33. else
        34. HCLK=FCLK/3;
        35. break;
        36. }
        37. if(p)//計算PCLK頻率
        38. PCLK=HCLK>>1;
        39. else
        40. PCLK=HCLK;
        41. val=rUPLLCON;
        42. m=(val>>12)&0xff;
        43. p=(val>>4)&0x3f;
        44. s=val&3;
        45. UPLL=((m+8)*FIN)/((p+2)*(1<
        46. UCLK=(rCLKDIVN&8)?(UPLL>>1):UPLL;//計算UCLK頻率
        47. }

        下圖為外部時鐘為晶振時的上電復位順序




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 铜陵市| 富源县| 佛教| 瑞金市| 广安市| 登封市| 资源县| 牙克石市| 蒙自县| 达日县| 沈丘县| 贵南县| 山西省| 庄河市| 稷山县| 齐河县| 四川省| 渑池县| 吉安县| 全椒县| 汶川县| 永顺县| 桐庐县| 巴林右旗| 克拉玛依市| 桐梓县| 临海市| 台北县| 白城市| 西乡县| 曲沃县| 原阳县| 共和县| 读书| 启东市| 来凤县| 通江县| 张家界市| 太湖县| 余姚市| 文安县|