字節(jié)配置指南)
1. 問題定位為什么偏偏是STM32H750VBT6報(bào)錯(cuò)STM32H750VBT6這顆芯片在Keil5上燒錄失敗報(bào)出Flash Download Failed - Cortex-M7幾乎是每個(gè)從F1、F4系列轉(zhuǎn)過來的工程師都會踩的坑。我第一次用H750做項(xiàng)目時(shí)編譯一路綠燈點(diǎn)下載直接彈窗報(bào)錯(cuò)當(dāng)時(shí)第一反應(yīng)是Keil裝壞了重裝了兩遍才發(fā)現(xiàn)問題根本不在Keil本身。先把這顆芯片的特殊性說清楚。STM32H750VBT6屬于H7系列里的“Value Line”版本主打高主頻低成本480MHz的Cortex-M7內(nèi)核128KB的Flash1MB的RAM。注意這個(gè)128KB Flash它是整個(gè)問題的核心誘因之一。H7系列大部分型號是1MB或2MB Flash而H750只有128KB這個(gè)容量差異直接導(dǎo)致Keil默認(rèn)的Flash算法和實(shí)際芯片不匹配。報(bào)錯(cuò)信息里的Cortex-M7也不是隨便寫的。Keil在下載時(shí)會先識別目標(biāo)內(nèi)核類型然后調(diào)用對應(yīng)的Flash算法去擦寫。H750的Flash控制器和F4、F7都不一樣它用的是H7系列特有的Flash接口扇區(qū)劃分、編程時(shí)序、電壓要求都有區(qū)別。如果你在Keil里選的還是F4或者通用Cortex-M的算法下載器握手階段就會失敗直接拋出這個(gè)錯(cuò)誤。還有一個(gè)容易被忽略的點(diǎn)H750的Flash在出廠時(shí)可能處于寫保護(hù)狀態(tài)或者選項(xiàng)字節(jié)Option Bytes里的讀寫保護(hù)位被設(shè)置過。尤其是買到的芯片如果是拆機(jī)件或者之前被燒錄過其他程序選項(xiàng)字節(jié)很可能不是默認(rèn)值。這種情況下即使Flash算法選對了下載依然會失敗而且報(bào)錯(cuò)信息可能還是同一個(gè)。從實(shí)際排查經(jīng)驗(yàn)來看這個(gè)報(bào)錯(cuò)背后通常對應(yīng)四類原因Flash算法文件缺失或選錯(cuò)、下載器配置參數(shù)不對、芯片選項(xiàng)字節(jié)異常、Keil工程的目標(biāo)器件型號選錯(cuò)。下面我會按排查順序一步步拆解每個(gè)環(huán)節(jié)的操作細(xì)節(jié)和判斷依據(jù)。提示遇到這個(gè)報(bào)錯(cuò)先別急著重裝Keil90%的情況是配置問題重裝解決不了任何事反而浪費(fèi)時(shí)間。2. 第一步確認(rèn)Keil工程里的器件型號選對了沒有很多人拿到別人的工程直接打開就編譯下載根本沒注意工程里選的器件型號是什么。STM32H750VBT6和STM32H743VIT6在Keil的器件列表里是分開的雖然封裝可能一樣但Flash容量和算法完全不同。如果你選的是H743Keil會按1MB Flash去操作而H750只有128KB地址空間對不上下載必然失敗。具體操作打開Keil5點(diǎn)工具欄的Options for Target按鈕或者按快捷鍵AltF7進(jìn)入Device選項(xiàng)卡。在搜索框里輸入STM32H750VB確認(rèn)選中的是STM32H750VBTx。注意后綴Tx代表封裝類型VBT6對應(yīng)的是LQFP100封裝選VBTx就對了。選好之后點(diǎn)OKKeil會自動加載對應(yīng)的器件支持包。如果你之前沒裝H7系列的Pack這里會提示缺失。這時(shí)候需要去Keil官網(wǎng)下載Keil.STM32H7xx_DFP包或者通過Pack Installer在線安裝。我建議直接下載離線包安裝在線安裝有時(shí)候網(wǎng)絡(luò)不穩(wěn)定會卡住。裝完P(guān)ack之后回到Device選項(xiàng)卡確認(rèn)右側(cè)的Flash信息顯示的是128KB。如果顯示的是1MB或2MB說明器件型號還是選錯(cuò)了。這一步看似簡單但我見過太多人在這里翻車尤其是用別人工程模板的時(shí)候模板里選的可能是H743直接拿來用就出問題。還有一個(gè)細(xì)節(jié)Keil5的器件列表里H750有多個(gè)變體比如STM32H750VBTx、STM32H750IBKx、STM32H750XBHx等。VBT6對應(yīng)的就是STM32H750VBTx不要選成IBKxBGA封裝或者XBHxTFBGA封裝。封裝不同引腳定義和Flash算法可能也有差異。注意如果你在Device列表里搜不到STM32H750說明H7系列的Pack沒裝。去Pack Installer里找Keil::STM32H7xx_DFP安裝最新版本即可。3. 第二步Flash算法配置的正確打開方式器件型號選對之后接下來要檢查Utilities選項(xiàng)卡里的Flash算法配置。點(diǎn)Options for Target切到Utilities選項(xiàng)卡點(diǎn)Settings按鈕進(jìn)入Flash Download設(shè)置界面。這里能看到當(dāng)前使用的Flash算法列表。對于STM32H750VBT6正確的算法應(yīng)該是STM32H7x_128KB.FLM或者類似的H7系列128KB版本。如果你看到的是STM32F4xx_1024KB.FLM或者STM32H7x_2048KB.FLM那就是錯(cuò)的必須刪掉重新添加。添加算法的操作在Flash Download界面點(diǎn)Add按鈕在彈出的算法列表里找到STM32H7x_128KB相關(guān)的條目選中后點(diǎn)Add。如果列表里沒有這個(gè)算法說明H7的Pack沒裝完整或者Pack版本太舊。我遇到過Keil5.30版本自帶的H7 Pack里沒有128KB算法的情況需要手動更新Pack到最新版。算法添加后檢查RAM for Algorithm的起始地址和大小。H750的Flash算法需要占用一段RAM來運(yùn)行通常起始地址是0x20000000大小0x10004KB就夠了。如果這里設(shè)置得太小算法加載不進(jìn)去下載也會失敗。我一般設(shè)成0x20000000起始大小0x20008KB留足余量。還有一個(gè)關(guān)鍵點(diǎn)Programming Algorithm列表里如果有多個(gè)算法要確保只有H7 128KB這一個(gè)其他無關(guān)的算法全部刪掉。Keil會按列表順序嘗試如果第一個(gè)算法不匹配可能直接報(bào)錯(cuò)而不去嘗試后面的。我見過有人列表里同時(shí)有F4和H7的算法結(jié)果Keil用了F4的算法去操作H7直接失敗。配置完成后點(diǎn)OK保存然后重新編譯工程再點(diǎn)下載。如果這一步配置對了大部分情況下報(bào)錯(cuò)就會消失。如果還是報(bào)錯(cuò)繼續(xù)往下排查。提示Flash算法文件.FLM存放在Keil安裝目錄的ARM\Flash文件夾下你可以手動去這個(gè)目錄確認(rèn)有沒有STM32H7x_128KB.FLM文件。4. 第三步下載器配置與復(fù)位模式的選擇Flash算法配好之后下載器Debugger的配置也很關(guān)鍵。在Options for Target的Debug選項(xiàng)卡里選擇你實(shí)際使用的下載器比如ST-Link Debugger或者J-LINK/J-TRACE Cortex。選好后點(diǎn)旁邊的Settings按鈕進(jìn)入下載器設(shè)置界面。在Debug標(biāo)簽頁里Port一般選SWSWD模式Max Clock根據(jù)你的下載器質(zhì)量來設(shè)。ST-Link V2正版可以設(shè)到4MHz甚至更高但如果是幾十塊錢的仿版建議降到1MHz或500KHz否則握手不穩(wěn)定會導(dǎo)致下載失敗。我實(shí)測過仿版ST-Link在4MHz下下載H750十次有三次失敗降到1MHz后基本穩(wěn)定。切到Flash Download標(biāo)簽頁這里有幾個(gè)選項(xiàng)需要特別注意Reset and Run勾上這個(gè)下載完自動復(fù)位運(yùn)行省得手動按復(fù)位鍵。Erase Sectors勾上下載前擦除對應(yīng)扇區(qū)。Program勾上執(zhí)行編程。Verify勾上編程后校驗(yàn)確保數(shù)據(jù)寫進(jìn)去了。下面還有一個(gè)Reset下拉菜單選項(xiàng)有Autodetect、HW RESET、SYSRESETREQ、VECTRESET等。對于H750我建議選HW RESET或者SYSRESETREQ。Autodetect有時(shí)候會抽風(fēng)識別不到正確的復(fù)位方式。VECTRESET只復(fù)位內(nèi)核不復(fù)位外設(shè)某些情況下會導(dǎo)致Flash控制器狀態(tài)異常下載失敗。如果你用的是ST-Link還要注意Connect選項(xiàng)。在Debug標(biāo)簽頁的Connect下拉里選under Reset或者pre-reset。H750在運(yùn)行狀態(tài)下SWD引腳可能被復(fù)用或者被看門狗干擾導(dǎo)致下載器連不上。選under Reset可以讓下載器在芯片復(fù)位期間建立連接成功率更高。我自己的習(xí)慣是ST-Link SWD 1MHz under Reset HW RESET這套組合在H750上從來沒出過問題。你可以直接抄這個(gè)配置。注意如果你用的是J-Link在Settings里要選正確的InterfaceSWD和Speed建議1000kHzJ-Link的復(fù)位方式選Normal即可。5. 第四步選項(xiàng)字節(jié)與讀寫保護(hù)的排查前面三步都確認(rèn)無誤后如果還是報(bào)Flash Download Failed那就要懷疑芯片的選項(xiàng)字節(jié)Option Bytes了。H750的選項(xiàng)字節(jié)里有兩個(gè)關(guān)鍵位RDPRead Protection和WRPWrite Protection。如果RDP被設(shè)成了Level 1或Level 2或者WRP保護(hù)了某些扇區(qū)下載操作就會被硬件拒絕。排查方法用STM32CubeProgrammer連接芯片讀取選項(xiàng)字節(jié)。如果RDP顯示Level 1說明芯片被讀保護(hù)了需要先解除保護(hù)。解除RDP Level 1會觸發(fā)全片擦除芯片里的程序會全部丟失所以操作前確認(rèn)沒有需要保留的數(shù)據(jù)。RDP Level 2是不可逆的一旦設(shè)成Level 2芯片就徹底鎖死只能換芯片。買到拆機(jī)H750的時(shí)候尤其要注意這一點(diǎn)。WRP的排查類似在CubeProgrammer里看WRP0、WRP1等寄存器的值。如果某些扇區(qū)被寫保護(hù)了下載時(shí)寫到這些扇區(qū)就會失敗。解除WRP的方法是在CubeProgrammer里取消對應(yīng)的保護(hù)位然后應(yīng)用設(shè)置。還有一種情況芯片之前被燒錄過其他程序那個(gè)程序在運(yùn)行時(shí)會禁用SWD引腳或者進(jìn)入低功耗模式導(dǎo)致下載器連不上。這時(shí)候需要用under Reset模式連接或者在芯片復(fù)位后的極短時(shí)間內(nèi)建立連接。ST-Link的Connect under Reset就是干這個(gè)的。如果CubeProgrammer也連不上芯片那可能是硬件問題SWDIO和SWCLK接反了、復(fù)位引腳沒接、供電不足、晶振沒起振等。先用萬用表量一下VDD電壓是不是3.3VSWDIO和SWCLK對地有沒有短路。硬件沒問題再回來搞軟件。我遇到過一次客戶板子上的H750死活下載不了最后發(fā)現(xiàn)是BOOT0引腳被拉高了芯片從系統(tǒng)存儲器啟動而不是從Flash啟動。把BOOT0接地后一切正常。所以硬件排查也不能忽略。提示STM32CubeProgrammer是ST官方的免費(fèi)工具比Keil自帶的下載功能更底層能直接操作選項(xiàng)字節(jié)和Flash寄存器排查硬件問題時(shí)非常有用。6. 第五步Keil版本與Pack兼容性的坑如果以上四步都排查過了還是不行那就要考慮Keil版本和Pack兼容性的問題了。Keil MDK從5.30版本開始對H7系列的支持才比較完善如果你用的是5.20或更早的版本H7的Pack可能裝不上或者裝上了也有bug。我建議用Keil MDK 5.36或更高版本。這個(gè)版本對H7系列的支持很穩(wěn)定Flash算法也齊全。如果你還在用5.14或者5.20升級一下能省很多事。升級Keil不會影響已有的工程裝完之后重新安裝H7的Pack即可。Pack版本也很關(guān)鍵。Keil.STM32H7xx_DFP的版本號建議在2.7.0以上。舊版本的Pack里H750的Flash算法可能有bug比如擦除不干凈、編程校驗(yàn)失敗等。更新Pack的方法打開Pack Installer找到Keil::STM32H7xx_DFP點(diǎn)Update按鈕。如果在線更新失敗去Keil官網(wǎng)下載最新的Pack離線包手動安裝。還有一個(gè)隱藏的坑Keil5同時(shí)裝了C51和MDK的時(shí)候有時(shí)候會出現(xiàn)工具鏈沖突導(dǎo)致下載功能異常。表現(xiàn)是編譯正常但下載時(shí)提示Target DLL has been cancelled。這個(gè)問題的根源是C51和MDK共用了一些DLL文件版本不匹配。解決辦法是卸載C51或者把C51和MDK裝在不同的目錄下避免DLL沖突。如果你確實(shí)需要同時(shí)用C51和MDK可以試試這個(gè)方案先裝MDK再裝C51安裝C51時(shí)選擇不覆蓋MDK的DLL?;蛘哂镁G色版的C51解壓到獨(dú)立目錄手動配置環(huán)境變量。不過最省事的辦法還是找一臺專門的電腦跑MDK另一臺跑C51省得折騰。最后還有一個(gè)常見問題Keil的license過期或者沒激活。未激活的Keil在編譯和下載時(shí)會有各種限制有時(shí)候就表現(xiàn)為下載失敗。檢查File-License Management確認(rèn)license狀態(tài)是Valid。如果是Expired用注冊機(jī)重新生成一個(gè)即可。注意注冊機(jī)要跟Keil版本匹配5.36的注冊機(jī)不能用在5.38上。注意Keil的Pack和器件支持包是分開的裝了H7的Pack不代表Flash算法就自動配好了還是要在Utilities里手動添加對應(yīng)的算法。7. 常見問題速查表與排查流程把上面五步的內(nèi)容整理成一張速查表遇到報(bào)錯(cuò)的時(shí)候按順序排查基本能覆蓋95%的情況。排查步驟檢查項(xiàng)正確配置常見錯(cuò)誤1Device型號STM32H750VBTx選成H743或F4系列2Flash算法STM32H7x_128KB.FLM用了F4或H7 2048KB算法3下載器配置SWD 1MHz under Reset時(shí)鐘太高或復(fù)位模式不對4選項(xiàng)字節(jié)RDP Level 0, WRP全關(guān)RDP Level 1或WRP開啟5Keil版本MDK 5.36Pack 2.7.0版本過舊或Pack缺失排查流程建議按這個(gè)順序走先確認(rèn)Device型號再看Flash算法然后查下載器配置接著用CubeProgrammer讀選項(xiàng)字節(jié)最后考慮升級Keil和Pack。每一步確認(rèn)無誤后再進(jìn)入下一步不要跳步。另外補(bǔ)充幾個(gè)實(shí)操中遇到的特殊情況報(bào)錯(cuò)信息是Could not load file xxx.axf說明編譯輸出文件沒生成先解決編譯錯(cuò)誤跟下載配置無關(guān)。報(bào)錯(cuò)信息是Target DLL has been cancelled通常是C51和MDK沖突或者下載器驅(qū)動沒裝好。下載成功但程序不運(yùn)行檢查BOOT0引腳是不是被拉高了或者復(fù)位電路有問題。下載時(shí)提示Cannot access memory芯片可能進(jìn)入了低功耗模式用under Reset連接。我自己的經(jīng)驗(yàn)是H750的下載問題90%出在Flash算法和選項(xiàng)字節(jié)這兩塊。把這兩塊搞明白剩下的都是小問題。如果你按上面的步驟走了一遍還是不行把Keil的報(bào)錯(cuò)截圖和CubeProgrammer的連接日志發(fā)出來基本一眼就能定位問題。提示每次修改Options for Target之后記得重新編譯一次再下載。Keil有時(shí)候會緩存舊的配置不重新編譯的話下載用的還是舊參數(shù)。8. 實(shí)操心得幾個(gè)讓我少走彎路的習(xí)慣做H750項(xiàng)目這幾年我養(yǎng)成了幾個(gè)習(xí)慣分享出來供參考。第一個(gè)習(xí)慣新建工程的時(shí)候直接用STM32CubeMX生成Keil工程框架不要手動從零建。CubeMX生成的工程里器件型號、Flash算法、下載器配置都是自動配好的省得自己一個(gè)個(gè)填。生成之后在Keil里打開直接編譯下載基本不會出問題。如果你用的是寄存器開發(fā)或者標(biāo)準(zhǔn)庫CubeMX也能生成對應(yīng)的啟動文件和鏈接腳本拿來用就行。第二個(gè)習(xí)慣手邊常備一個(gè)STM32CubeProgrammer遇到下載問題先用它連一下芯片。CubeProgrammer能連上說明硬件和下載器沒問題問題在Keil配置連不上說明硬件或選項(xiàng)字節(jié)有問題。這個(gè)判斷能幫你快速縮小排查范圍。第三個(gè)習(xí)慣買H750芯片的時(shí)候盡量從正規(guī)渠道買全新原裝。拆機(jī)件和翻新件的選項(xiàng)字節(jié)經(jīng)常是亂的有的甚至被設(shè)了RDP Level 2買回來直接報(bào)廢。我吃過一次虧一批芯片里有三成是鎖死的退換貨折騰了半個(gè)月。第四個(gè)習(xí)慣工程目錄不要放在中文路徑下。Keil對中文路徑的支持一直有問題有時(shí)候編譯能過下載就失敗報(bào)錯(cuò)信息還莫名其妙。把工程放在純英文路徑下比如D:\Projects\H750_Demo能避免很多玄學(xué)問題。第五個(gè)習(xí)慣定期更新Keil和Pack。ST的H7系列還在不斷出新型號舊版本的Pack可能不支持新芯片。保持Keil和Pack在較新的版本能省去很多兼容性排查的時(shí)間。但也不要追最新版新版本剛出來可能有bug等一兩個(gè)月穩(wěn)定了再升。最后說一個(gè)真實(shí)案例。之前有個(gè)朋友用H750做產(chǎn)品批量生產(chǎn)時(shí)發(fā)現(xiàn)有一批板子下載不了報(bào)的也是Flash Download Failed。他以為是Keil配置問題折騰了兩天沒搞定。后來用CubeProgrammer一讀發(fā)現(xiàn)這批芯片的選項(xiàng)字節(jié)里WRP被開啟了保護(hù)了前幾個(gè)扇區(qū)。聯(lián)系供應(yīng)商才知道這批芯片是工廠測試后忘記解除寫保護(hù)的。解除WRP后一切正常。所以批量出問題的時(shí)候優(yōu)先懷疑芯片本身的選項(xiàng)字節(jié)而不是軟件配置。這個(gè)問題的排查思路其實(shí)可以遷移到其他STM32型號上。F4、F7、G4、U5系列的下載失敗排查邏輯大同小異都是器件型號、Flash算法、下載器配置、選項(xiàng)字節(jié)、工具版本這五個(gè)維度。把這五個(gè)維度摸透了以后遇到任何STM32的下載問題都能快速定位。