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