做mcu及其他dsp的設計時,可能大家覺得時鐘的設計其實是很簡單的。沒錯,比如現在很熱門的arm系列的mcu,設計時沒人單獨提出來過什麼時鐘設計。為什麼在提到tms320c6678的時候要特別的提出時鐘設計呢?
說實話,要想用好c6678,尤其是在多工影象通訊的場合,還真的得仔細研究其時鐘系統。在這裡,我將按照我個人在工作中的理解來寫c6678的時鐘系統。所以看起來會工程味道重一些,沒有學術的味道。
c6678的時鐘系統架構,設計得非常人性化,使用也比較方便。其系統架構如下圖:
c6678的時鐘架構是由pll來控制,所以需要首先理解pll以及pll控制器。
外部輸入的時鐘訊號,經過pll後輸出時鐘訊號pllout。
pll控制器是使用者軟體可程式設計的,所以為系統提供靈活多變的時鐘訊號,在系統架構圖中表示為plldiv1到plldiv16.另外pll控制器不僅僅只是對pllout進行軟體可程式設計的分頻或者倍頻等操作,同時包含有pllm和secctl控制暫存器,驅動pllm,output divide以及bypass。
整個c6678的時鐘系統統一由pll控制器來進行排程,經過pll控制器後分配到8個c66x核心以及系統中的各個外設以及晶元內的各相關模組。
下面就給大家詳細介紹pll控制器的可程式設計指令的一些應用。pll控制器中應用得比較多的幾個概念,主要是分頻(plld),倍頻(pllm)和無效(disable)。
分頻:就是將pllout的頻率分別除以(1到256可程式設計)得到得頻率。
倍頻:與分頻相反,是乘以可程式設計係數。
無效:其實就是停止時鐘得輸出。
儘管說是可程式設計的,但是需要特別注意,有些時鐘不是可以任意程式設計,必須遵循一定的規則。上圖中已經標明。其中plldiv2,plldiv5,plldiv8各自的輸出分頻數分別為x、y、z。這是可以程式設計的,其餘的就只能選定指定的數字。下面分別列出來:
plldiv1àsysclk1: 是全速時鐘,專供corepack使用;
plldiv2àsysclk2: 可軟體程式設計,其中x為1-32.但是必須確保時鐘不能超過350m。
plldiv3àsysclk3: 是½速率時鐘,驅動msmc、hyperlink、cpu /2 scr、ddr emif、cpu/2 edma;
plldiv4àsysclk4: 驅動switch fabrics 和快速外設,例如debug_ss和etbs的1/3速率時鐘;
plldiv5àsysclk5:僅供給system trace的1/y時鐘(預設1/5),可程式設計輸出時鐘32~210mhz;
plldiv6àsysclk6: 1/64速率時鐘,驅動ddr3 emif的pvt快取模組;
plldiv7àsysclk7: 提供給慢速外設的1/6速率時鐘 ,同時,1/6時鐘還提供給sysclkout作為測試管腳使用;
plldiv8àsysclk8: 可程式設計慢速系統時鐘,z的取值範圍為24~80;
plldiv9àsysclk9: ½速率時鐘,驅動smartreflex;
plldiv10àsysclk10: 1/3速率時鐘,驅動srio;
plldiv11àsysclk11: 1/6速率時鐘,驅動psc。
參考tms320c6678資料手冊中的介紹,我分別介紹配置main pll的幾個關鍵暫存器
分頻係數:上述pll控制器的若干輸出頻率是可程式設計的,此時鐘分頻係數由暫存器plldiv2,plldiv5,plldiv8配置。
倍頻係數: pllm暫存器控制pll控制器的倍頻值。
pll控制暫存器(pllctl)和二級pll控制器(secctl)復位後,pllctl中的pll使能位pllen可被修改,但是對pll的功能沒有影響,除非先將pllensrc控制位清零;非使能pllen後pll進入旁路模式,此時可以對pll進行配置,配置結束後pllen置位,pll按照配置後的模式工作;secctl中的output divide位給出pll的次分頻係數(1或2)。 對於系統的main pll的詳細配置流程,請參考ti官方的文件www.ti.com/lit/ug/spru**2f/spru**2f.pdf中的3.1:
暫存器rstype、rstctl及rstcfg、rsiso給出了pll復位控制邏輯配置單元。
全面理解時鐘系統,還需要與boot相關聯。需要掌握c6678的boot相關的配置等等。也就是說,pll的初始配置與boot相關。
下表是從c6678的資料手冊裡面摘錄下來的,便於理解前面說的那句話以及理解上面列出的plld和pllm:
pll在boot模式下被置於pll的狀態下,pll的初始引數是由bootmode【12:10】決定。
tms320c6678 main pll初始化配置在ti的demo程式中main函式呼叫keystone_main_pll_init (10, 1)函式裡的引數配置過程。
例程對應硬體的輸入時鐘coreclk為100mhz;pllm設定為102-1=20-1(pllm暫存器,20倍頻);plld設定為1-1(mainpllctn0中的plld欄位,1分頻);output divide(secctn)設定為2-1(對應2分頻),可以計算pll輸出時鐘pllout=coreclk(pllm+1)/(plld+1)/(output divide+) = 100mhz *20 / 1/2=1ghz。
例程所對應的dsp corepac主頻(sysclk1)為1ghz;相應外設控制器時鐘sysclk2~11是在此基礎上的分頻。
上述暫存器設定參看tms320c6678資料手冊及使用者手冊.
ddr3 pll為ddr3 儲存控制器提供介面時鐘;c6678上電復位後正常工作前需要為ddr3 pll程式設計配置有效的時鐘頻率。ddr3 pll的框圖:
該pll輸入時鐘ddrclk為外部輸入差分時鐘; 輸出時鐘pllout驅動ddr3介面,控制ddr3的資料讀寫速率。
ddr3 pll配置不需要專用pll 控制器,只需位於 bootcfg模組中的ddr3pllctn0和ddr3pllctn1,參考tms320c6678資料手冊7.7 ddr3pll部分的說明。在對該暫存器寫入配置前,需要先解鎖(un-locking)kick0/kick1暫存器;同樣修改配置暫存器後,需要鎖定(locking)kick0/kick1暫存器。
ddr3 pll配置暫存器各引數描述參考tms320c6678資料手冊;暫存器與main pll配置暫存器pllctn和secctn相似。
ddr3 pll初始化流程如下:
寫ddrp3llctn1暫存器ensat=1;
寫ddrp3llctn0暫存器bypass=1,設定pll工作於旁路模式;
寫ddrp3llctn1暫存器pllrst=1,pll被置位;
在ddrp3llctn0暫存器中的plld和pllm寫入分頻和倍頻值;
寫ddr3pllctn0暫存器bwadj[7:0]=((pllm+1)>>1)+1;
等待至少5us;
寫ddr3pllctn1暫存器pllrst=0,pll復位;
等待至少500refclk(plld+1);
寫ddr3pllctn0暫存器bypass=0,設定pll工作於pll模式;
DSP6678 乙太網啟動
今天終於從網路上啟動起來了6678開發板。這個流程一直跑了很多遍了,一直沒能找到問題出現在那裡,今天上午的時候抱著試一試的心態再次啟動一次,突然之間發現開發板開始向外發bootp包。回憶了之前的啟動流程我感覺開發板的dip開關撥碼沒有問題,但是之前一直是不能抓到包,昨天晚上的時候跑了ip論壇的ge例...
6678 多核啟動
6678多核載入啟動實現主要是通過0核完成。具體實現是dsp上電通過i2c,spi,emif等介面將應用程式載入到核心0執行,然後在核心0執行 裡實現另外7個核的啟動位址指定和傳送ipc中斷喚醒其餘7核。啟動實現詳見如下 1 暫存器定義 corepac0 7 ipc 觸發暫存器 ipcgrx def...
定點dsp與浮點dsp的比較
定點運算dsp在應用中已取得了極大的成功,而且仍然是dsp應用的主體。然而,隨著對dsp處理速度與精度 儲存器容量 程式設計的靈活性和方便性要求的不斷提高 自80年代中後期以來,各dsp生產廠家陸續推出了各自的32bit浮點運算dsp。和定點運算dsp相比,浮點運算dsp具有許多優越性 浮點運算ds...