升級(jí):從啟動(dòng)流程到調(diào)試配置的實(shí)戰(zhàn)解析)
NXP又發(fā)新MCU了而且這次不是單發(fā)芯片連FRDM開發(fā)平臺(tái)一起做了大升級(jí)。消息出來之后好幾個(gè)群里都在討論一件事這個(gè)All-Purpose到底覆蓋哪些場景FRDM從評(píng)估板變成開發(fā)平臺(tái)對(duì)日常干活的人意味著什么作為一個(gè)在NXP生態(tài)里摸爬滾打多年的工程師我結(jié)合自己在S32K、RT系列以及老款FRDM板卡上的實(shí)際經(jīng)驗(yàn)把這次發(fā)布背后的產(chǎn)品邏輯、底層機(jī)制和上手路徑拆開聊一聊。順便文中也會(huì)回應(yīng)幾個(gè)搜索頻率特別高的問題——MCU啟動(dòng)流程、調(diào)試器startup配置、串口接收腳上拉這些細(xì)節(jié)看著不起眼真踩進(jìn)去一個(gè)坑就能耗掉一整天。1. 新MCU與FRDM平臺(tái)同步迭代NXP的生態(tài)棋盤1.1 All-Purpose是定位不是口號(hào)通用MCU的邊界在哪里NXP的MCU產(chǎn)品線其實(shí)鋪得很開。S32K系列面向汽車安全機(jī)制和功能安全等級(jí)是硬指標(biāo)RT跨界系列主打高性能邊緣計(jì)算動(dòng)不動(dòng)就是雙核、高主頻LPC系列則是老牌通用產(chǎn)品線主打穩(wěn)定和成本。而MCX系列是這幾年NXP針對(duì)嵌入式通用市場重點(diǎn)推的新家族。這次發(fā)布的所謂All-Purpose MCU從產(chǎn)品布局看就是MCX這條線的持續(xù)擴(kuò)展。為什么我說All-Purpose是定位而不是營銷話術(shù)因?yàn)橥ㄓ肕CU的核心競爭力從來不是某一項(xiàng)指標(biāo)的極致而是均衡兩個(gè)字。功耗、性能、外設(shè)豐富度、價(jià)格、生態(tài)成熟度這幾項(xiàng)必須找到一個(gè)讓大多數(shù)項(xiàng)目都舒服的平衡點(diǎn)。S32K344這種車規(guī)芯片功能安全機(jī)制確實(shí)強(qiáng)但通用市場用不上那么多冗余安全設(shè)計(jì)成本也降不下來RT1176雖然性能猛可對(duì)很多簡單的控制任務(wù)來說雙核高主頻就是性能溢出還帶來更復(fù)雜的電源設(shè)計(jì)和EMC問題。通用MCU要做的恰恰是把夠用和好用之間的那個(gè)空檔填上。這也解釋了為什么大家會(huì)反復(fù)搜索RT1176使用量多不多這類問題。原因很簡單很多項(xiàng)目本質(zhì)上不需要那么高的性能但NXP之前在中低端市場缺少一個(gè)接口豐富、生態(tài)成熟、SDK好用的新選擇工程師只能拿高端芯片降維打擊。新MCU的出現(xiàn)正是要填補(bǔ)這個(gè)位置。1.2 FRDM從免費(fèi)評(píng)估板到開發(fā)平臺(tái)的升級(jí)邏輯FRDM系列在NXP生態(tài)里的歷史不短了。早年的FRDM-K64F、FRDM-KL25Z核心定位很清晰——免費(fèi)評(píng)估。拿一塊板子點(diǎn)個(gè)燈跑個(gè)官方示例感受一下芯片能力。但說實(shí)話老FRDM板作為開發(fā)平臺(tái)的潛質(zhì)一直沒被充分挖掘。這次Enriched FRDM Development Platform的升級(jí)有幾個(gè)方向是實(shí)打?qū)嵉?。首先是板載調(diào)試器的變化。老FRDM板上的OpenSDA調(diào)試器在穩(wěn)定性和兼容性上只能說夠用新平臺(tái)換上了更成熟的調(diào)試方案跟MCUXpresso IDE、S32DS以及第三方的調(diào)試器配合都順暢了很多。其次是擴(kuò)展接口的豐富程度。新FRDM平臺(tái)在傳統(tǒng)Arduino排針的基礎(chǔ)上增加了不少工業(yè)級(jí)接口的預(yù)留位置比如CAN收發(fā)器、RS485、工業(yè)以太網(wǎng)PHY的擴(kuò)展位。這意味著板子可以直接對(duì)接實(shí)際的工控模塊而不是只能停留在教學(xué)演示的層面。第三是板級(jí)外設(shè)的多樣化傳感器、音頻接口、顯示接口直接集成在板上拿到手就能驗(yàn)證一個(gè)比較完整的方案而不是外接一堆杜邦線的飛線地獄。這些變化的底層邏輯是NXP不想讓FRDM只做評(píng)估板它想把FRDM做成從評(píng)估到原型驗(yàn)證再到量產(chǎn)參考的橋梁。對(duì)工程師來說這意味著拿到一塊FRDM新板不是在玩玩具而是在為最終的量產(chǎn)設(shè)計(jì)做預(yù)研。1.3 開發(fā)平臺(tái)的本質(zhì)降低從芯片選型到產(chǎn)品落地的摩擦力我在多個(gè)項(xiàng)目里用過NXP的芯片一個(gè)很深的體會(huì)是芯片本身的能力差距其實(shí)不如開發(fā)工具鏈的效率差距對(duì)項(xiàng)目進(jìn)度的影響大。FRDM平臺(tái)的升級(jí)表面上改的是硬件接口和板載資源本質(zhì)上降低的是從選型到落地之間的摩擦力。舉個(gè)實(shí)際例子。早年用S32K系列做項(xiàng)目光搭開發(fā)環(huán)境、配置時(shí)鐘樹、調(diào)通調(diào)試器就花了兩周。后來用MCUXpresso Config Tools引腳和時(shí)鐘的圖形化配置、代碼自動(dòng)生成、SDK組件拖拽式添加這些流程壓縮到了半天。新FRDM平臺(tái)把這些工具鏈的整合又往前推了一步——板卡配置文件、官方示例工程、SDK版本在出廠時(shí)就對(duì)齊了拿到板子之后第一件事不是配環(huán)境而是跑示例這種體驗(yàn)上的差異對(duì)新手和資深工程師都同樣重要。2. 啟動(dòng)、調(diào)試、串口上拉開發(fā)者最常踩的三個(gè)底層坑2.1 啟動(dòng)流程拆解從復(fù)位向量到main()中間發(fā)生了什么NXP S32K344 bootloader和MCU啟動(dòng)流程是什么搜索熱詞我一點(diǎn)都不意外。很多人寫bootloader或者排查啟動(dòng)異常時(shí)對(duì)NXP MCU的啟動(dòng)鏈路理解不完整出了問題很難定位。我在這里把通用流程拆一遍以Cortex-M內(nèi)核的NXP MCU為例S32K、RT、MCX都適用芯片上電后內(nèi)核從0x00000000地址讀取棧頂指針MSP從0x00000004地址讀取復(fù)位向量然后跳轉(zhuǎn)到復(fù)位向量指向的啟動(dòng)代碼。這個(gè)過程里NXP芯片會(huì)先檢查啟動(dòng)配置引腳或Fuse決定是從內(nèi)部Flash啟動(dòng)、串行下載模式啟動(dòng)還是從外部存儲(chǔ)器啟動(dòng)。從內(nèi)部Flash啟動(dòng)的話接下來執(zhí)行Flash起始處的啟動(dòng)代碼完成時(shí)鐘初始化、存儲(chǔ)器初始化把RW段和ZI段搬移好進(jìn)入C環(huán)境最后才跳到main()。這里面有一個(gè)高頻坑自己寫了bootloader之后APP跳轉(zhuǎn)不過去或者跳過去就死機(jī)。排查方向通常是三個(gè)APP的向量表偏移是否設(shè)置正確、跳轉(zhuǎn)前有沒有關(guān)閉全局中斷、時(shí)鐘配置是否需要重新初始化。以S32K344為例它的啟動(dòng)流程還涉及HSE硬件安全引擎的初始化boot階段如果沒正確配置安全機(jī)制APP運(yùn)行到需要安全校驗(yàn)的模塊時(shí)會(huì)莫名卡死。這個(gè)問題我在實(shí)際項(xiàng)目中踩過排查了很久才發(fā)現(xiàn)是安全機(jī)制初始化順序的問題不是代碼邏輯問題。2.2 板載調(diào)試器與IDE的startup配置一個(gè)隱藏的時(shí)間黑洞NXP S32DS的Debugger的Startup設(shè)置這個(gè)搜索詞非常典型。S32 Design Studio的調(diào)試配置里有個(gè)Startup標(biāo)簽頁它的作用是在調(diào)試器連接目標(biāo)板后自動(dòng)執(zhí)行一系列命令連接芯片、下載代碼、設(shè)置PC指針、設(shè)置斷點(diǎn)、運(yùn)行腳本完成外設(shè)初始化。很多人改了硬件設(shè)計(jì)之后發(fā)現(xiàn)調(diào)試器連不上或者下載后程序不自動(dòng)運(yùn)行第一反應(yīng)是硬件壞了、芯片鎖死了但實(shí)際情況往往是Startup配置里某個(gè)選項(xiàng)不對(duì)。比如Reset類型選錯(cuò)——有的芯片需要hardware reset有的需要software reset選錯(cuò)了下載后芯片狀態(tài)就不對(duì)又比如Download選項(xiàng)勾選了某個(gè)Flash區(qū)域但地址配置和實(shí)際芯片不符導(dǎo)致下載失敗或者下載了但沒生效。我的建議是拿到新板卡或者新芯片型號(hào)時(shí)先去Debug Configuration里把自定義腳本清空用默認(rèn)Startup配置跑一遍確認(rèn)可以正常連接、下載、調(diào)試之后再逐步添加自定義初始化命令。這樣能有效避免把工具鏈配置問題誤判成硬件設(shè)計(jì)問題省下的排查時(shí)間非??捎^。2.3 串口接收腳的上拉一個(gè)看似簡單卻反復(fù)出現(xiàn)的原理圖問題MCU串口接收端口是否有上拉這個(gè)搜索詞直接反映了一個(gè)原理圖設(shè)計(jì)中的高頻困惑。先說結(jié)論UART的RX引腳通常需要在外部加一個(gè)上拉電阻特別是以下幾種場景——沒有外部收發(fā)器、直接用TTL電平對(duì)接、或者對(duì)端設(shè)備在空閑狀態(tài)下輸出是高阻態(tài)。為什么因?yàn)閁ART協(xié)議規(guī)定總線空閑狀態(tài)為高電平。如果對(duì)端設(shè)備上電慢、或者空閑時(shí)不驅(qū)動(dòng)總線RX引腳就等于懸空會(huì)引入噪聲MCU會(huì)收到大量亂碼幀。但問題來了MCU內(nèi)部的上拉能不能省掉外部電阻答案是看情況。大多數(shù)NXP MCU的引腳內(nèi)部上拉是可配置的但默認(rèn)是關(guān)閉的需要在引腳配置工具或代碼里顯式打開。而且內(nèi)部上拉的阻值一般是40kΩ級(jí)別比較弱抗干擾能力遠(yuǎn)不如外部10kΩ上拉。在FRDM板卡上這個(gè)問題會(huì)更明顯——通過Arduino排針擴(kuò)展時(shí)如果某個(gè)UART模塊的TX在空閑時(shí)是高阻MCU的RX就可能讀到隨機(jī)電平。我的建議量產(chǎn)板的UART_RX外部放一個(gè)10kΩ到VCC的上拉電阻成本不到一分錢能省掉大量通信偶發(fā)異常的排查時(shí)間。特別是工業(yè)環(huán)境里這條經(jīng)驗(yàn)非常實(shí)用。2.4 ADC采樣精度原理簡單但電路設(shè)計(jì)才是決定因素MCU ADC工作原理也是個(gè)常青話題。ADC的核心原理是采樣-保持-量化-編碼這個(gè)誰都知道。但真正決定采樣精度的往往不是ADC的位數(shù)而是外部電路設(shè)計(jì)。參考電壓的噪聲、模擬地和數(shù)字地的分割、輸入阻抗的匹配這些因素對(duì)實(shí)際精度的影響比12位還是16位大得多。FRDM新平臺(tái)在ADC方面做了專門的優(yōu)化模擬參考電壓有低噪聲設(shè)計(jì)板級(jí)布局也考慮了模擬信號(hào)的完整性。但如果你要自己畫板子有幾個(gè)原則必須記住模擬地和數(shù)字地盡量單點(diǎn)連接、VREF引腳必須加去耦電容、ADC輸入串阻不要太大、采樣保持電容要選對(duì)。這些不需要高深理論全是實(shí)踐出來的經(jīng)驗(yàn)。我在一個(gè)用NXP MCU做電機(jī)電流采樣的項(xiàng)目里就遇到過ADC采樣值跳動(dòng)的問題最后定位到是參考電壓引腳的去耦電容離芯片太遠(yuǎn)走線太長引入了噪聲。改版后電容貼近引腳放置問題直接消失。3. 引腳配置、代碼生成與多IDE接入工具鏈實(shí)際體驗(yàn)3.1 MCUXpresso Config Tools與SDK的配合方式新FRDM平臺(tái)一個(gè)很明顯的提升是和MCUXpresso生態(tài)的配合更加順暢了。MCUXpresso包含兩套工具基于Eclipse的IDE和獨(dú)立的Config Tools配置器。我推薦的方式是用Config Tools完成引腳、時(shí)鐘、外設(shè)的圖形化配置生成代碼后導(dǎo)入IDE編譯調(diào)試。具體流程可以這樣走在MCUXpresso Config Tools里新建工程選擇對(duì)應(yīng)的FRDM板卡和MCU型號(hào)工具會(huì)自動(dòng)匹配板級(jí)配置文件。在Pin配置頁面里圖形化分配引腳功能工具會(huì)自動(dòng)檢查引腳沖突——這一步對(duì)新手尤其友好不至于在幾百個(gè)引腳的芯片里迷失。在Clock配置頁面里設(shè)置系統(tǒng)時(shí)鐘樹。這里提醒一句參考官方PLL倍頻參數(shù)就好不要試圖超頻NXP的時(shí)鐘樹配置工具會(huì)自動(dòng)檢查非法配置。在Peripherals配置頁面里使能需要的UART、I2C、ADC等外設(shè)設(shè)置波特率、采樣周期等參數(shù)。點(diǎn)擊生成代碼工具會(huì)輸出初始化函數(shù)和中斷處理模板。在IDE中補(bǔ)充用戶邏輯代碼編譯下載運(yùn)行。這里有個(gè)重要提醒每次重新生成代碼時(shí)工具可能會(huì)覆蓋手動(dòng)修改的部分。正確的做法是把自己寫的邏輯放在用戶代碼段注釋標(biāo)記之間——通常是USER CODE BEGIN和USER CODE END之間——這樣重新生成時(shí)不會(huì)被覆蓋。這個(gè)習(xí)慣一定要養(yǎng)成否則一次重新配置就讓你丟失大量代碼欲哭無淚。3.2 從OrCAD的引腳導(dǎo)出看原理圖設(shè)計(jì)效率Cadence OrCAD如何快速導(dǎo)出MCU的引腳信息這個(gè)搜索詞我太有共鳴了。做原理圖設(shè)計(jì)時(shí)最繁瑣的環(huán)節(jié)之一就是把幾百個(gè)引腳的MCU封裝建好并確保引腳網(wǎng)絡(luò)完全正確。一個(gè)引腳標(biāo)錯(cuò)打樣回來就廢一塊板子。OrCAD里快速導(dǎo)出MCU引腳信息的思路主要有兩種第一種用OrCAD Capture的CIS數(shù)據(jù)庫直接從廠家元件庫調(diào)取封裝和引腳信息第二種利用腳本工具從PDF或Excel格式的引腳表自動(dòng)生成原理圖符號(hào)——這種方法適合芯片太新、元件庫還沒有的情況。但更高效的做法是直接使用NXP官方提供的Design Files。NXP的大部分MCU和FRDM板卡都提供OrCAD格式的原理圖、封裝庫和PCB布局文件去官網(wǎng)產(chǎn)品頁面就能下載。拿到這些文件后不要從頭畫直接在官方參考設(shè)計(jì)上修改。特別是FRDM平臺(tái)的參考設(shè)計(jì)標(biāo)注清晰、分區(qū)合理在上面做修改比從零開始畫省太多時(shí)間。3.3 VS Code等第三方環(huán)境接入新MCU的路徑很多工程師不習(xí)慣Eclipse系的IDE想用VS Code開發(fā)NXP MCU。其實(shí)這個(gè)訴求很合理VS Code的輕量、定制性、和Git等工具的集成都是優(yōu)勢。在VS Code里接入新的NXP通用MCU基本路徑是這樣的安裝VS Code和必要擴(kuò)展C/C擴(kuò)展、Cortex-Debug擴(kuò)展。下載ARM GCC工具鏈配置好環(huán)境變量。使用MCUXpresso的CMake導(dǎo)出功能生成構(gòu)建文件或者手寫CMakeLists.txt。配置Cortex-Debug的調(diào)試配置文件指定調(diào)試器類型、芯片型號(hào)、固件路徑。添加launch.json和tasks.json把編譯、燒錄、調(diào)試串起來。我自己在Linux服務(wù)器上做過一次完整流程編譯效率確實(shí)比Eclipse IDE要高特別是做CI/CD的時(shí)候命令行編譯是剛需。但坦白說VS Code方案需要自己維護(hù)構(gòu)建系統(tǒng)配置對(duì)新手有一定門檻——建議先熟悉了MCUXpresso IDE之后再切換到VS Code會(huì)讓整個(gè)流程的理解更透徹。3.4 一個(gè)能夠跑通的典型工程配置CMakeLists模板思路無論用MCUXpresso IDE還是VS Code理解CMake構(gòu)建方式都有助于你駕馭NXP生態(tài)。一個(gè)典型的MCUXpresso導(dǎo)出CMakeLists.txt結(jié)構(gòu)大概是這樣的cmake_minimum_required(VERSION 3.10) project(frdm_demo) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(TOOLCHAIN_PREFIX arm-none-eabi-) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}gcc) include_directories( source source/drivers source/board source/startup ) add_executable(${PROJECT_NAME}.elf source/main.c source/board/board.c source/startup/startup_mcx.c source/drivers/clock_config.c source/drivers/pin_mux.c ) target_link_libraries(${PROJECT_NAME}.elf)這只是一個(gè)極簡的框架真實(shí)工程里會(huì)有更多外設(shè)驅(qū)動(dòng)源文件和鏈接腳本。核心點(diǎn)是CPU型號(hào)和工具鏈前綴要匹配、鏈接腳本要指向正確的Flash起始地址和大小、啟動(dòng)文件不能漏。這些細(xì)節(jié)在MCUXpresso IDE里是自動(dòng)處理的但切換到CMake手動(dòng)構(gòu)建后每一個(gè)都是可能卡殼的地方。4. 和ST、TI的同類產(chǎn)品放在一起新MCU的差異化在哪4.1 與STM32H7的FOC應(yīng)用場景對(duì)比STM32H7 MCU的FOC計(jì)算是電機(jī)控制領(lǐng)域的高頻話題。STM32H7靠高主頻和強(qiáng)大的數(shù)學(xué)運(yùn)算能力在FOC電機(jī)控制里確實(shí)表現(xiàn)不錯(cuò)。新的NXP通用MCU要在這個(gè)場景競爭靠的不是更高主頻而是外設(shè)集成的貼合度。FOC算法需要三樣硬實(shí)力高速ADC同步采樣、高精度PWM互補(bǔ)輸出、足夠的算力執(zhí)行Clarke變換/Park變換和PID環(huán)。NXP在許多MCU里把硬件觸發(fā)ADC和PWM聯(lián)動(dòng)機(jī)制做得很細(xì)對(duì)于電機(jī)控制這類實(shí)時(shí)性要求極高的場景硬件聯(lián)動(dòng)比純靠中斷觸發(fā)更可靠延時(shí)更小、抖動(dòng)更小。FRDM新平臺(tái)上也專門設(shè)計(jì)了電機(jī)控制擴(kuò)展接口可以直接連接驅(qū)動(dòng)板這個(gè)細(xì)節(jié)對(duì)做電機(jī)控制的團(tuán)隊(duì)很友好。4.2 與TI AM261x工業(yè)MCU的架構(gòu)對(duì)比TI AM261x工業(yè)MCU架構(gòu)解析異構(gòu)計(jì)算、實(shí)時(shí)控制與工業(yè)通信這個(gè)熱詞反映了工業(yè)MCU的一個(gè)趨勢——異構(gòu)計(jì)算正在從高端芯片向下摸底滲透。AM261x是TI推出的融合了Cortex-M和Cortex-R的工業(yè)MCU主打?qū)崟r(shí)控制和工業(yè)通信。NXP的通用MCU目前架構(gòu)相對(duì)傳統(tǒng)多采用單核或雙核Cortex-M組合。但NXP的優(yōu)勢在于軟件生態(tài)的統(tǒng)一性——S32K、RT、MCX這些產(chǎn)品線共享SDK和配置工具鏈同一個(gè)工程師可以在不同產(chǎn)品線之間快速切換。這種統(tǒng)一性在團(tuán)隊(duì)協(xié)作和代碼復(fù)用上帶來的便利比單芯片的峰值性能更實(shí)在。做工業(yè)控制的朋友應(yīng)該都有體會(huì)項(xiàng)目交付周期壓力大工程師上手快、復(fù)用率高這些軟實(shí)力對(duì)項(xiàng)目進(jìn)度的影響往往比芯片算力更大。4.3 仿真工具與真實(shí)平臺(tái)的銜接別指望Proteus跑新MCUProteus最新版本支持哪些ARM MCU這個(gè)搜索詞在高校教學(xué)和快速驗(yàn)證場景里很常見。Proteus確實(shí)支持不少ARM內(nèi)核MCU的仿真但如果你指望它支持最新的NXP通用MCU恐怕會(huì)失望——新芯片從發(fā)布到仿真軟件支持往往有很長時(shí)間的滯后。我的建議很簡單對(duì)于新MCU別指望仿真工具能幫上忙直接用FRDM開發(fā)板做硬件驗(yàn)證。一百多塊錢的開發(fā)板其價(jià)值遠(yuǎn)超仿真軟件——它跑在真實(shí)時(shí)鐘頻率、真實(shí)外設(shè)、真實(shí)信號(hào)完整性環(huán)境下調(diào)試體驗(yàn)和仿真完全不是一個(gè)量級(jí)。FRDM平臺(tái)的定位就是低門檻、低成本的硬件驗(yàn)證方案。做原型驗(yàn)證和課程設(shè)計(jì)FRDM比仿真軟件更有說服力。4.4 一張表看懂幾類芯片的典型分工系列典型定位核心優(yōu)勢適用場景S32K車規(guī)MCU功能安全、AUTOSAR支持車身控制、BMS、域控制器RT系列跨界MCU高性能、多媒體、邊緣計(jì)算HMI、語音識(shí)別、機(jī)器視覺MCX系列通用MCU功耗均衡、外設(shè)豐富、生態(tài)成熟IoT節(jié)點(diǎn)、電機(jī)控制、工業(yè)傳感LPC系列傳統(tǒng)通用MCU成本低、穩(wěn)定、兼容性強(qiáng)存量項(xiàng)目、簡易控制這張表不用背但要理解一個(gè)核心觀點(diǎn)NXP的產(chǎn)品線劃分不是簡單的性能從低到高而是按場景安全等級(jí)實(shí)時(shí)性的矩陣來布局的。選型時(shí)先明確自己的應(yīng)用屬于哪個(gè)象限再去對(duì)應(yīng)系列里找型號(hào)會(huì)高效很多。5. 用FRDM新板把項(xiàng)目跑起來從上電到量產(chǎn)的完整鏈路5.1 上電前的檢查這幾步能幫你少走很多彎路拿到FRDM新板子先別急著插USB。我建議按這個(gè)順序檢查一遍先看快速開始指南確認(rèn)板卡的供電方式——是通過USB供電還是需要外接電源不同版本可能有差異。檢查跳線帽位置特別是電源跳線、調(diào)試接口隔離跳線。有的是默認(rèn)短接狀態(tài)改動(dòng)硬件連接之前務(wù)必確認(rèn)。插USB線之前用萬用表二極管檔測一下VCC對(duì)地阻值紅表筆接地黑表筆接VCC正常讀數(shù)應(yīng)該在0.3到0.7之間。如果讀數(shù)是0或者很小說明存在短路這時(shí)候上電可能燒板。上電后觀察指示燈狀態(tài)確認(rèn)板載調(diào)試器枚舉正常電腦識(shí)別到調(diào)試器接口。這套檢查流程看著繁瑣但每次都能幫我避免板子為什么沒反應(yīng)的初級(jí)問題。特別是從倉庫拿舊板子的時(shí)候鬼知道上一個(gè)使用者動(dòng)了哪些跳線。5.2 第一個(gè)外設(shè)實(shí)驗(yàn)從點(diǎn)燈到定時(shí)器再到通信外設(shè)在FRDM新板上我建議的實(shí)驗(yàn)順序是點(diǎn)燈、定時(shí)器中斷、UART回環(huán)。這個(gè)順序是經(jīng)過考慮的——點(diǎn)燈驗(yàn)證的是工具鏈閉環(huán)創(chuàng)建工程、編譯、下載、調(diào)試器的連接定時(shí)器中斷驗(yàn)證的是時(shí)鐘樹和中斷系統(tǒng)UART回環(huán)驗(yàn)證的是通信外設(shè)和引腳配置。三步走完整條開發(fā)鏈路的核心環(huán)節(jié)就都驗(yàn)證過了。點(diǎn)燈實(shí)驗(yàn)的時(shí)候第一次編譯下載可能會(huì)碰到幾個(gè)小坑比如鏈接腳本里Flash起始地址和實(shí)際不匹配、調(diào)試器下載速度太快導(dǎo)致硬件不穩(wěn)定、板載調(diào)試器固件版本太舊需要升級(jí)。這些問題的排查方法在前面幾章已經(jīng)提到過初始化前用默認(rèn)配置逐項(xiàng)驗(yàn)證不急于自定義。一個(gè)具體的點(diǎn)燈代碼片段供參考配合MCUXpresso生成的初始化代碼#include fsl_gpio.h #include fsl_clock.h #define LED_RED_PIN 2U #define LED_RED_PORT GPIOA void delay_loop(volatile uint32_t count) { while (count--) { __asm volatile(nop); } } int main(void) { /* 引腳配置、時(shí)鐘配置在pin_mux.c和clock_config.c中生成 */ gpio_pin_config_t led_config { kGPIO_DigitalOutput, 0, }; GPIO_PinInit(LED_RED_PORT, LED_RED_PIN, led_config); while (1) { GPIO_PinWrite(LED_RED_PORT, LED_RED_PIN, 1U); delay_loop(500000); GPIO_PinWrite(LED_RED_PORT, LED_RED_PIN, 0U); delay_loop(500000); } }這個(gè)例子的重點(diǎn)不是代碼本身而是讓你確認(rèn)頭文件路徑正確、時(shí)鐘和外設(shè)初始化被正確調(diào)用、編譯鏈接無誤。如果這段代碼能跑起來說明工具鏈已經(jīng)通了后面的開發(fā)就可以專注在業(yè)務(wù)邏輯上。5.3 從FRDM到量產(chǎn)板卡幾個(gè)容易被忽略的關(guān)鍵點(diǎn)FRDM原型驗(yàn)證通過后設(shè)計(jì)自己的量產(chǎn)板時(shí)有幾個(gè)坑必須提醒啟動(dòng)配置引腳的上下拉狀態(tài)。FRDM板上這些引腳已經(jīng)按芯片要求配置好了但自制板如果漏接或者誤接芯片可能無法正常啟動(dòng)。時(shí)鐘源選擇。FRDM默認(rèn)用板載晶振自制板如果用內(nèi)部RC或者換用其他頻率的晶振必須在時(shí)鐘配置里對(duì)應(yīng)修改。去耦電容的位置和數(shù)量。FRDM的電源設(shè)計(jì)是經(jīng)過優(yōu)化的如果照著FRDM原理圖抄板子卻省略了部分濾波電容供電紋波可能超標(biāo)。調(diào)試接口一定預(yù)留。量產(chǎn)板哪怕成本壓力大也要焊一個(gè)SWD調(diào)試接口——后期排查問題節(jié)省的時(shí)間成本遠(yuǎn)超這幾毛錢。參考電壓和模擬地處理。如果量產(chǎn)板有用ADC模擬部分的布局要嚴(yán)格按照參考設(shè)計(jì)來處理不能為了走線方便隨意分割地平面。這些點(diǎn)看著都是老生常談但我見過太多項(xiàng)目從FRDM遷到自制板之后因?yàn)閱?dòng)配置引腳漏接或者去耦電容不足花了一兩周時(shí)間排查玄學(xué)問題。實(shí)際上這些都不是玄學(xué)都是原理圖階段可以避免的低級(jí)失誤。5.4 新平臺(tái)和量產(chǎn)板之間的另一道橋bootloader與固件升級(jí)最后聊一個(gè)容易被忽視但很重要的環(huán)節(jié)——bootloader。從FRDM原型到量產(chǎn)固件升級(jí)方式往往要從IDE下載切換成bootloader方案。這也是S32K344 bootloader搜索量很高的原因。一個(gè)穩(wěn)妥的bootloader設(shè)計(jì)通常包括固定優(yōu)先級(jí)的中斷向量表處理、Flash扇區(qū)劃分、固件校驗(yàn)策略、升級(jí)失敗回滾機(jī)制。在NXP MCU上實(shí)現(xiàn)時(shí)要注意啟動(dòng)流程圖里說的向量表偏移問題——APP的向量表必須偏移到APP所在Flash區(qū)域同時(shí)保證中斷響應(yīng)正常。FRDM平臺(tái)上可以先跑通一個(gè)簡單的串口bootloader驗(yàn)證升級(jí)鏈路再遷移到量產(chǎn)板。這個(gè)流程值得在原型階段就設(shè)計(jì)好否則量產(chǎn)之后再補(bǔ)bootloader改動(dòng)成本會(huì)非常大。