當前位置:首頁 » 硬碟大全 » pll緩存
擴展閱讀
怎麼清除預覽圖片的緩存 2022-11-30 14:15:11
c語言創建有序鏈表 2022-11-30 14:08:06

pll緩存

發布時間: 2022-11-25 10:54:59

A. 超頻是什麼,怎麼弄

如何超頻【一】超頻原理 為了更好的超頻,超頻原理不可不學。以超頻最有效果的CPU 為例,目前CPU的生產可以說是非常精密的,以至於生產廠家都無法控制每塊CPU到底可以在什幺樣的頻率下工作,廠家實際上就已經自己做了次測試,將能工作在高頻率下的CPU標記為高頻率的,然後可以賣更高的價錢。但為了保證它的質量,這些標記都有一定的富餘,也就是說, 一塊工作在600MHZ的CPU,很有可能在800MHZ下依然穩定工作,為了發掘這些潛在的富餘部分,我們可以進行超頻。 此外,我們還可以藉助一些手段來使CPU穩定工作在更高的頻率上,這些手段主要是兩點:增加散熱效果、增加工作電壓。 對於電腦的其它配件,依然利用這樣的原理進行超頻,如顯示卡、內存、 甚至滑鼠等等。 好了,你已經開始著急了,我要超頻,得怎幺來呢?該如何下手? 【二】超頻准備 別著急,超頻之前要做一些准備,這些准備將使你超頻可以順利進行。磨刀不誤砍柴工,多准備一點沒壞處。 CPU散熱風扇 —— 非常關鍵的超頻工具,一定要買好風扇,絕對很值得! 導熱硅脂 —— 增加CPU和風扇散熱片之間的熱傳遞,很有用的東西,價格便宜。 導熱硅膠 —— 一般用來往晶元上粘貼小的散熱片,給主板晶元降溫、顯卡晶元降溫、給內存晶元降溫用。 小散熱片 —— 輔助降溫用,主要用來給發熱略大的晶元降溫。 【三】超頻CPU 最有效果的超頻,莫過於超頻CPU了,而且現在的CPU大多數都是可超的,我們就多說一說如何超頻電腦的CPU。 電腦的CPU工作頻率為主頻,它是由外頻和倍頻的乘積決定的,超頻CPU,超倍頻是最佳方案。但有的廠家為 防止我們超頻,將CPU的外頻鎖定了(這更證實了超頻的合理性),如Intel大部分的CPU都是鎖了外頻的。那幺對於這種CPU,我們也只能通過提升外頻來進行了。這種提升可能有局限,但可以帶來更大的好處。 目前的主流CPU有兩家:Intel的和AMD的。 1、Intel,CPU當之無愧的龍頭老大,它生產的CPU始終佔有相當大的市場。 2、AMD,CPU廠商中的後起之秀,也佔有相當的市場份額。 知道了自己的電腦是何種CPU之後,我們要查找它的最高可超頻率,以便確定超頻的目標,可超頻率可以在《各種CPU超頻編號大集合》中查到. 大家所使用的電腦中大多數都是用的這兩種CPU,當你確定了自己的CPU型號之後,還要確定CPU的核心工藝 和出廠日期。對於超頻來說,越先進的核心工藝就越好超,同一型號的CPU,出廠日期越*後的也越好超。如.18微米的內核工藝,則理論上最多能到1.2G左右。要想上再高的頻率只有用更好的工藝生產。 超頻CPU正式開始,分為以下幾步: 【1】更換好的散熱片:這步要看原來的CPU風扇和散熱片是否優良,優質的風扇價格一般都在50元以上,這筆投資盡量要保證。對於超頻非常有用。在換上優質風扇的同時,注意在CPU與風扇散熱片底座的接觸部分塗抹導熱硅脂,這樣可以提高散熱速度。 【2】提升CPU倍頻:此法目前僅適合K62和Duron以及T bird的CPU,如果是Duron和T bird還要用鉛筆來破解倍頻,很多文章有介紹,這里不再贅述。超倍頻需要主板支持修改倍頻,選購主板的時候要十分注意。 【3】提升CPU外頻:提升外頻可以帶來系統性能的大幅度提升,對於PIII處理器,目前的一般都是100外頻,只有超到133左右,在散熱優良而還可以加電壓的時候,甚至可到150以上。但在這時,需要您的電腦的內存、顯卡可以工作在如此之高的頻率之下。因此相對來說,100外頻的PIII處理器,是超外頻比較理想的CPU。此法跟提升CPU倍頻的方法一起用,效果最好。當然,這需要您的主板支持外頻的調節,有的主板支持逐兆調節,就是專門為了超外頻而設計的。 【4】增加電壓:增加電壓帶有一定的危險性,建議不採用,如確實需要增加電壓來增加超頻後的穩定性,則要一點一點的加,並監視溫度以策安全。對於Intel的CPU,稍微加一些電壓效果是明顯的;對於AMD的CPU,可以多加一些電壓。這里要提到的是主板要支持更改電壓,否則超頻餘地不會太大。如果是需要轉接卡的話,要注意選擇或更換可以調節電壓的轉接卡為上策。 【5】軟體超頻:軟體超頻是利用超頻軟體來進行的,例如技嘉的主板,就有可以軟體超頻的型號。這些軟體超頻的例子會在以後的文章中介紹。 一般的來說,超頻CPU只要按照以上的步驟,應該可以做到超頻成功的,至於超頻的幅度,就取決於您的機器 的各個配件的質量了,值得注意的是:超頻會縮短CPU的壽命,如果您想讓現在的機器能使用個十年八年的, 還是不要超頻為好。不過現在電腦的更新換代實是快,10年對於電腦來說,太漫長了…… 【四】超頻顯卡 對於狂熱的超頻愛好者來說,任何一個超頻的機會也不容錯過,顯卡是電腦中第二個可以超頻的對象,自然也倍受青睞,超頻顯卡也要看顯卡的晶元核心工藝,越先進的越耐超。 超頻顯卡除了超頻核心頻率以外,還可以超頻顯存頻率,為什幺市面上出現了很多使用5.5ns的顯存的顯卡呢? 就是因為顯存的反應時間越小,可超的頻率就越高,6ns顯存一般也能超到200M,5.5ns自然可超到更高。超頻顯存可能會帶來很多熱量,我們可以在顯存上粘貼散熱片來緩解這個問題。 【五】超頻滑鼠 不要奇怪,超頻滑鼠是指讓滑鼠的刷新率增加,不信你快速晃動滑鼠,你會發現其實滑鼠的游標也不是連續的,一般的PS2滑鼠刷新率是80HZ,也就是說1秒鍾畫出80個游標。當然,刷新率是越高越好的,這樣可以使得游標顯示效果細膩,改變刷新率是通過軟體更改的,目前有一款軟體叫PS2PLUS,它可將PS2滑鼠的刷新率刷到200!拿市面上隨處可見的普通的雙飛燕2D滑鼠來試驗,當運行刷新軟體將刷新率調整到200MHZ的時候,滑鼠變得非常好用,點擊准確,移動平滑,感覺跟100多元的羅技滑鼠相當啦!不花錢升級了滑鼠,何樂而不為!但要注意該軟體好象不能用在windows2000下,且不能改變USB滑鼠的刷新率,好在USB滑鼠的刷新率已經是120了,基本夠了。在前文提到的網址可以下載該軟體。 【六】超頻內存、硬碟 千萬別有誤會,超頻內存和硬碟,其實是不太可能的,我們所說的超頻,其實是指提升了CPU的外頻之後,匯流排頻率上升了帶來的內存、硬碟的工作頻率的提高,因為這兩樣東東可改變的東西更少了,幾乎就不能做什幺手腳,所以最好也不要進行超頻工作。前一陣子有的文章介紹可以超頻硬碟轉速,這也是騙人的空談,沒有理論基礎。至於內存的CAS=2和=3之分,效果也是很小的,可忽略不計。 【七】超頻測試 成功的超頻,應該禁得起嚴格的測試,一般是系統正常運行,軟體運行穩定,運行各種測試軟體表示性能確實穩定,無其它故障出現即可。 【八】幾種超頻性能很好的CPU介紹 很多朋友的超頻經歷告訴我們,如下的幾款CPU超頻性能很好: 1)PIII550E、PIII650E比較好超。 2)ron,生產日期*後的比較好超。 想來現在主要也只有這幾種東西可以超頻了,如果您已經成功的超頻了,並且很穩定,那幺恭喜您已經完成了少花錢升級的目標,但如果您達不到您的目的或者出現了超頻失敗,也不用灰心喪氣,我們來看看超頻失敗的幾種現象。 【超頻失敗現象小結】 現象一:系統可以啟動,但運行大的軟體的時候死機,而且時快時慢。 分析和解決:此時您的系統已經達到瓶頸,若不能略微降低CPU主頻,則應該利用提升電壓、增加散熱效果等手段來使之穩定下來。 現象二:電腦可以啟動,但進不了操作系統。分析和解決:您的電腦處在不能啟動的邊緣,您應該降低超頻幅度以求得穩定。 現象三:電腦不能啟動,完全黑屏。分析和解決:超的太高了,導致CPU運算頻繁出錯而無法正常工作,別太貪心,少超一點啦。 現象四:系統可以啟動,但屏幕時而出現斑塊花點。分析和解決:顯卡頂不住了,可考慮降低顯卡的超頻幅度或者匯流排的超頻幅度。 現象五:系統其它板卡工作不正常。但系統穩定。分析和解決:您的主板設計不良,導致超頻之後的電磁干擾增加,影響板卡的工作穩定性,可以換到距離比較遠的 插槽重新試驗,或者更換抗干擾能力強的板卡。 最後,還要重申超頻的原則,是合理超頻,適度超頻,如果因為一味追求超頻而使系統不穩定,那倒不如不超頻,穩定使用它比較舒服。畢竟電腦是讓我們來使用的,而不是做試驗的,您說是嗎?願廣大玩家超頻成功。

B. 請問:K10架構的雙核U,具體指什麼意思

AMD昨天在德國慕尼黑舉行了一次會議,由AMD歐洲、中東及非洲銷售與市場技術主管Giuseppe Amato詳細介紹了即將到來的K10架構處理器。AMD執行副總裁兼首席銷售與市場運營官Henri Richard曾將其稱為K8L,這一說法也廣為流傳,但現在,AMD官方已將其定名為K10。

K10將引入共享三級緩存,同時每個核心擁有自己的一級緩存和二級緩存。如果處理器請求的數據存在於一級緩存中,則直接載入;如果在任何一個二級緩存中,則直接或者通過交叉開關載入一級緩存,並將二級緩存中的原數據標記為無效,這也是AMD的獨特設計;如果在三級緩存中,則數據載入後仍然存在,其他核心還能繼續訪問,從而實現共享。

K10的整合內存控制器(IMC)將有一些新特性。在使用多個內存模組的情況下,如果BIOS設置和主板能夠配合,IMC就能通過64-bit通道訪問內存,使用ECC錯誤校驗的話則是72-bit。如此一來,讀取和寫入數據就能同步進行,也能提高四核心環境下無序訪問的效率。該功能僅限於Socket AM2+和Socket F+介面處理器,Socket AM2和Socket F則使用普通的128-bit雙通道模式。

由於K10四核心採用分離式能耗設計,IMC也可以根據各個處理器核心獨立自定頻率和電壓。這樣一來,處理器超頻的時候就無需顧及內存頻率,對超頻愛好者來說無疑是個好消息。同樣的,這一功能也只出現在Socket AM2+和Socket F+平台。

Amato還提及了一系列節能技術,可讓AMD四核心的熱設計功耗保持在目前雙核心的水平。與目前的K8和Intel Core 2不同,在K10中各個處理核心可以運行在獨立的頻率,AMD稱之為「P-States」,空閑的核心可以降低頻率甚至完全關閉,負載的則全速運行。K10還將配備新的熱感測器,以便改善過熱保護。

Amato指出,雖然K10更有利於超頻,但AMD不鼓勵這么做,而且AMD可以通過PLL確認處理器的損壞是否是超頻所致,是的話則不予質保。

AMD當然沒有忘記Intel的FSB前端匯流排。Intel的四核心互相通信繞道外部FSB,而K10四核心還是使用內部的交叉開關,全部在處理器之內完成,並且已經為八核心做好准備,代號「Montreal(蒙特利爾)」,具體發布時間暫未確定。首款發布的K10四核心代號「Barcelona(巴塞羅那)」,65nm工藝,4MB三級緩存,2008年升級為「Shanghai(上海)」,45nm工藝,6MB三級緩存,二者均兼容現有的Socket F平台

C. 什麼內存沒有寄存器或緩存

就是普通的DDR2 667啊,所有的普通內存都是沒有ECC校驗和寄存器的,只有伺服器用的內存才有,所以你可以放心購買。內存的牌子也就那麼幾個。

D. Barcelona核心介紹

Intel最早的Pentium M處理器引入了一項名為「dedicated stack manager」(專注堆棧管理器)的新特性,正如其名字所暗示的一樣,專注堆棧管理器專門處理所有的X86堆棧操作(例如push, pop, call, return等)。它將這些伐數據集中處理而無需其他執行單元參與,這尤其簡化了CPU整數執行單元的工作,加快了整數執行單元的處理速度。
AMD在Barcelona中也引入了類似的技術,AMD稱之為Sideband Stack Optimizer(邊帶堆棧優化器)。有了邊帶堆棧優化器,處理器中的伐指令不再需要經過3路編碼,也不再由整數執行單元處理,這加快了堆棧的處理速度,也同時加快了整數執行單元的處理速度。
在Intel Core微構架中一個重要改進是OOOE亂序執行:當裝載指令隊列發生等待時,處理器可以將隊列後方處於等待的指令優先裝載並執行,而不是一直等待到堵塞結束。平均而言,約30%的指令會發生一定時間的堵塞,這一亂序執行模式的引入,使新構架CPU性能有了明顯的提高。AMD的K8構架並不支持OOOE亂序執行指令,所以即使K8構架有優秀的內置內存控制器,也依然被對手的Core構架擊敗。正視這一技術上的落後,AMD在K8L構架的首款晶元Barcelona上及時改進為OOOE技術,這一改進必將為K8L構架的性能帶來極大的提高。
Barcelona將可以亂序執行指令,同樣也可以在前一指令尚未處理完成時,裝載並用空載單元處理下一指令,即使這兩條指令需要讀取不同的內存地址。Barcelona擁有3個地址生成單元,可以完成3個寄存指令每周期,而Core構架每周期只能執行1次-K8L構架的寄存速度要比Core構架強大3倍。
K8L構架中加入了新的SSE4指令擴展:SSEEXTRQ/INSERTQ指令和MOVNTSD/MOVNTSS指令。前者可以將多條指令合並為一條指令執行,後者用來計算流量寄存指令。Intel也會將在稍候發布的Penryn處理器中加入。
Intel Xeon伺服器所有使用的FB-DIMM內存一大優勢是,可以同時執行讀和寫命令到AMB,而在標準的DDR2內存中,你只能同時進行一個操作,而且讀和寫的切換會有非常大的損失。如果是一連串的隨機混合執行的話,將會帶來非常嚴重的資源浪費,而如果是先全部讀然後再轉換到寫的話,就可以避免性能的損失。K8內存控制器就採用讀取優先於寫的策略來提高運行效率,但是Barcelona則更加智能化。
但是讀取的數據會被先存放在buffer中,而不採用先直接執行寫,但當它的容量達到了極限就會溢出,為了避免這種情況,在此之前才對讀寫之間進行切換,同時可以帶來帶寬和延遲方面效率的提高。K8核心配備的是128-bits寬度的單內存控制器,但是在Barcelona中,AMD把它分割成兩個64-bit,每個控制器可以獨立的進行操作,因此它可以帶來效率上的不小提升,尤其是在四核執行的環境下,每個核心可以獨立佔有內存訪問資源。
Barcelonas中集成的北橋部分(注意不是主板北橋)也被設計成更高的帶寬,更深的buffers將允許更高的帶寬利用率,同時北橋自身已經可以使用未來的內存技術,比如DDR3。
內存控制器的預取功能是運用相當廣泛、十分重要的一項功能。預取可以減少內存延遲對整體性能的負面影響。當NVIDIA發布nForce2主板時,重點介紹的就是nForce2晶元組的128位智能預取功能。Intel在發布Core 2處理器之時也強調了CORE構架每核心擁有三個預取單元。
K8構架中每個核心設計有2個預取器,一個是指令預取器,另一個是數據預取器。K8L構架的Barcelona保持了2個的數量,但在性能上有了較大的改進。一個明顯的改進是數據預取器直接將數據寄存入L1緩存中,相比K8構架中寄存入L2緩存的做法,新的數據預取器准確率更高,速度更快,內存性能及CPU整體性能將得益於此。
受工藝技術方面的影響,AMD處理器的緩存容量一直都要落後於Intel,AMD自己也清楚自己無法在寶貴的die上加入更多的晶體管來實現大容量的緩存,但是勇於創新的AMD卻找到了更好的辦法——集成內存控制器。
處理器整合內存控制器可以說是一項傑作,擁有整合內存控制器的K8構架僅依靠512KB的L2緩存就能夠擊敗當時的對手Pentium 4。直到現在的Athlon 64 X2也依然保持著Intel 2002年就已過時的512KB L2緩村。
現在Core 2已經擁有了4MB的L2緩存,看來Intel和AMD之間的緩存差距還將保持,因為Barcelona的L2緩存依然是512KB。相比之下,Intel四核的Kentsfield晶元擁有8MB的L2緩存,而2007年末上市的新型Penryn晶元將擁有12MB的L2緩存。
Barcelona的緩存體系和K8構架有一定的相似之處,它的四顆核心各擁有64KB的L1緩存和512KB的L2緩存。從簡化晶元設計的角度來看,四核心共享巨大的L2緩存對K8L構架而言並不合適,所以AMD引入了L3緩存,得益於65nm工藝,Barcelona在一顆晶圓上集成四顆核心外,還集成了一塊2MB容量的L3緩存。也就是說L3緩存與4顆內核同樣原生於一塊晶圓,其容量為最小2M起跳。同L2緩存一樣,L3緩存也是獨立的,L1緩存的數據和L3緩存的數據將不會重復。
Barcelona的緩存工作原理是:L2緩存是作為L1緩存的備用空間。L1緩存儲存著CPU當前最需要的數據,而當空間不足時,一些不是最重要的數據就轉移到L2緩存中。而當未來再次需要時,則從L2緩存中再次轉移到L1緩存中。新加入的L3緩存延續了L2緩存的角色,四顆核心的L2緩存將溢出的數據暫時寄存在L3緩存中。
L1緩存和L2緩存依然分別是2路和16路,L3緩存則是32路。快速的32路L3緩存不僅可以更好的滿足多任務並行,而且對單任務的執行也有著較大積極作用。尤其在3D運用方面,2MB的L3緩存將對性能產生極大的推進作用。
虛擬化技術在未來將有著更廣泛的應用,以往是伺服器處理器的標志,現在也漸漸被更多桌面處理器所支持。在虛擬技術方面,Barcelona也有了很大的改進,由於採用了更快的虛擬地址轉換演算法,在擁有多個客戶操作系統的虛擬軟體堆棧中,有一個內存地址轉換必須處理,客戶系統向系統管理程序的地址轉換,因為每個客戶系統擁有獨立的內存管理,
據AMD表示,在此之前這個轉換過程都是通過軟體來實現的,並且是基於一個叫shadow paging的技術,而Barcelona提供的是硬體級加速轉換,AMD把它稱為Nested Paging。根據推算大約系統管理程序所消耗的75%的時間是用於shadow paging,轉換的地址是在Barcelonas TLBs中被緩存的,而且AMD指出Nested Paging並不需要太復雜的設定,這對於軟體開發商來說就變得非常簡單。
處理器的功耗問題開始被越來越多的人重視,目前的Intel四核的功耗非常高,而Barcelona的四個核心工作電壓都一樣,同時內部的北橋單元則使用獨立的電壓計劃,可以根據另外一個工作情況在0.8V到1.4V之間改變,它們的電壓可以獨立管理,這將提高功耗效率。獨立的核心雖然共享同樣的電壓,但是每個核心都擁有自己的PLL電路,所以它們可以根據負載情況,運行在不同的頻率下。
Barcelona每個核心支持五個獨立的p-states(頻率等級)轉換,改變只是在頻率上,p-states完全是硬體控制的,所以我們不需要驅動就可以開啟這個功耗管理特性,同時AMD也增加了clock gating(時鍾頻率比)的數量,配合最新的65nm工藝,保證AMD首款四核處理器的功耗表現和目前的雙核Opteron一樣。

E. 項目 數據 內存模塊 模塊容量 512 MB (1 rank, 4 banks) 模塊位寬 64 bit 存取方式 DDR SDRAM 內存速度 PC

你的板子和我的一樣,我的U是賽揚331。這個板子品牌是soltek(碩泰克)威盛的晶元,集成威盛的V3顯卡。這個板子最高支持DDR2 533的二代內存,建議加個同樣品牌的512內存,或者直接換個1G的,記住,DDR2 800也可以用,只不過被認成533來用,1G的800內存才不到200塊錢,值得一試。 還有,建議上一個AGP 8X的獨顯,我加個ATI 9550,上網可以,一般的非大型游戲(穿越火線,QQ飛車)這類游戲都可以玩,呵呵,望樓主採納!

F. 本人想用stm32的DAC輸出固定電壓值,,有人之前調試過這個項目嗎我急需常式。求解救。

玩了幾天模擬電路,因做程式控制放大電路,需要輸出可調電壓,於是轉戰STM32上來了,採用DMA通道輸出DAC,輸出為一正弦波。
DAC配置略顯簡單,由於悟性不夠,部分原因還是不懂。DMA通道傳送DAC時,選取DAC_Channnel2程序很好使,而改為DAC_Channnel1時,相應地址等均作改變,但是就是沒有波形輸出,無果。
選用TIM2作定時器觸發,TIM2在APB1上,最高頻率36MHz,預分頻系數為1時測出正弦波形頻率經換算頻率為72MHz,而預分頻系數為2時,換算頻率為36MHz,正常情況應該相等的,不明所以。查詢資料,有博客上說,採用默認庫配置,TIM2最高頻率可以為72MHz,不理解。於是更改程序,自己配置時鍾,預分頻系數為1時依然為72MHz,而預分頻系數為2時,頻率為36MHz,無果

//purpose: DA轉換,DAC1->PA4管腳輸出轉換後的模擬值 ,DAC2->PA5
// 產生正弦波頻率= 主頻/(TIM_Prescaler+1)/TIM_Period/產生一個正弦波的點數

#include "stm32f10x.h"

#define DAC_DHR12R2_Address 0x40007414 //相應地址通過數據手冊和參考手冊去查詢

/* Init Structure definition */
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

const uint16_t Sine12bit[32] = { //數據源用來產生波形
2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
uint32_t DualSine12bit[32];
uint32_t Idx = 0;

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void TIM_Configuration(void);
void DAC_Configuration(void);
void DMA_Configuration(void);
void GPIO_Configuration(void);

int main(void)
{

/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
*/

// System Clocks Configuration
RCC_Configuration();

/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically
connected to the DAC converter. In order to avoid parasitic consumption,
the GPIO pin should be configured in analog */
GPIO_Configuration();

TIM_Configuration();

DAC_Configuration();
for (Idx = 0; Idx < 32; Idx++)
{
DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]); //雙通道輸出正弦波
}

DMA_Configuration();

/* Enable DMA for DAC Channel1 */
DAC_DMACmd(DAC_Channel_2, ENABLE);

/* TIM6 enable counter */
TIM_Cmd(TIM6, ENABLE);

while (1)
{
}
}

/**
* @brief Configures the different system clocks.
* @param None
* @retval None
*/
void RCC_Configuration(void)
{
//時鍾配置,不使用庫默認時鍾配置
ErrorStatus HSEStartUpStatus; //定義外部高速晶體啟動狀態枚舉變數
RCC_DeInit(); //復位RCC外部設備寄存器到默認值
RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速時鍾准備好
if(HSEStartUpStatus == SUCCESS) //外部高速時鍾已經准別好
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)時鍾=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)鍾=AHB時鍾
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)鍾=AHB 1/2時鍾
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置ADC時鍾=PCLK2 1/4

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL時鍾 == 外部高速晶體時鍾*9
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //配置ADC時鍾= PCLK2/4
RCC_PLLCmd(ENABLE); //使能PLL時鍾
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL時鍾就緒
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系統時鍾 = PLL時鍾

while(RCC_GetSYSCLKSource() != 0x08) //檢查PLL時鍾是否作為系統時鍾
{
}
}

// DMA2 clock enable
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

/* GPIOA Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* DAC Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* TIM2 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
}

void TIM_Configuration(void)
{
// Time base configuration
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 25-1; //計數周期25
TIM_TimeBaseStructure.TIM_Prescaler = 1-1; //預分頻系數1
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
// TIM6 TRGO selection */
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); //觸發源更新
}

void DAC_Configuration(void)
{
// DAC channel1 Configuration
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; //DAC觸發 TIM6觸發
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用內部波形發生器
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //關閉外部輸出緩存
DAC_Init(DAC_Channel_1, &DAC_InitStructure); //用DAC輸出波形,傳輸的數據比較多,所以採用DMA傳輸可以節省CPU的開支
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
// Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter
DAC_Cmd(DAC_Channel_1, ENABLE);
DAC_Cmd(DAC_Channel_2, ENABLE);

}
void DMA_Configuration(void)
{
DMA_DeInit(DMA2_Channel4); //將dma的通道寄存器設為默認值

DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address; //定義dma外設基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外設作為數據傳輸的目的地
DMA_InitStructure.DMA_BufferSize = 32; //dma緩存大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址寄存器不變
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存地址寄存器 遞增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外設數據寬度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循環緩存模式,數據傳輸數目為0時,自動恢復配置初值
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //通道未被設置成內存到內存模式,與循環模式相對

DMA_Init(DMA2_Channel4, &DMA_InitStructure); //將DMA_InitStructure中指定的參數初始化dma的通道寄存器
// Enable DMA2 Channel4
DMA_Cmd(DMA2_Channel4, ENABLE); //使能通道
}

/**
* @brief Configures the different GPIO ports.
* @param None
* @retval None
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically
connected to the DAC converter. In order to avoid parasitic consumption,
the GPIO pin should be configured in analog */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; //一旦DAC通道使能,相應的GPIO PA4,PA5自動與DAC的模擬輸出相連,
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //為了避免避免寄生的干擾和額外的功耗,PA4 置成模擬輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
想輸出固定電壓,將數組里的數都變成一個數就可以了

轉自http://haoxi.spaces.eepw.com.cn/articles/article/item/97855
望採納。

G. STM32結構體地址偏移問題

STM32學習筆記——測試閃燈程序

Created on: 2012-10-28
Author: zhang bin

學習筆記
for STM32F103C8
redesigned by zhang bin
2012-10-28
versions:V-0.1
All Rights Reserved

//所使用的是STM32F103C8共有48個管腳,共有兩組GPIO,為GPIOA和GPIOB,每組有從0到15共16個引腳
//注意對STM32F103C8的操作和對庫函數的使用,在使用時,要時刻參考《STM32F10xxx使用手冊》和《STM32的函數說明》這兩個文檔

#include "stm32f10x_lib.h"

GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO配置的結構體變數 包括GPIO引腳,引腳速度,引腳模式
ErrorStatus HSEStartUpStatus; //枚舉類型,錯誤狀態變數定義 存儲外部高速時鍾HSE狀態

void RCC_Configuration(void); //RCC配置函數 RCC:復位和時鍾控制
void NVIC_Configuration(void); //NVIC配置函數 NVIC:嵌套向量中斷控制器
void Delay(vu32 nCount);

int main(void)
{
#ifdef DEBUG
debug();
#endif

RCC_Configuration(); //系統時鍾配置函數

NVIC_Configuration(); //NVIC配置函數

//使能APB2匯流排外設時鍾 APB1,APB2兩條連接匯流排的外設。具有多個預分頻器用於配置AHB的頻率,高速APB(APB2)和低速APB(APB1)
//區域。AHB和高速APB的最高頻率為72MHz,低速APB的最高頻率為36MHz
//APB2是的I/O腳可達18MHz的反轉速度
//AHB到APB(1,2)橋,該橋用來連接所有的APB設備
//兩個AHB/APB橋在AHB和兩個APB匯流排之間提供完全同步地方連接。APB1被限制在36MHz,APB2工作在全速狀態(根據設備的不同
//可以達到72MHz)
//有些外設連接到APB1上,有些外設連接到APB2上,具體的情況參看使用手冊。
//所以在外設使用前,要先調用函數使能相應匯流排的時鍾

//通用輸入/輸出GPIO 備用輸入/輸出AFIO
//IO埠寄存器必須以32位字的方式訪問,不允許以半字或者位元組的方式訪問
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能相應的外設的時鍾
//這里使能GPIOA,GPIOB和備用IO (AFIO)的時鍾

//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //關閉調試 埠重新映射 使用模擬器調試時,不能用此語

//下面是GPIO的設置,注意方法
//配置相應的IO。注意配置IO功能時,使用的是GPIO配置的結構體。前面已經定義了GPIO的結構體變數
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 選擇所有腳 #define GPIO_Pin_All ((u16)0xFFFF)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置成推挽式輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出模式下 I/O輸出速度 50M HZ
GPIO_Init(GPIOA, &GPIO_InitStructure); //用定義的結構體初始化PA口
GPIO_Init(GPIOB, &GPIO_InitStructure); //用定義的結構體初始化PB口

while (1)
{
GPIO_Write(GPIOB, (u16)~GPIO_ReadOutputData(GPIOB)); //寫一個字數據到PB口 寫入的數據是當前GPIOB讀取的值然後取反
//就相當於把GPIOB的值取反
Delay(0x8FFFFF); // 延時
GPIO_Write(GPIOB, (u16)~GPIO_ReadOutputData(GPIOB)); //寫一個字數據到PB口 把GPIOB的值取反
Delay(0x8FFFFF); // 延時
}
}

//復位和時鍾設置函數 注意配置的方法
void RCC_Configuration(void)
{
//復位RCC外部設備寄存器到默認值
RCC_DeInit(); //將外設RCC寄存器重設為預設值

//打開外部高速晶振
RCC_HSEConfig(RCC_HSE_ON); //設置外部高速晶振HSE RCC_HSE_ON:打開HSE晶振,RCC_HSE_OFF:關閉HSE晶振
//RCC_HSE_Bypass:HSE晶振被外部時鍾旁路

//等待外部高速時鍾准備好
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振,返回錯誤狀態。前面已經定義了ErrorStatus枚舉類型的變數
//HSEStartUpStatus,SUCCESS:HSE晶振穩定且就緒,ERROR:HSE晶振未就緒

if(HSEStartUpStatus == SUCCESS) //外部高速時鍾已經准備好
{
//開啟FLASH的預取功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能或失能預取指緩存,FLASH_PrefetchBuffer_Enable:預取指緩存使能
//FLASH_PrefetchBuffer_Disable:預取指緩存失能

//FLASH延遲2個周期
FLASH_SetLatency(FLASH_Latency_2); //設置FLASH存儲器代碼延時時鍾周期數,可以設置FLASH_Latency_0:0延時周期,
//FLASH_Latency_1:1延時周期,FLASH_Latency_2:2延時周期

//配置AHB(HCLK)時鍾=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);//設置AHB時鍾是系統時鍾SYSCLK的多少分頻,這里設為1分頻,還可以指定2,4,8,16,64,128,256,512
//分頻

//配置APB2(PCLK2)鍾=AHB時鍾
RCC_PCLK2Config(RCC_HCLK_Div1); //設置高速AHB時鍾APB2是AHB的多少分頻,這里設為1分頻,還可以指定為2,4,8,16分頻

//配置APB1(PCLK1)鍾=AHB 1/2時鍾
RCC_PCLK1Config(RCC_HCLK_Div2); //設置低速AHB時鍾APB1是AHB的多少分頻,這里設為2分頻,還可以指定為1,2,4,8,16分頻

//配置PLL時鍾 == 外部高速晶體時鍾*9 PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //設置PLL時鍾及倍頻系數 第一個參數設置PLL的輸入時鍾源
//可以有RCC_PLLSource_HSI_Div2:HSI時鍾頻率除以2,RCC_PLLSource_HSE_Div1:HSE時鍾頻率,RCC_PLLSource_HSE_Div2:
//HSE時鍾頻率除以2
//第二個參數設置PLL的倍頻系數,可以是2~16倍頻,這里設為9倍頻
//警告:必須正確設置軟體,使PLL輸出時鍾頻率不超過72MHz

//使能PLL時鍾
RCC_PLLCmd(ENABLE); //使能或失能PLL,參數可以取ENABLE或DISABLE,如果PLL被用於系統時鍾,那麼它不能被失能

//等待PLL時鍾就緒
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //檢查指定的RCC標志位設置與否,輸入參數為待檢查的RCC標志位
//其取值情況詳見《STM32的函數說明(中文)》P211.返回值為RCC_FLAG的新狀態,SET或RESET
{
}

//配置系統時鍾 = PLL時鍾
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //設置系統時鍾SYSCLK,輸入參數用於指定用作系統時鍾的時鍾源
//可以為:RCC_SYSCLKSource_HSI:選擇HSI作為系統時鍾,RCC_SYSCLKSource_HSE:選擇HSE作為系統時鍾,RCC_SYSCLKSource_PLLCLK
//選擇PLL作為系統時鍾

//檢查PLL時鍾是否作為系統時鍾
while(RCC_GetSYSCLKSource() != 0x08) //函數RCC_GetSYSCLKSource()返回用作系統時鍾的時鍾源。
//返回值可以是:0x00:HSI作為系統時鍾,0x04:HSE作為系統時鍾,0x08:PLL作為系統時鍾
{
}
}
}

//嵌套向量中斷控制器配置函數
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //設置向量表的位置和偏移,第一個參數指定向量表的位置在RAM還是在
//程序存儲器flash中,取值可以是NVIC_VectTab_RAM:向量表位於RAM, NVIC_VectTab_FLASH:向量表位於FLASH。第二個參數為
//向量表基地址的偏移量,對於FLASH,該參數值必須高於0x08000100,對於RAM,必須高於0x100.它同時必須是256(64*4)的整數倍
#else

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}

void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}

#ifdef DEBUG

//assert_failed編寫於文件main.c或其他用戶C文件中

void assert_failed(u8* file, u32 line)
{

while (1)
{
}
}
#endif

H. 新編譯的dll不生效dll緩存

系統故障。用戶新下載的dll不能進行緩存時系統出現故障導致的。dll是延遲鎖相環的簡稱,該技術是在PLL技術上改進得到的,被廣泛應用於時序領域中。

I. ZYNQ7000 啟動流程解析

存放在ZYNQ晶元內部ROM不可更改,用於找到FSBL並啟動它(從SD或者QSPI或者NAND),ug585第六章

用於引導U-Boot

用於引導Linux Kernel

petalinux工具可以構建2和3還有內核

BOOT.BIN包括fsbl,bitstream,用戶程序(uboot)

image.ub包括了kernel(devicetree DTB和rootfs通過設置可選包不包含在ub內)

主要是分析下FSBL工程的main函數

調用ps7_init函數

主要是對PS端配置信息進行初始化操作,包括MIO,PLL,CLK and DDR

我們在vivado軟體中可以通過圖形化的方式對ZYNQ PS端外設進行相關配置,那麼這些配置信息會寫入到hdf文件,SDK(或petalinux)會對hdf文件進行解析並生成對應的寄存器配置表,然後FSBL工程中會通過ps7_init函數將寄存器配置表寫入到對應的寄存器中,完成對MIO/PLL/CLK/DDR等外設的硬體配置。

先調用Xil_DCacheFlush函數完成刷DCache緩存的操作,然後再調用Xil_DCacheDisable禁用DCache緩存。

調用RegisterHandlers函數

調用DDRInitCheck函數

調用InitPcap函數

處理器配置訪問埠

這個寄存器記錄ZYNQ的啟動方式(QSPI、SD、NAND、Nor、JTAG)

可以通過MIO3 MIO4  MIO5這三個引腳去配置ZYNQ的啟動方式

ZYNQ上電復位的時候,會將這三個引腳的電平狀態保存在BOOT_MODE寄存器當中。

每一種啟動方式會有不同的處理方式。

第一、先初始化對應的flash設備

第二、再將MoveImage函數指針指向Flash設備的讀寫函數實體

調用LoadBootImage函數

FSBL的主要工作是啟動U-Boot(終極目標),也要將bitstream文件載入到PL端。

找到U-Boot、bitstream

在讀取U-Boot拷貝DDR中對應的載入地址,讀取bitstream載入到PL端

調用FsblHandoff(HandoffAddress)

啟動完U-Boot之後,FSBL的使命的就完成了。