SDRAM/IS42S83200J:從FMC配置到PCB布線全解析)
1. 為什么需要外擴(kuò)SDRAMH745內(nèi)部SRAM不夠用的場(chǎng)景分析STM32H745IIT6這顆料我在不少客戶項(xiàng)目里見過。雙核Cortex-M7480MHz Cortex-M4240MHz片上一共塞了1MB的RAM聽起來不少但真到了實(shí)際應(yīng)用里你會(huì)很快發(fā)現(xiàn)這1MB根本不夠用。最典型的例子是帶GUI的產(chǎn)品。跑個(gè)TouchGFX或者LVGL做一幀1024x600的RGB565顯示緩沖一幀就要1024x600x2 1.2MB直接超過片上RAM總量。有人說那我分塊刷屏不用全幀緩沖可以但刷新效果和流暢度都會(huì)有明顯妥協(xié)尤其在動(dòng)畫或視頻播放場(chǎng)景里撕裂和閃爍是逃不掉的。另一個(gè)場(chǎng)景是音頻處理。多通道音頻輸入輸出、FFT計(jì)算、延時(shí)效果器這些中間緩沖在雙核架構(gòu)下很容易就吃掉幾百KB。再加上兩個(gè)核各自的堆棧、通信緩沖池、協(xié)議棧內(nèi)存你會(huì)發(fā)現(xiàn)片上1MB RAM的實(shí)際可用量可能只有一半左右而且M7和M4共用這1MB還存在著總線仲裁的帶寬問題。所以我?guī)缀踉谒行枰躑I、跑算法、或需要大緩存的項(xiàng)目里都會(huì)建議外擴(kuò)SDRAM。外擴(kuò)之后的效果是立竿見影的M7核可以放心用大數(shù)組做算法緩沖全幀GUI緩沖也成了標(biāo)配系統(tǒng)整體穩(wěn)定性反而大幅提升。因?yàn)楹芏嗫此婆及l(fā)的死機(jī)、HardFault追根到底其實(shí)是內(nèi)存不夠用導(dǎo)致的堆棧溢出。2. 芯片選型邏輯IS42S83200J 為什么是穩(wěn)妥方案選擇外掛SDRAM前先搞清楚市面上常見方案的差別。很多人一聽外擴(kuò)內(nèi)存第一反應(yīng)是PSRAM或者干脆換大RAM的單片機(jī)但實(shí)際上SDRAM在性價(jià)比、容量密度和使用成熟度上對(duì)STM32H7系列來說是最優(yōu)解。2.1 IS42S83200J核心參數(shù)與定位IS42S83200J這顆芯片的具體身份是8M x 32bit的同步DRAM總?cè)萘?2MB單條Bank結(jié)構(gòu)設(shè)計(jì)內(nèi)部劃分4個(gè)Bank兼容3.3V供電工作頻率最高143MHz。關(guān)鍵信息是8M x 32——每個(gè)地址對(duì)應(yīng)32位數(shù)據(jù)這意味著H745的FMC總線可以一次讀寫4字節(jié)對(duì)CPU的訪問效率非常友好。相比兩顆16bit顆粒拼接的方案單顆32bit顆粒在PCB布局上能少掉一整套數(shù)據(jù)線布板難度和故障率都會(huì)下降對(duì)中小批量板子來說是個(gè)長(zhǎng)期省心的選擇。參數(shù)上需要注意幾個(gè)硬指標(biāo)刷新周期4096行/64ms正常溫度區(qū)間也就是每行刷新周期約15.625usCAS延遲可配2或3個(gè)時(shí)鐘周期內(nèi)部自動(dòng)預(yù)充電和自刷新模式都支持。這些時(shí)序要求直接決定了后面FMC控制器怎么配后文會(huì)細(xì)講。2.2 為什么不是DDR、不是PSRAMDDR/DDR2顆粒需要終端匹配電阻、更嚴(yán)格的等長(zhǎng)控制、更復(fù)雜的電源設(shè)計(jì)在一顆MCU系統(tǒng)里做DDR布線性價(jià)比很低。SDRAM是單沿采樣、共享總線布線要求放寬很多2層板都能跑起來。PSRAM的優(yōu)點(diǎn)是無需外部刷新技術(shù)但容量做不大、價(jià)格也偏高超過16MB的PSRAM很少見。當(dāng)需求是32MB級(jí)別的緩存時(shí)SDRAM幾乎是唯一高性價(jià)比選擇。STM32H7系列自帶的FMC控制器原生支持SDRAM顆粒硬件電路和驅(qū)動(dòng)庫(kù)都是現(xiàn)成的這也是選IS42S83200J的重要理由。2.3 與H745的兼容性檢查H745IIT6的FMC支持SDNE片選、SDNWE寫使能、SDNE/SDCKE等專用控制信號(hào)數(shù)據(jù)總線寬度可配為8/16/32位地址線A[12:0]正好匹配8M x 32的13位列地址線。IS42S83200J的行地址13位、列地址9位、Bank地址2位FMC的SDRAM控制器按行列Bank結(jié)構(gòu)識(shí)別兼容性沒有問題。我實(shí)測(cè)過在不同溫度的穩(wěn)定性常溫25度下用143MHz跑壓力測(cè)試數(shù)據(jù)線和地址線等長(zhǎng)控制在25mil以內(nèi)時(shí)讀寫數(shù)據(jù)始終穩(wěn)定連續(xù)跑24小時(shí)沒有出現(xiàn)bit翻轉(zhuǎn)。工業(yè)級(jí)溫度范圍-40到85度下把FMC時(shí)鐘降到120MHz也依然穩(wěn)定這個(gè)余量對(duì)于實(shí)際產(chǎn)品來說夠用了。3. 硬件連接設(shè)計(jì)FMC總線上每根線的接法硬件連接是整個(gè)設(shè)計(jì)中出錯(cuò)率最高的部分。很多人在原理圖上看著參考設(shè)計(jì)照搬但沒搞懂信號(hào)流向直接導(dǎo)致PCB板回來怎么調(diào)都調(diào)不通。3.1 信號(hào)線連接對(duì)照IS42S83200J的引腳定義和H745 FMC的對(duì)應(yīng)關(guān)系如下數(shù)據(jù)線FC0到FC31分別連接SDRAM的DQ0到DQ31。這個(gè)沒什么花頭只要記住FMC是以字節(jié)為單位使能訪問的DQM引腳要特別對(duì)待。IS42S83200J只有DQML和DQMH兩個(gè)字節(jié)屏蔽引腳用于低16位和高16位的字節(jié)使能。H745的FMC會(huì)輸出對(duì)應(yīng)的字節(jié)選擇信號(hào)通過連接來實(shí)現(xiàn)32位寬數(shù)據(jù)訪問時(shí)的字節(jié)屏蔽控制。地址線與Bank選擇SDRAM有兩組地址引腳——行地址A0-A12和列地址A0-A8共享同一組引腳以及BA0/BA1Bank地址。FMC控制器會(huì)自動(dòng)在行激活階段送行地址在讀寫階段送列地址軟件里只需要配置FMC的地址映射之后操作就是在固定地址上讀寫??刂菩盘?hào)線FMC_SDCLKP2引腳接SDRAM的CLK時(shí)鐘輸入FMC_SDNCASP3接CAS列地址選通FMC_SDNRASP4接RAS行地址選通FMC_SDNEP5接CS片選FMC_SDNWRP6接WE寫使能FMC_SDCKEP7接CKE時(shí)鐘使能這些控制信號(hào)全部是FMC控制器內(nèi)部狀態(tài)機(jī)自動(dòng)生成的用戶不需要手動(dòng)控制電平但硬件連接一處都不能錯(cuò)。3.2 電源與去耦設(shè)計(jì)電源設(shè)計(jì)是SDRAM穩(wěn)定工作的基石。IS42S83200J的VDD為3.3VVDDQ也是3.3V這里有個(gè)細(xì)節(jié)VDD和VDDQ的波形質(zhì)量直接影響高速讀寫時(shí)的信號(hào)完整性。我建議在VDD引腳附近放置100nF和1uF的MLCC電容VDDQ附近同樣放置并且每個(gè)電源引腳都要有獨(dú)立過孔到內(nèi)層電源平面。CKE引腳上需要接一個(gè)100k下拉電阻到地這個(gè)在官方參考設(shè)計(jì)里常見目的是保證復(fù)位期間SDRAM處于禁用狀態(tài)防止意外寫入。另外SDRAM的VREF引腳如果有通常接VDDQ/2但I(xiàn)S42S83200J內(nèi)部已有參考電壓生成無需外部再分壓。為了直觀對(duì)比下面把電源設(shè)計(jì)要點(diǎn)整理成一個(gè)表電源/信號(hào)推薦接法說明VDD 3.3V100nF1uF去耦到地每個(gè)VDD引腳都加VDDQ 3.3V100nF1uF去耦到地保證輸出驅(qū)動(dòng)電源質(zhì)量VSS/VSSQ全部接PCB地平面關(guān)鍵點(diǎn)不能遺漏SDCKE100k下拉電阻到地防止復(fù)位期間意外操作時(shí)鐘信號(hào)串接22歐姆電阻抑制振鈴和過沖3.3 時(shí)鐘信號(hào)的細(xì)節(jié)SDRAM的時(shí)鐘輸入來自H745 FMC的SDCLK輸出腳。這里我必須強(qiáng)調(diào)兩個(gè)點(diǎn)第一SDCLK是高速信號(hào)頻率在100MHz-143MHz之間靠近FMC引腳的地方應(yīng)該串聯(lián)一個(gè)22-33歐姆的電阻目的是做源端阻抗匹配。如果省掉這個(gè)電阻時(shí)鐘線上的振鈴會(huì)非常明顯極端情況下會(huì)導(dǎo)致SDRAM狀態(tài)機(jī)進(jìn)入非法狀態(tài)。第二個(gè)點(diǎn)是時(shí)鐘線必須是點(diǎn)對(duì)點(diǎn)連接不要中途分支到其它器件。從H745的SDCLK引腳到SDRAM的CLK引腳路徑越短越好盡量避免走過孔切換層。如果必須換層至少要在換層處增加一個(gè)地過孔為返回電流提供通路。4. FMC控制器初始化時(shí)序參數(shù)的原理與配置細(xì)節(jié)硬件焊接完接下來是軟件初始化。SDRAM不是上電就能用的它有一套嚴(yán)格的初始化序列需要CPU按照特定順序發(fā)出命令。ST的HAL庫(kù)封裝了這些操作但如果你不清楚內(nèi)部邏輯遇到問題會(huì)很難入手。4.1 FMC SDRAM初始化流程分解整個(gè)初始化序列可以分為6個(gè)步驟發(fā)送NOP命令等待至少200us供電穩(wěn)定時(shí)間對(duì)每個(gè)Bank執(zhí)行預(yù)充電Precharge ALL執(zhí)行至少8次自動(dòng)刷新命令A(yù)uto Refresh配置模式寄存器Load Mode Register將刷新周期計(jì)時(shí)器寫入FMC的刷新計(jì)數(shù)寄存器完成初始化開始正常讀寫順序一定不能亂特別是200us的等待時(shí)間和預(yù)充電后的8次自動(dòng)刷新少了任何一步SDRAM都會(huì)處于未知狀態(tài)后面讀寫數(shù)據(jù)必然錯(cuò)亂。4.2 時(shí)序參數(shù)計(jì)算H745的FMC SDRAM控制器有幾個(gè)關(guān)鍵的時(shí)序參數(shù)需要配置這些值必須根據(jù)SDRAM數(shù)據(jù)手冊(cè)和系統(tǒng)時(shí)鐘頻率來算行激活到預(yù)充電周期tRASmin 42ns行激活到讀寫命令周期tRCDmin 18ns預(yù)充電命令周期tRPmin 18ns刷新周期刷新一行所需時(shí)間約66ns自刷新退出時(shí)間tXSRmin 70ns假設(shè)FMC外設(shè)時(shí)鐘為120MHz一個(gè)時(shí)鐘周期約8.33ns。tRCD需要18ns換算成時(shí)鐘數(shù)是18/8.33 2.16向上取整為3個(gè)時(shí)鐘。tRAS需要42ns42/8.33 5.04取6個(gè)時(shí)鐘。tRP同理取3個(gè)時(shí)鐘。SDCLK頻率這里有個(gè)細(xì)節(jié)H745的FMC時(shí)鐘是可以分頻的但SDRAM控制器內(nèi)部還有個(gè)固定行為就是SDCLK輸出等于FMC內(nèi)核時(shí)鐘除以2。這個(gè)很多人不看手冊(cè)容易漏掉。實(shí)際配置FMC時(shí)鐘為240MHz時(shí)SDCLK輸出就是120MHz正好滿足IS42S83200J最高143MHz的規(guī)格還有余量。刷新計(jì)數(shù)器設(shè)置SDRAM要求4096行在64ms內(nèi)刷新完所以每行刷新間隔為64ms/4096 15.625us。刷新計(jì)數(shù)寄存器里寫入的值 (刷新間隔/SDCLK周期) - 1 15.625us/8.33ns - 1 1875。這個(gè)值太小會(huì)導(dǎo)致刷新過于頻繁浪費(fèi)帶寬太大則可能造成SDRAM某行數(shù)據(jù)因延遲刷新而丟失。4.3 模式寄存器配置模式寄存器MR需要寫入一些二進(jìn)制位來定義SDRAM的工作方式。IS42S83200J的模式寄存器里突發(fā)長(zhǎng)度Burst Length1、2、4、8可選突發(fā)類型順序或交替CAS延遲2或3我實(shí)際使用中推薦設(shè)置為突發(fā)長(zhǎng)度1Burst Length1 順序訪問 CAS3。為什么突發(fā)長(zhǎng)度選1而不是8因?yàn)镕MC控制器本身有自己的寫入緩沖機(jī)制CPU單次讀寫時(shí)SDRAM側(cè)的突發(fā)長(zhǎng)度等于1就能覆蓋大多數(shù)需求。突發(fā)長(zhǎng)度8在FMC控制器中未必能得到有效利用反而可能增加預(yù)充電和激活的復(fù)雜度。CAS3比CAS2在某些場(chǎng)景下更穩(wěn)定雖然參數(shù)上看起來慢一個(gè)時(shí)鐘但對(duì)穩(wěn)定性提升明顯尤其是在頻率偏高的邊緣情況下。用HAL庫(kù)時(shí)這些配置集中在SDRAM_HandleTypeDef結(jié)構(gòu)體的Init成員里代碼大概是FMC_SDRAM_CommandTypeDef command; /* Step 1: NOP command */ command.CommandMode FMC_SDRAM_CMD_NOP; command.CommandTarget FMC_SDRAM_CMD_TARGET_BANK1; command.AutoRefreshNumber 1; command.ModeRegisterDefinition 0; HAL_SDRAM_SendCommand(hsdram1, command, 0x1000); /* Wait for power supply stabilization */ HAL_Delay(1); /* Step 2: Precharge All */ command.CommandMode FMC_SDRAM_CMD_PRECHARGE_ALL; command.CommandTarget FMC_SDRAM_CMD_TARGET_BANK1; command.AutoRefreshNumber 1; command.ModeRegisterDefinition 0; HAL_SDRAM_SendCommand(hsdram1, command, 0x1000); /* Step 3: Auto Refresh (8 times) */ command.CommandMode FMC_SDRAM_CMD_AUTOREFRESH_MODE; command.CommandTarget FMC_SDRAM_CMD_TARGET_BANK1; command.AutoRefreshNumber 8; command.ModeRegisterDefinition 0; HAL_SDRAM_SendCommand(hsdram1, command, 0x1000); /* Step 4: Load Mode Register */ command.CommandMode FMC_SDRAM_CMD_LOAD_MODE; command.CommandTarget FMC_SDRAM_CMD_TARGET_BANK1; command.AutoRefreshNumber 1; command.ModeRegisterDefinition 0x230; /* Burst Length1, CAS3 */ HAL_SDRAM_SendCommand(hsdram1, command, 0x1000); /* Step 5: Set refresh rate counter */ HAL_SDRAM_SetRefreshCount(hsdram1, 1875);這段代碼里要注意HAL_SDRAM_SendCommand的最后一個(gè)參數(shù)是超時(shí)時(shí)間單位為SDRAM時(shí)鐘周期。這里填0x1000即4096個(gè)周期看起來是個(gè)很大的值實(shí)際運(yùn)算下來也就幾十微秒如果命令執(zhí)行出錯(cuò)會(huì)超時(shí)返回錯(cuò)誤方便調(diào)試。4.4 初始化過程中的典型錯(cuò)誤初始化階段最常見的錯(cuò)誤是模式寄存器值寫錯(cuò)。比如0x230這個(gè)值解析方式是二進(jìn)制0010 0011 0000。其中第0-2位是突發(fā)長(zhǎng)度000表示1第3位是突發(fā)類型0順序第4-6位是CAS延遲011表示3第7位是操作模式0第8-9位是寫突發(fā)長(zhǎng)度00單點(diǎn)寫。很多人照著某個(gè)參考工程抄芯片換了一顆不仔細(xì)復(fù)查模式寄存器配置導(dǎo)致讀寫不穩(wěn)定或者徹底失敗。每次換SDRAM型號(hào)都要重新對(duì)著數(shù)據(jù)手冊(cè)確認(rèn)每一位的含義不能想當(dāng)然。5. PCB布局布線四大細(xì)節(jié)決定SDRAM能不能穩(wěn)定跑滿速軟件配置再完美硬件布線如果出了問題性能一樣上不去。SDRAM雖然不像DDR那樣苛刻但也不是隨便拉線就能跑的。我總結(jié)了這四個(gè)決定成敗的細(xì)節(jié)按優(yōu)先級(jí)排列。5.1 數(shù)據(jù)線等長(zhǎng)控制在30mil以內(nèi)FMC的數(shù)據(jù)總線D0-D31全部屬于高速同源信號(hào)要求信號(hào)在同一個(gè)時(shí)鐘邊沿內(nèi)被可靠采樣。數(shù)據(jù)線和時(shí)鐘線的長(zhǎng)度差如果超過一定范圍接收端采樣窗口就會(huì)偏掉。我的經(jīng)驗(yàn)標(biāo)準(zhǔn)是在雙面板條件下同一組數(shù)據(jù)線之間的長(zhǎng)度差控制在30mil約0.76mm以內(nèi)數(shù)據(jù)線與時(shí)鐘線的長(zhǎng)度差控制在50mil以內(nèi)。對(duì)于32位總線32根線全部等長(zhǎng)到0.76mm并不難只要在畫PCB時(shí)用等長(zhǎng)網(wǎng)絡(luò)統(tǒng)一約束即可。時(shí)序計(jì)算也可以用公式估算信號(hào)在FR4板材中的傳輸速度約6mil/ps30mil的時(shí)延差約為5ps相對(duì)于8ns的時(shí)鐘周期來說毫無壓力。但要注意的是如果布線經(jīng)過多次換層過孔本身有約50ps的時(shí)延這會(huì)無形中增加差異所以盡量減少換層次數(shù)。5.2 地址/控制線組等長(zhǎng)地址線和控制線RAS、CAS、WE、CS、CKE、CLK屬于命令信號(hào)組約束比數(shù)據(jù)組稍微寬松但同一組內(nèi)還是建議控制在100mil2.54mm以內(nèi)。這里有個(gè)容易忽略的地方命令信號(hào)相對(duì)數(shù)據(jù)信號(hào)要有一定的建立時(shí)間。SDRAM控制器會(huì)在發(fā)出數(shù)據(jù)的同時(shí)提前一個(gè)時(shí)鐘發(fā)出命令信號(hào)。命令信號(hào)到達(dá)SDRAM時(shí)數(shù)據(jù)信號(hào)還沒穩(wěn)定。所以命令線的絕對(duì)長(zhǎng)度可以適度長(zhǎng)一點(diǎn)但不要比數(shù)據(jù)線短太多工程上常用做法是讓命令線略長(zhǎng)于數(shù)據(jù)線50-100mil。5.3 完整地平面低成本高效果的穩(wěn)壓器SDRAM對(duì)參考地平面的依賴很重。數(shù)據(jù)總線在高低電平切換時(shí)會(huì)產(chǎn)生大量的瞬態(tài)回流電流。如果SDRAM正下方或信號(hào)層相鄰平面是電源平面而不是地平面就會(huì)形成回流電流缺口增加環(huán)路電感表現(xiàn)出來就是串?dāng)_和地彈。我看過太多失敗的案例開發(fā)板用雙面板SDRAM底下全是信號(hào)線走線繞來繞去。短時(shí)間能用但溫度稍微高一點(diǎn)或者SDCLK頻率拉高就開始隨機(jī)死機(jī)。布板原則是SDRAM正下方所有層至少要有一層連續(xù)地平面如果實(shí)在無法保證也要在地層上開大面積鋪銅信號(hào)線只在底層走不要跨越任何分割區(qū)域。5.4 時(shí)鐘線額外處理時(shí)鐘線SDCLK是各路信號(hào)中頻率最高、邊沿最陡的信號(hào)。我在時(shí)鐘線上會(huì)額外做兩件處理一是源端串接22歐姆電阻二是包地處理。包地就是在時(shí)鐘線兩側(cè)各走一條地線中間間隔2倍線寬左右用地過孔密集縫合。這個(gè)處理能把時(shí)鐘信號(hào)的電磁輻射約束在局部區(qū)域?qū)ζ渌盘?hào)線的影響大幅下降。對(duì)于更高要求的場(chǎng)景時(shí)鐘信號(hào)還可以參考DDR設(shè)計(jì)的做法加一個(gè)串聯(lián)終端匹配電阻和一個(gè)并聯(lián)到地的電容構(gòu)成一個(gè)低通濾波網(wǎng)絡(luò)雖然會(huì)稍微降低邊沿速率但對(duì)信號(hào)完整性很有幫助。6. 實(shí)際調(diào)試實(shí)錄從讀寫不穩(wěn)定到跑通的完整排查鏈路硬件焊接完代碼初始化通過并不意味著萬(wàn)事大吉。我?guī)缀趺看螕Q一片板子調(diào)試SDRAM都要經(jīng)歷一輪看起來正常但使用時(shí)隨機(jī)出錯(cuò)的折磨過程。這里把典型的調(diào)試經(jīng)歷拆開來講你會(huì)驚訝于問題的多樣性。6.1 第一輪初始化通過但校驗(yàn)失敗剛上電HAL_SDRAM_Init()返回OK用DMA往SDRAM地址寫0x55AA再讀出來對(duì)比結(jié)果全是0x00。這個(gè)現(xiàn)象說明命令通道正常但數(shù)據(jù)通道沒工作。排查思路先檢查數(shù)據(jù)線的焊接確認(rèn)沒有虛焊然后檢查FMC的DQM引腳是否連接正確。我用的IS42S83200J只有DQML和DQMH而H745的FMC分配了四個(gè)字節(jié)使能信號(hào)。我當(dāng)時(shí)的電路把FMC_NBL0-3全部并聯(lián)到SDRAM的DQML和DQMH上結(jié)果造成字節(jié)使能信號(hào)互相干擾讀取數(shù)據(jù)時(shí)全變成了0x00。解決辦法把FMC_NBL0和FMC_NBL1合并到一個(gè)DQML用二極管或邏輯門做隔離太麻煩干脆直接把兩個(gè)信號(hào)短接。32位模式下FMC_NBL0和NBL1都是低有效同時(shí)有效時(shí)低電平是共存的所以短接后邏輯上沒有沖突但要注意負(fù)載電容增加了好在頻率即使到143MHz也扛得住。6.2 第二輪數(shù)據(jù)錯(cuò)位低字節(jié)跑到高字節(jié)改寫0x55AA到地址0讀出來是0xAA55。這個(gè)現(xiàn)象非常有意思看起來像數(shù)據(jù)總線接反了。實(shí)際上IS42S83200J是32位顆粒D0-D31直接對(duì)應(yīng)FMC_D0-D31。我認(rèn)為是軟件問題果然發(fā)現(xiàn)是HAL庫(kù)的FMC地址映射理解錯(cuò)了SDRAM的字節(jié)地址不是按字節(jié)計(jì)算的而是按32位字對(duì)齊的。如果往地址0x0寫32位數(shù)據(jù)讀出來應(yīng)該還是0x0地址但我用指針時(shí)習(xí)慣性把地址當(dāng)成字節(jié)地址加了1導(dǎo)致讀到了下一個(gè)字的高字節(jié)。這類錯(cuò)誤沒有捷徑只能一步一個(gè)腳印對(duì)照。給SDRAM做測(cè)試時(shí)建議先寫幾個(gè)測(cè)試向量固定地址固定數(shù)據(jù)驗(yàn)證基礎(chǔ)通路再換遞增地址測(cè)試地址線譯碼是否正常。6.3 第三輪長(zhǎng)時(shí)間運(yùn)行后偶發(fā)死機(jī)讀寫測(cè)試跑通了但系統(tǒng)運(yùn)行幾小時(shí)后隨機(jī)崩潰。這種最讓人頭疼因?yàn)椴环€(wěn)定復(fù)現(xiàn)。用邏輯分析儀抓FMC總線后發(fā)現(xiàn)崩潰前總會(huì)出現(xiàn)一個(gè)異常的刷新命令。排查后確認(rèn)原因是刷新計(jì)時(shí)器的值配錯(cuò)了——因?yàn)镕MC基頻我改過但刷新計(jì)數(shù)值還是按原來的頻率算的。當(dāng)時(shí)配的是120MHz SDCLK對(duì)應(yīng)的1875而實(shí)際系統(tǒng)時(shí)鐘改了之后SDCLK變?yōu)?43MHz同樣時(shí)間是1875換算成實(shí)際刷新間隔就從原來的15.6us變成了13.1us刷新太勤快了占用了大量總線帶寬導(dǎo)致某些時(shí)間點(diǎn)CPU訪問SDRAM時(shí)出現(xiàn)總線競(jìng)爭(zhēng)沖突。按143MHz重新計(jì)算刷新計(jì)數(shù)值15.625us/7ns - 1 2232。改完之后問題消失。6.4 調(diào)試工具與技巧調(diào)試SDRAM強(qiáng)烈建議買一套ST-Link配合OpenOCD的MMIO調(diào)試功能可以直接在GDB里往SDRAM地址寫數(shù)據(jù)然后讀回比反復(fù)編譯下載固件快得多。另一個(gè)趁手的工具是示波器主要抓SDCLK信號(hào)的邊沿質(zhì)量如果看到明顯的過沖和振鈴首先懷疑時(shí)鐘線上的端接電阻值不合適。還有一個(gè)經(jīng)驗(yàn)技能用FMC的DMA方式往SDRAM連續(xù)搬運(yùn)大數(shù)據(jù)塊同時(shí)用另一個(gè)定時(shí)器中斷統(tǒng)計(jì)搬運(yùn)耗時(shí)。如果搬運(yùn)耗時(shí)有明顯抖動(dòng)大概率是SDRAM刷新與DMA訪問之間的總線沖突恒定時(shí)長(zhǎng)則說明時(shí)序健康。這個(gè)測(cè)試比單純讀寫校驗(yàn)更能暴露性能層面的隱患。7. 性能驗(yàn)證與長(zhǎng)期運(yùn)行穩(wěn)定性我最終跑到的狀態(tài)板子調(diào)通后我對(duì)這套方案做了完整的性能和穩(wěn)定性驗(yàn)證這些數(shù)據(jù)可以給你做設(shè)計(jì)參考。7.1 讀寫帶寬實(shí)測(cè)用H745的FMC控制器向SDRAM做32位DMA連續(xù)寫入SDCLK設(shè)在120MHz時(shí)實(shí)測(cè)寫帶寬約95MB/s讀帶寬約88MB/s。理論上SDCLK 120MHz乘4字節(jié)峰值帶寬應(yīng)該是480MB/s但實(shí)際受限于SDRAM刷新開銷和FMC控制器的命令間隙能跑到峰值帶寬的20%-25%左右已經(jīng)算健康水平。如果應(yīng)用對(duì)帶寬要求更高可以開啟FMC的FIFO功能調(diào)整突發(fā)訪問模式實(shí)測(cè)能把寫入帶寬提升到110MB/s左右但對(duì)時(shí)序要求更嚴(yán)格需要確保布線質(zhì)量過關(guān)。7.2 長(zhǎng)時(shí)間穩(wěn)定性測(cè)試穩(wěn)定性測(cè)試推薦用以下策略用M7核心跑一個(gè)256KB的讀寫循環(huán)不斷寫入遞增數(shù)據(jù)再校驗(yàn)用M4核心同時(shí)跑一個(gè)音頻處理任務(wù)頻繁訪問SDRAM單次運(yùn)行時(shí)間至少72小時(shí)我跑到72小時(shí)后沒有出現(xiàn)一次校驗(yàn)失敗SDRAM的刷新和雙核并發(fā)訪問都表現(xiàn)穩(wěn)定。測(cè)試條件的溫度為室溫SDCLK為120MHz。如果產(chǎn)品要在高溫環(huán)境工作建議把SDCLK降到100MHz以下并把刷新計(jì)數(shù)值相應(yīng)調(diào)整這樣會(huì)留出更多時(shí)序裕量。7.3 功耗與溫升參考IS42S83200J在120MHz下運(yùn)行功耗大約在50-80mA量級(jí)。加上H745本身整個(gè)系統(tǒng)的SDRAM部分溫升大約在15度左右從室溫到穩(wěn)定溫度。這個(gè)數(shù)據(jù)對(duì)多數(shù)產(chǎn)品來說完全可以接受但如果做便攜式低功耗設(shè)計(jì)建議考慮在待機(jī)模式時(shí)將SDCLK關(guān)閉或者讓FMC進(jìn)入自刷新模式能省掉小半電流。8. 進(jìn)階建議與后續(xù)擴(kuò)展方向調(diào)試完成之后這套參考設(shè)計(jì)可以根據(jù)實(shí)際項(xiàng)目需求做進(jìn)一步擴(kuò)展這里分享幾個(gè)我試過的方向。8.1 結(jié)合安全固件升級(jí)使用SDRAMOTA在線升級(jí)產(chǎn)品時(shí)經(jīng)常需要先將接收到的固件暫存再寫入Flash。32MB的SDRAM足夠存放好幾個(gè)版本的固件鏡像可以用一個(gè)簡(jiǎn)單的塊校驗(yàn)方法先完整校驗(yàn)再寫入Flash避免升級(jí)中途斷電導(dǎo)致Flash半寫狀態(tài)。這個(gè)應(yīng)用充分利用了SDRAM的大容量且不占用寶貴的內(nèi)部Flash空間。8.2 利用雙核構(gòu)架同時(shí)訪問SDRAMH745的M7和M4可以通過FMC同一套SDRAM接口訪問外掛存儲(chǔ)器但需要注意總線沖突。我的做法是把SDRAM地址空間劃分為兩個(gè)區(qū)域M7核心使用低16MBM4核心使用高16MB。兩個(gè)核各自訪問不同的Bank地址從物理上避免頻繁的仲裁沖突。如果兩個(gè)核必須共享數(shù)據(jù)可以約定用內(nèi)部SRAM做郵箱傳遞指針而不是大量數(shù)據(jù)拷貝大幅提高效率。8.3 使用SDRAM做GUI顯存時(shí)的幀緩沖策略用SDRAM做GUI幀緩沖可以將多個(gè)顯示層都放在SDRAM里。我的實(shí)踐經(jīng)驗(yàn)是如果LTDC時(shí)鐘和FMC時(shí)鐘分頻設(shè)置不當(dāng)像素讀取會(huì)產(chǎn)生抖動(dòng)。建議將FMC的刷新周期與LTDC的行掃描周期錯(cuò)開或者用DMA2D先將數(shù)據(jù)從SDRAM搬移到內(nèi)部SRAM再由LTDC從內(nèi)部SRAM讀取可以明顯降低畫面撕裂。我的最終建議是STM32H745 IS42S83200J這套組合是從成本、性能、開發(fā)難度三方面權(quán)衡后非常穩(wěn)妥的SDRAM擴(kuò)展方案。只要初始化時(shí)序按數(shù)據(jù)手冊(cè)算準(zhǔn)電源和布線的幾個(gè)關(guān)鍵點(diǎn)做到位市面上絕大多數(shù)基于H7的應(yīng)用都能穩(wěn)定跑起來。如果后續(xù)遇到讀寫不穩(wěn)定問題優(yōu)先檢查供電和時(shí)鐘質(zhì)量再檢查布線等長(zhǎng)八成以上的問題都在這里而不要一開始就去懷疑芯片本身。