新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GNU ARM匯編--(六)s3c2440的時鐘控制

        GNU ARM匯編--(六)s3c2440的時鐘控制

        作者: 時間:2016-11-26 來源:網絡 收藏
        前面幾篇利用GNU ARM匯編控制LED以及ARM的中斷處理的設計,對ARM匯編以及體系結構有了一定的認識.后面的匯編學習會結合具體的芯片進行,一個為了更靈活熟練的使用匯編,二也是為了通過學習一款具體芯片來提煉出一些有價值的經驗.此次選擇的芯片是三星的s3c2440,arm920t的核,整個板子是TQ2440的板子,這個板子放了兩年多了,零散的玩過一些,但是為了建立更有體系的知識結構,還是值得把它玩過個遍.可能這個芯片很過時了,應該很多人在玩6410,在工作中接觸的也是arm11Cortex-A9或者ppc,但是很多東西并不會過時的.雖然工作中接觸的東西比較新,但是作為做應用的公司,很多底層的東西IC設計廠商都幫你做好了,你只需按照它給的東西去做就行.個人是對底層很感興趣的,而工作中很少有人對底層有完整的認識,所以只能自己利用點個人時間慢慢玩咯.

        不再發感慨了,下面就對s3c2440的時鐘做一個說明,然后給出匯編對時鐘的控制代碼,最后比較一下有時鐘控制和沒時鐘控制下的流水燈的區別.

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

        s3c2440的時鐘控制邏輯可以產生3個時鐘信號:用于CPU核(ARM920T)的FCLK,用于AHB總線外設(存儲控制器中斷控制器LCD控制器DMAUSB的主機端)的HCLK和用于APB總線外設(比如WDT IIS I2C PWM timer MMC ADC UART GPIO RTC SPI)的PCLK.s3c2440有兩個鎖相環,一個是用于FCLK HCLK PCLK的MPLL,一個專用與USB的UPLL.

        首先看一下下面的表格:

        時鐘源可以來自于外部晶振(XTlpll)或者外部時鐘(EXTCLK).datasheet中的圖7-1顯示了時鐘的體系框圖,這里就不給出了,截出一小部分與上圖做個呼應:

        這個圖就反映了OM[3:2]在XTlpll和EXTCLK之間的選擇.

        接下來看看TQ2440的原理圖是如何處理的:

        從原理圖可以看出:OM[3:2]為00b,意味著使用晶振來產生MPLL CLK和UPLL CLK.我們的XTIpll接的就是12M的晶振,這時候EXTCLK按照規定是要接高的,對應圖如下:

        值得注意的是:盡管MPLL在reset后就開始工作了,但是MPLL output只有在軟件寫有效的設置值到MPLLCON寄存器后才作為系統時鐘的.在有效設置之前,外部晶振或者EXTCLK直接用于系統時鐘.哪怕是你不想改動MPLLCON寄存器的初始值,你也得將該值寫入MPLLCON.

        上面的話意味著:如果不進行時鐘的設置,那么我的板子就運行在晶振為12M的系統時鐘下,這個和s3c2440的400M相去甚遠,做流水燈的延時肯定也差數量級的,這個等會就可以看到.

        Mpll = (2*m * Fin) / (p * 2^s)
        m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2

        s3c2440支持FCLK HCLK和PCLK之間的分頻比的選擇.比例由CLKDIVN寄存器的HDIVN和PDIVN決定.可參見下表:

        注意:CLKDIVN要小心設置,不要超出了HCLK和PCLK的限制.如果HDIVN不為0,要用下面的指令,CPU總線模式從Fast Bus Mode變為異步總線模式:

        MMU_SetAsyncBusMode
        mrc p15,0,r0,c1,c0,0
        orr r0,r0,#R1_nF:OR:R1_iA
        mcr p15,0,r0,c1,c0,0

        下面開始看看寄存器的設置:

        LOCK TIME COUNT REGISTER (LOCKTIME)

        這個時間是要保證PLL輸出頻率穩定的,時序圖如下:

        這個計數器的設置就是時序圖中的lock time,而在寄存器說明中規定要大于300us,那么這個時候根據12M的晶振頻率,計算如下:

        (1/12M)*N>300us 所以N>3600 所以可以用寄存器的默認值0xffff.

        PLL CONTROL REGISTER (MPLLCON & UPLLCON)

        MPLL Control Register
        Mpll = (2 * m * Fin) / (p * 2S)
        m = (MDIV + 8), p = (PDIV + 2), s = SDIV


        UPLL Control Register
        Upll = (m * Fin) / (p * 2S)
        m = (MDIV + 8), p = (PDIV + 2), s = SDIV


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西乌珠穆沁旗| 宽城| 湘乡市| 绥芬河市| 涡阳县| 香港 | 武山县| 古田县| 同仁县| 枣庄市| 顺昌县| 蒲江县| 会理县| 营山县| 丘北县| 成都市| 晋江市| 绍兴县| 牡丹江市| 乌鲁木齐市| 司法| 长顺县| 富阳市| 安国市| 美姑县| 讷河市| 芒康县| 龙岩市| 墨玉县| 高青县| 贵德县| 盘山县| 宝兴县| 灯塔市| 通山县| 广东省| 县级市| 贵州省| 蓝山县| 阳西县| 武穴市|