漆 強(qiáng),劉 爽
(電子科技大學(xué) 光電科學(xué)與工程學(xué)院,成都 610054)
時(shí)鐘系統(tǒng)是任何一個(gè)微控制器系統(tǒng)穩(wěn)定工作的先決條件,在時(shí)鐘節(jié)拍的作用下,微控制器才能完成取指令、解釋、執(zhí)行等一系列操作。一旦時(shí)鐘系統(tǒng)失效,整個(gè)微控制器系統(tǒng)將無(wú)法正常工作。傳統(tǒng)的微控制器電路設(shè)計(jì)中,如8051等8位單片機(jī),時(shí)鐘系統(tǒng)相對(duì)比較簡(jiǎn)單,一般通過(guò)外接晶振或者引入外部時(shí)鐘源來(lái)構(gòu)成。而對(duì)于目前工程界常用的Cortex-M系列內(nèi)核微控制器而言,其時(shí)鐘系統(tǒng)設(shè)計(jì)較為復(fù)雜,工作頻率相對(duì)較高,如何完成時(shí)鐘系統(tǒng)的設(shè)計(jì)和仿真成為了嵌入式系統(tǒng)開(kāi)發(fā)的第一個(gè)難題[1]。
以Cortex-M3內(nèi)核微控制器LPC1768為例來(lái)介紹一下微控制器時(shí)鐘系統(tǒng)的基本構(gòu)成。
LPC1768微控制器的時(shí)鐘頻率高達(dá)100 MHz,片內(nèi)集成512 KB的Flash存儲(chǔ)器、64 KB的數(shù)據(jù)存儲(chǔ)器,片內(nèi)外設(shè)組件還包含了以太網(wǎng)接口、USB接口、UART接口、CAN通道、SPI接口、I2C接口、A/D和D/A接口以及70個(gè)通用GPIO引腳,廣泛用于工業(yè)控制、物聯(lián)網(wǎng)和智能家居等領(lǐng)域。由于其強(qiáng)大的功能以及便捷的開(kāi)發(fā)方式,得到了電子工程師的廣泛應(yīng)用,目前已經(jīng)逐步取代了傳統(tǒng)的8位單片機(jī)[2]。
LPC1768微控制器的時(shí)鐘系統(tǒng)如圖1所示,包括了時(shí)鐘源、鎖相環(huán)(Phase Locked Loop,PLL)和時(shí)鐘分頻等幾個(gè)部分。

圖1 時(shí)鐘系統(tǒng)結(jié)構(gòu)圖
(1)時(shí)鐘源。LPC1768包含了3個(gè)時(shí)鐘源:主振蕩器,片內(nèi)RC振蕩器和實(shí)時(shí)時(shí)鐘(Real-Time Clock,RTC)振蕩器。微控制器上電復(fù)位后,默認(rèn)選擇片內(nèi)RC振蕩器作為時(shí)鐘源[3]。之后,用戶可以通過(guò)寄存器的設(shè)置來(lái)切換時(shí)鐘源:選擇主振蕩器或者RTC振蕩器。一般情況下,由于片內(nèi)RC振蕩器的輸出頻率精度較低,用戶在上電復(fù)位完成后,都會(huì)切換到輸出頻率精度較高的主振蕩器作為時(shí)鐘源。主振蕩器和RTC振蕩器的電路設(shè)計(jì)很簡(jiǎn)單:使用石英晶體外加兩個(gè)電容和微控制器內(nèi)部的反相器就可以完成。基本的電路原理圖如2所示。

圖2 時(shí)鐘電路原理圖
使用多個(gè)時(shí)鐘源的目的是:當(dāng)出現(xiàn)極端情況,如主振蕩器和RTC振蕩器都失效時(shí),系統(tǒng)會(huì)自動(dòng)切換到片內(nèi)RC振蕩器作為時(shí)鐘源,確保系統(tǒng)的安全性。
(2)鎖相環(huán)。和傳統(tǒng)的8位單片機(jī)十幾MHz的時(shí)鐘頻率相比,Cortex-M內(nèi)核微控制器的時(shí)鐘頻率較高,大都在幾十MHz到200 MHz之間。時(shí)鐘頻率的提升是利用了內(nèi)部的鎖相環(huán)(PLL)完成,其工作原理是利用相位檢測(cè)器,根據(jù)輸入頻率和輸出頻率之間的差值輸出不同的電流,進(jìn)而控制流控振蕩器(Current-Controlled Qscillator,CCO)的振蕩頻率,直至兩者差值為0,反饋系統(tǒng)達(dá)到穩(wěn)定,輸出最終的穩(wěn)定頻率[4]。
使用PLL在微控制器內(nèi)部進(jìn)行時(shí)鐘倍頻的好處是可以使微控制器外圍電路的工作頻率保持在十幾MHz,減輕電路布線的難度,不需要考慮高頻電路布線時(shí)的傳輸線效應(yīng)。
(3)時(shí)鐘分頻。PLL輸出的頻率經(jīng)過(guò)分頻后提供給微控制器內(nèi)核和片內(nèi)集成的眾多外設(shè)使用,如以太網(wǎng)、串口和定時(shí)器等模塊。每一個(gè)外設(shè)都可以單獨(dú)設(shè)置時(shí)鐘的分頻系數(shù),用戶可以根據(jù)外設(shè)的實(shí)際工作情況進(jìn)行選擇。同時(shí)對(duì)于在具體應(yīng)用中沒(méi)有使用的外設(shè),還可以關(guān)閉其時(shí)鐘輸入,減少系統(tǒng)功耗[5]。
由于Cortex-M3內(nèi)核微控制器的時(shí)鐘系統(tǒng)結(jié)構(gòu)比較復(fù)雜,時(shí)鐘系統(tǒng)的初始化配置和設(shè)計(jì)需要涉及到大量的硬件寄存器,用戶必須要搞清楚這些寄存器每一位的含義才能正確的配置,如主振蕩器控制這樣一個(gè)簡(jiǎn)單的功能,就需要去了解系統(tǒng)控制和狀態(tài)寄存器(SCS)的具體定義,見(jiàn)表1[6]。

表1 系統(tǒng)控制和狀態(tài)寄存器(SCS)位描述
同時(shí)在鎖相環(huán)對(duì)時(shí)鐘的倍頻處理中,用戶還需要根據(jù)實(shí)際所需的內(nèi)核時(shí)鐘去計(jì)算分頻系數(shù)和倍頻系數(shù),并按照一定配置過(guò)程:使能鎖相環(huán) → 等待鎖相環(huán)穩(wěn)定 → 連接鎖相環(huán) → 讀取鎖相環(huán)狀態(tài)才能完成。因此對(duì)于初學(xué)者而言,正確進(jìn)行時(shí)鐘系統(tǒng)的初始化和設(shè)計(jì)具有相當(dāng)?shù)碾y度[7]。
RealView Microcontroller Development Kit(以下簡(jiǎn)稱MDK)開(kāi)發(fā)軟件為微控制器時(shí)鐘系統(tǒng)的正確配置提供了良好的解決方案[8]。具體包括3項(xiàng)功能:① 提供集成開(kāi)發(fā)環(huán)境,進(jìn)行文件的編寫(xiě)、編譯,鏈接和下載;② 提供了圖形用戶界面,自動(dòng)配置啟動(dòng)代碼;③ 提供強(qiáng)大的虛擬仿真功能,能夠?qū)ζ瑑?nèi)外設(shè)的硬件寄存器進(jìn)行實(shí)時(shí)的仿真和測(cè)試。
以MDK4.7為例,在軟件的安裝目錄KEILARMStartup下面,提供了軟件所支持的微控制器的啟動(dòng)代碼,LPC1768芯片的啟動(dòng)代碼為startup_LPC17xx.s和system_LPC17xx.c。其中,startup_LPC17xx.s是匯編格式的啟動(dòng)代碼,主要完成系統(tǒng)堆棧的配置、中斷向量表的建立等工作;system_LPC17xx.c是c語(yǔ)言格式的啟動(dòng)代碼,主要完成時(shí)鐘系統(tǒng)的設(shè)置[9]。
將system_LPC17xx.c加入到工程項(xiàng)目中,可以在MDK軟件中看到時(shí)鐘系統(tǒng)的初始化源代碼。由于源代碼需要用戶去閱讀芯片手冊(cè),了解大量硬件寄存器的用法。為了方便用戶配置,MDK軟件提供了和啟動(dòng)代碼對(duì)應(yīng)的圖形配置界面,如圖3所示。

圖3 時(shí)鐘配置的圖形用戶界面
在該配置界面中,用戶可以通過(guò)下拉菜單進(jìn)行時(shí)鐘源的選擇,內(nèi)核時(shí)鐘以及外設(shè)時(shí)鐘分頻設(shè)置,在鎖相環(huán)參數(shù)的配置上,還可以直接輸入M和N等分頻和倍頻系數(shù)的值,系統(tǒng)會(huì)自動(dòng)計(jì)算出最后的內(nèi)核時(shí)鐘。整個(gè)配置過(guò)程簡(jiǎn)單直觀,降低了開(kāi)發(fā)難度,提高了開(kāi)發(fā)效率。
MDK軟件提供了軟件仿真和硬件仿真兩種模式。軟件仿真可以在沒(méi)有硬件平臺(tái)的情況下模擬片內(nèi)所有外設(shè)的硬件寄存器,用戶可以對(duì)每一個(gè)硬件寄存器進(jìn)行仿真和觀測(cè),并能夠?qū)崟r(shí)顯示用戶代碼對(duì)相關(guān)硬件寄存器的修改。同時(shí)提供了觀察(Watch)窗口,用戶可以添加需要觀測(cè)的變量,進(jìn)行數(shù)據(jù)的監(jiān)測(cè)[10]。
完成時(shí)鐘系統(tǒng)的初始化配置后,可以利用MDK軟件強(qiáng)大的虛擬仿真功能進(jìn)行時(shí)鐘系統(tǒng)的仿真[11]。
(1)時(shí)鐘源選擇仿真窗口(Clock Source Selection)。時(shí)鐘源選擇仿真窗口實(shí)時(shí)顯示時(shí)鐘源選擇寄存器(CLKSRCSEL)的配置值以及各個(gè)時(shí)鐘的頻率,并顯示最后的配置結(jié)果,如圖4所示。

圖4 時(shí)鐘源選擇仿真窗口
(2)時(shí)鐘分頻仿真窗口(Clock Divers)。時(shí)鐘分頻仿真窗口主要顯示了內(nèi)核時(shí)鐘、USB模塊和外設(shè)時(shí)鐘的分頻設(shè)置,如圖5所示。最上方顯示的是內(nèi)核時(shí)鐘分頻(CPU Clock Configuration),用于配置微控制器的內(nèi)核時(shí)鐘,也是系統(tǒng)運(yùn)行時(shí)鐘。中間部分是USB模塊時(shí)鐘分頻(USB Clock Configuration),對(duì)于USB模塊而言,必須工作在穩(wěn)定的48MHz時(shí)鐘之下。最下方是外設(shè)的時(shí)鐘分頻選擇(Peripheral Clock Selection),每一個(gè)片內(nèi)外設(shè)都可以有一分頻、二分頻、四分頻和八分頻四種選擇,默認(rèn)使用四分頻[12]。

圖5 時(shí)鐘分頻仿真窗口
(3)鎖相環(huán)仿真窗口(Phase Locked Loop0)。鎖相環(huán)仿真窗口實(shí)時(shí)顯示了與鎖相環(huán)配置相關(guān)的寄存器的配置值,包括鎖相環(huán)控制寄存器、鎖相環(huán)配置寄存器、鎖相環(huán)狀態(tài)寄存器和饋送寄存器,并顯示了根據(jù)這些配置參數(shù)得到的鎖相環(huán)輸出時(shí)鐘(PLLCLK),如圖6所示。用戶通過(guò)實(shí)時(shí)觀察相關(guān)的配置值和最后的輸出時(shí)鐘,可以判斷時(shí)鐘的配置是否正確,以便進(jìn)行代碼的修正[13]。

圖6 鎖相環(huán)仿真窗口
(4)時(shí)鐘系統(tǒng)仿真圖(Clock Generation Schematic)。完成時(shí)鐘系統(tǒng)的所有配置之后,MDK軟件可以生成整個(gè)時(shí)鐘系統(tǒng)的仿真結(jié)構(gòu)圖,如圖7所示。

圖7 時(shí)鐘系統(tǒng)仿真圖
時(shí)鐘系統(tǒng)仿真圖直觀的展示從輸入到輸出的整個(gè)時(shí)鐘系統(tǒng)的結(jié)構(gòu)圖。從圖7可以看出:在時(shí)鐘源選擇上,選擇了由外部晶振構(gòu)成的主振蕩器(MOSC),時(shí)鐘頻率為12 MHz。該時(shí)鐘作為PLL0的輸入時(shí)鐘,經(jīng)過(guò)鎖相環(huán)的分頻和倍頻后,輸出的時(shí)鐘(PLLCLK)為400 MHz,再經(jīng)過(guò)四分頻后輸出的系統(tǒng)主時(shí)鐘(CCLK)為100 MHz。外設(shè)時(shí)鐘可以為系統(tǒng)主時(shí)鐘的一分頻、二分頻、四分頻和八分頻。USB模塊的時(shí)鐘源也由主振蕩器提供,經(jīng)過(guò)PLL1倍頻后在進(jìn)行分頻,最后得到穩(wěn)定的48 MHz的USB時(shí)鐘[14]。
利用MDK軟件提供的初始化代碼配置界面,解決了時(shí)鐘系統(tǒng)初始化過(guò)程繁雜的問(wèn)題,用戶不再需要去掌握幾十個(gè)硬件寄存器的含義,只需要在圖形用戶界面上進(jìn)行簡(jiǎn)單的勾選即可[15]。同時(shí)借助MDK軟件提供的虛擬仿真功能,用戶在沒(méi)有硬件平臺(tái)的基礎(chǔ)上,也可以進(jìn)行時(shí)鐘系統(tǒng)以及片內(nèi)外設(shè)的仿真和測(cè)試:提供的硬件寄存器仿真窗口,實(shí)時(shí)根據(jù)用戶代碼的配置進(jìn)行相應(yīng)信息的顯示,方便用戶進(jìn)行源碼的測(cè)試;生成的系統(tǒng)時(shí)鐘圖,直觀的展示了時(shí)鐘源的選擇,時(shí)鐘的倍頻和分頻等一系列過(guò)程,并顯示了最終的時(shí)鐘配置結(jié)果,方便用戶檢驗(yàn)配置的結(jié)果[16]。