)
1. 為什么WCH-Link的“模式切換”是CH32開發(fā)的第一道坎拿到WCH-Link和一塊CH32開發(fā)板很多人第一反應(yīng)是插上USB線、打開IDE、點下載。結(jié)果大概率是IDE報錯找不到目標(biāo)芯片或者提示“芯片型號不匹配”又或者下載進(jìn)度條卡在0%不動。折騰半天最后發(fā)現(xiàn)是WCH-Link的工作模式?jīng)]切對。WCH-Link本質(zhì)上是一個可編程的調(diào)試下載器它內(nèi)部跑著自己的固件支持多種工作模式。你可以把它理解成一把“萬能鑰匙”但這把鑰匙有多個檔位檔位不對鎖自然打不開。它主要支持兩種大模式RISC-V模式和ARM模式。CH32系列里CH32V系列是RISC-V內(nèi)核CH32F系列是ARM Cortex-M內(nèi)核。如果你用WCH-Link去調(diào)試CH32V003但Link當(dāng)前處于ARM模式那它發(fā)出的調(diào)試信號協(xié)議完全對不上自然連不上。1.1 模式切換的兩種方式按鍵切換與軟件切換WCH-Link上通常有一個小按鍵短按可以在模式之間循環(huán)切換。但這里有個坑按鍵切換后需要重新插拔USB才會生效。我見過不少人按了按鍵看到指示燈變了顏色以為切好了直接點下載結(jié)果還是失敗。實際上WCH-Link的模式切換是寫入內(nèi)部配置的重新枚舉USB設(shè)備后才會以新模式啟動。另一種方式是通過WCH官方提供的工具軟件來切換。在Windows下可以用“WCH-LinkUtility”這個工具界面里直接選擇目標(biāo)模式點擊“切換”即可。這種方式的好處是狀態(tài)可見工具會明確告訴你當(dāng)前Link處于什么模式、固件版本是多少。如果你手頭沒有這個工具也可以去WCH官網(wǎng)下載“WCH-LinkUtility”的壓縮包解壓后直接運行exe不需要安裝。注意切換模式時WCH-Link不能同時連接目標(biāo)板和USB。正確順序是先只插USB切換模式拔掉USB再連接目標(biāo)板最后插USB。1.2 指示燈狀態(tài)速查別把“電源燈”當(dāng)成“狀態(tài)燈”WCH-Link上一般有兩個燈一個電源指示燈通常是紅色或藍(lán)色常亮一個狀態(tài)指示燈通常是綠色或橙色閃爍。很多人看到電源燈亮了就以為一切正常其實狀態(tài)燈才反映Link的工作狀態(tài)。指示燈狀態(tài)含義處理建議電源燈常亮狀態(tài)燈不亮Link已供電但未初始化檢查USB線是否支持?jǐn)?shù)據(jù)傳輸換一根線試試狀態(tài)燈慢閃處于待機模式等待連接正??梢赃B接目標(biāo)板狀態(tài)燈快閃正在通信或下載中不要拔線等待完成狀態(tài)燈常亮模式配置錯誤或固件異常用WCH-LinkUtility重新切換模式或升級固件這個表是我在實際調(diào)試中反復(fù)驗證過的。特別是狀態(tài)燈常亮的情況十有八九是模式選錯了或者Link內(nèi)部固件損壞了。這時候別急著懷疑板子先用工具檢查Link本身。1.3 模式切換失敗的典型場景與修復(fù)有一種情況特別隱蔽你明明用工具切換到了RISC-V模式工具也提示成功了但連接CH32V003還是失敗。這時候要檢查目標(biāo)板的供電。WCH-Link的調(diào)試接口通常只提供信號線SWDIO、SWCLK、GND不提供電源。如果你的CH32板子沒有獨立供電只靠Link的3.3V引腳供電而板子上又有其他耗電外設(shè)電壓可能被拉低到2.8V以下導(dǎo)致芯片無法正常響應(yīng)調(diào)試信號。我的做法是始終給目標(biāo)板獨立供電不管是USB供電還是外部電源確保3.3V穩(wěn)定。然后用萬用表量一下Link的3.3V輸出和板子上的3.3V如果壓差超過0.2V就要考慮供電不足的問題。還有一種情況是驅(qū)動沖突。Windows下WCH-Link會被識別為“USB設(shè)備”但如果你之前裝過其他調(diào)試器的驅(qū)動比如某些ARM調(diào)試器的驅(qū)動可能會搶占WCH-Link的接口。表現(xiàn)是設(shè)備管理器里能看到WCH-Link但I(xiàn)DE里就是找不到。解決辦法是在設(shè)備管理器里找到WCH-Link設(shè)備右鍵“卸載設(shè)備”勾選“刪除驅(qū)動程序”然后重新插拔讓W(xué)indows重新安裝WCH官方驅(qū)動。2. 固件下載的完整鏈路從編譯產(chǎn)物到芯片F(xiàn)lash模式切對了接下來就是固件下載。這一步看似簡單但涉及編譯、鏈接、格式轉(zhuǎn)換、下載算法等多個環(huán)節(jié)任何一個環(huán)節(jié)出問題都會導(dǎo)致下載失敗。2.1 編譯產(chǎn)物的格式選擇elf、hex還是bin在MounRiver StudioWCH官方推薦的IDE里編譯完成后會生成多個文件.elf、.hex、.bin、.map等。很多人不清楚該用哪個文件下載。.elf文件包含調(diào)試信息、符號表、代碼段、數(shù)據(jù)段等是調(diào)試時的首選。WCH-Link配合IDE下載時通常直接使用.elf文件因為IDE需要從中提取調(diào)試信息。.hex文件Intel HEX格式包含地址信息適合通過串口或第三方工具下載。.bin文件純二進(jìn)制不包含地址信息下載時必須指定起始地址。CH32V系列通常從0x08000000開始。我的習(xí)慣是用IDE下載時選.elf用獨立工具下載時選.hex。.bin文件我一般只在批量生產(chǎn)時用因為需要額外指定地址容易出錯。提示如果你用WCH-LinkUtility下載它支持.hex和.bin兩種格式。選.bin時工具會要求你填寫起始地址CH32V003的Flash起始地址是0x08000000填錯的話程序跑不起來。2.2 下載算法的匹配為什么你的CH32V003下載特別慢WCH-Link在下載時需要根據(jù)目標(biāo)芯片的Flash規(guī)格加載對應(yīng)的下載算法。CH32V003的Flash是16KB頁大小是64字節(jié)CH32V103的Flash是64KB頁大小是1KB。如果下載算法不匹配輕則下載速度極慢重則下載失敗。我在調(diào)試CH32V003時發(fā)現(xiàn)用默認(rèn)的下載配置下載一個幾KB的程序要十幾秒明顯不正常。后來在MounRiver Studio的下載配置里把“Download Algorithm”從默認(rèn)的“Auto”改成手動選擇“CH32V003”對應(yīng)的算法下載時間直接降到2秒以內(nèi)。芯片型號Flash大小頁大小推薦下載算法CH32V00316KB64BCH32V003_FlashCH32V10364KB1KBCH32V103_FlashCH32F10364KB1KBCH32F103_FlashCH32V307256KB2KBCH32V307_Flash這個表建議保存下來每次新建工程時對照檢查。特別是從CH32V003換到CH32V103時如果忘了改算法下載會報“Flash編程失敗”。2.3 下載失敗的錯誤碼解讀與排查順序WCH-Link下載失敗時IDE通常會彈出一個錯誤碼。很多人看到錯誤碼就懵了其實常見的就那么幾個Error: Flash Download failed - Cortex-M3這是ARM模式的錯誤說明你當(dāng)前Link處于ARM模式但目標(biāo)芯片是RISC-V。切回RISC-V模式即可。Error: No target connectedLink沒檢測到目標(biāo)芯片。檢查接線SWDIO、SWCLK、GND、3.3V檢查目標(biāo)板供電檢查芯片是否處于復(fù)位狀態(tài)。Error: Flash programming failed at address 0x08000000下載算法不匹配或Flash被寫保護。先檢查算法再檢查選項字節(jié)Option Bytes里的寫保護位。Error: Verification failed下載后校驗失敗通常是Flash質(zhì)量問題或供電不穩(wěn)。換一塊板子試試或者降低下載速度。我的排查順序是先看Link模式再看接線和供電最后看下載算法和選項字節(jié)。這個順序能覆蓋90%以上的下載失敗場景。2.4 串口下載的備用方案當(dāng)WCH-Link不在手邊有時候WCH-Link不在身邊或者Link本身壞了還可以用串口下載。CH32系列支持通過UART進(jìn)行ISP下載前提是芯片的Boot模式設(shè)置正確。CH32V003的Boot模式由BOOT0引腳決定BOOT0接GND時從Flash啟動接VCC時從系統(tǒng)存儲器啟動即ISP模式。串口下載的步驟是把BOOT0接到VCCBOOT1接到GND。復(fù)位芯片拉低NRST再釋放。用WCH提供的“WCHISPTool”軟件選擇串口點擊下載。下載完成后把BOOT0接回GND再次復(fù)位程序開始運行。這個方案的好處是不依賴WCH-Link只需要一個USB轉(zhuǎn)TTL模塊。缺點是每次下載都要手動切換BOOT0比較麻煩。我通常在產(chǎn)品開發(fā)階段用WCH-Link在現(xiàn)場升級時用串口ISP。3. USB設(shè)備開發(fā)中的枚舉失敗與描述符陷阱CH32系列里很多型號帶USB外設(shè)比如CH32V103、CH32F103、CH32V307。用這些芯片做USB設(shè)備開發(fā)時最容易卡在“枚舉失敗”這一步。設(shè)備插上電腦電腦提示“無法識別的USB設(shè)備”或者設(shè)備管理器里出現(xiàn)一個帶黃色感嘆號的未知設(shè)備。3.1 USB枚舉的完整流程與常見斷點USB枚舉是主機和設(shè)備之間的一系列標(biāo)準(zhǔn)請求交互。簡單說主機先復(fù)位設(shè)備然后讀取設(shè)備描述符的前8個字節(jié)再讀取完整的設(shè)備描述符接著設(shè)置地址讀取配置描述符、接口描述符、端點描述符最后選擇配置。任何一個環(huán)節(jié)出錯枚舉都會失敗。在CH32上枚舉失敗最常見的原因是描述符數(shù)據(jù)不正確。比如設(shè)備描述符里的bMaxPacketSize0字段對于全速設(shè)備必須是8、16、32或64如果你填了其他值主機直接拒絕。又比如配置描述符里的wTotalLength字段必須等于所有描述符的總長度填錯了主機會認(rèn)為描述符不完整。我遇到過最隱蔽的一個問題是字符串描述符的編碼格式。USB字符串描述符要求使用UTF-16LE編碼每個字符占2字節(jié)。如果你直接用ASCII字符串主機會解析出亂碼雖然不一定導(dǎo)致枚舉失敗但設(shè)備名稱會顯示異常。正確的做法是用uint16_t數(shù)組來定義字符串每個字符后面跟一個0x00。3.2 端點配置的坑FIFO分配與雙緩沖CH32的USB外設(shè)有一個專用FIFO區(qū)域需要手動分配給各個端點。如果FIFO分配不合理比如給端點0分配的空間太小枚舉時就會因為無法發(fā)送完整的描述符而失敗。以CH32V103為例USB FIFO總大小是512字節(jié)。端點0通常需要64字節(jié)用于控制傳輸端點1、2、3、4根據(jù)你的應(yīng)用需求分配。我的經(jīng)驗是端點0至少分配64字節(jié)其他端點根據(jù)最大包長分配留出至少64字節(jié)的余量。另一個坑是雙緩沖模式。CH32的某些端點支持雙緩沖可以提高吞吐量但配置起來比較復(fù)雜。如果你不需要高速傳輸建議先用單緩沖把枚舉跑通再考慮雙緩沖優(yōu)化。我見過有人在雙緩沖配置上卡了好幾天最后發(fā)現(xiàn)是緩沖區(qū)切換的時序不對。3.3 用Bus Hound和Wireshark抓包定位枚舉問題當(dāng)枚舉失敗時光看代碼很難找到問題。這時候需要抓包工具。Windows下推薦Bus Hound它可以捕獲USB總線上的所有通信數(shù)據(jù)包括標(biāo)準(zhǔn)請求、描述符內(nèi)容、端點數(shù)據(jù)等。使用Bus Hound的步驟打開Bus Hound在“Devices”里找到你的USB設(shè)備。點擊“Capture”開始抓包。插拔USB設(shè)備觸發(fā)枚舉過程。停止抓包查看“Phase”列找到“CTL”和“IN”、“OUT”階段的數(shù)據(jù)。重點看主機發(fā)送的GET_DESCRIPTOR請求和設(shè)備返回的描述符數(shù)據(jù)。如果設(shè)備返回的數(shù)據(jù)長度不對或者內(nèi)容不符合USB規(guī)范Bus Hound會明確標(biāo)出來。如果Bus Hound不夠直觀還可以用Wireshark配合USBPcap插件。Wireshark的解析更詳細(xì)能看到每個字段的含義適合深入分析。3.4 枚舉成功但通信不穩(wěn)定的排查思路有時候枚舉成功了設(shè)備管理器里也能看到設(shè)備但一通信就出錯比如數(shù)據(jù)丟失、傳輸超時。這種情況通常是端點中斷處理或緩沖區(qū)管理的問題。我的排查思路是先檢查端點中斷是否使能。CH32的USB中斷有多個標(biāo)志位比如CTR_IF正確傳輸標(biāo)志、ERR_IF錯誤標(biāo)志。如果只使能了CTR_IF沒使能ERR_IF出錯時就不會進(jìn)中斷數(shù)據(jù)就丟了。再檢查緩沖區(qū)指針。CH32的USB端點有獨立的緩沖區(qū)描述符表BDT每個端點有發(fā)送和接收兩個BD。如果BDT的地址配置錯了數(shù)據(jù)會寫到錯誤的內(nèi)存區(qū)域。最后檢查USB時鐘。CH32的USB外設(shè)需要48MHz時鐘這個時鐘通常由PLL提供。如果系統(tǒng)時鐘配置不對USB時鐘偏了通信就會不穩(wěn)定。用示波器量一下USB的DP/DM信號看眼圖是否正常。4. 從零搭建一個CH32 USB HID設(shè)備的實操記錄前面講了原理和排查方法這一節(jié)用一個完整的例子把流程串起來用CH32V103做一個USB HID鍵盤按下板子上的按鍵電腦就輸入一個字符。4.1 工程創(chuàng)建與USB庫的裁剪在MounRiver Studio里新建工程選擇CH32V103然后從WCH官網(wǎng)下載“CH32V103 USB Device Library”。這個庫包含了USB設(shè)備開發(fā)所需的所有底層驅(qū)動和示例代碼。庫文件很多但做HID鍵盤只需要保留以下幾部分USB_Device/USB設(shè)備核心驅(qū)動USB_Class/HID/HID類驅(qū)動Hardware/硬件初始化User/主函數(shù)和回調(diào)函數(shù)其他用不到的類比如MSC、CDC可以刪掉減少編譯時間和Flash占用。我試過裁剪后編譯出來的固件從20KB降到了8KB左右。4.2 描述符的定制讓電腦認(rèn)出你的鍵盤HID鍵盤的描述符包括設(shè)備描述符、配置描述符、接口描述符、HID描述符、端點描述符、報告描述符。其中報告描述符是最關(guān)鍵的它定義了按鍵數(shù)據(jù)的格式。一個最簡單的鍵盤報告描述符如下const uint8_t KeyboardReportDescriptor[] { 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x06, // Usage (Keyboard) 0xA1, 0x01, // Collection (Application) 0x05, 0x07, // Usage Page (Keyboard) 0x19, 0xE0, // Usage Minimum (Left Control) 0x29, 0xE7, // Usage Maximum (Right GUI) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x08, // Report Count (8) 0x81, 0x02, // Input (Data, Variable, Absolute) 0x95, 0x01, // Report Count (1) 0x75, 0x08, // Report Size (8) 0x81, 0x01, // Input (Constant) 0x95, 0x06, // Report Count (6) 0x75, 0x08, // Report Size (8) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x65, // Logical Maximum (101) 0x05, 0x07, // Usage Page (Keyboard) 0x19, 0x00, // Usage Minimum (0) 0x29, 0x65, // Usage Maximum (101) 0x81, 0x00, // Input (Data, Array) 0xC0 // End Collection };這段描述符定義了一個標(biāo)準(zhǔn)的6鍵無沖鍵盤。前8個字節(jié)是修飾鍵Ctrl、Shift、Alt等第9個字節(jié)保留后面6個字節(jié)是普通按鍵的鍵碼。4.3 按鍵觸發(fā)與報告發(fā)送的代碼實現(xiàn)主循環(huán)里檢測按鍵按下時發(fā)送對應(yīng)的鍵碼松開時發(fā)送全零報告。void main(void) { Delay_Init(); USB_Device_Init(); GPIO_Init(); while (1) { if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) 0) { // 按鍵按下發(fā)送a鍵碼 uint8_t report[8] {0, 0, 0x04, 0, 0, 0, 0, 0}; USB_Device_SendReport(report, 8); Delay_Ms(10); // 發(fā)送釋放報告 uint8_t release[8] {0}; USB_Device_SendReport(release, 8); Delay_Ms(10); } } }這里有個細(xì)節(jié)發(fā)送報告后要延時。USB HID報告是周期性傳輸?shù)闹鳈C每1ms或10ms輪詢一次端點。如果發(fā)送太快主機可能來不及處理導(dǎo)致丟包。我一般延時10ms實測很穩(wěn)。4.4 實測中遇到的枚舉失敗與解決過程第一次燒錄后插上USB電腦提示“無法識別的USB設(shè)備”。用Bus Hound抓包發(fā)現(xiàn)主機發(fā)送GET_DESCRIPTOR請求后設(shè)備沒有返回數(shù)據(jù)。排查過程檢查USB時鐘用示波器量PA11DM和PA12DP發(fā)現(xiàn)沒有信號。說明USB外設(shè)根本沒工作。檢查USB初始化代碼發(fā)現(xiàn)USB_Device_Init()里沒有使能USB時鐘。CH32V103的USB時鐘由RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE)使能漏了這一步。補上時鐘使能重新編譯下載枚舉成功。這個坑很典型USB外設(shè)的時鐘使能容易被忽略。CH32的參考手冊里寫得很清楚但新手往往只看初始化函數(shù)忘了時鐘配置。5. 調(diào)試工具鏈的選型與替代方案WCH-Link是官方推薦的調(diào)試器但并不是唯一選擇。根據(jù)你的開發(fā)場景有時候用其他工具會更方便。5.1 WCH-Link與第三方調(diào)試器的對比調(diào)試器支持芯片優(yōu)點缺點WCH-LinkCH32全系列官方支持價格便宜模式切換麻煩固件偶爾抽風(fēng)WCH-LinkECH32全系列支持離線下載速度更快價格稍貴J-LinkARM內(nèi)核CH32F系列調(diào)試功能強大速度快不支持RISC-V內(nèi)核OpenOCDFT2232RISC-V內(nèi)核CH32V系列開源可定制配置復(fù)雜上手門檻高如果你主要開發(fā)CH32V系列RISC-V內(nèi)核WCH-Link是最省心的選擇。如果你同時開發(fā)CH32F系列ARM內(nèi)核J-Link的調(diào)試體驗更好但需要額外買一個WCH-Link用于RISC-V芯片。5.2 離線下載WCH-LinkE的實用場景WCH-LinkE支持離線下載意思是你可以先把固件燒到LinkE里然后帶著LinkE去現(xiàn)場不需要電腦就能給板子下載程序。這個功能在小批量生產(chǎn)或現(xiàn)場升級時特別有用。配置離線下載的步驟用WCH-LinkUtility連接LinkE。選擇“離線下載”選項卡加載.hex文件。點擊“下載到LinkE”等待完成。把LinkE連接到目標(biāo)板按下LinkE上的按鍵固件自動下載到目標(biāo)芯片。我實測過一個16KB的固件離線下載只需要3秒左右比帶電腦方便多了。5.3 固件升級當(dāng)WCH-Link本身需要更新WCH-Link的固件也會更新新固件通常修復(fù)了一些bug或增加了新芯片的支持。升級方法是打開WCH-LinkUtility連接Link。點擊“固件升級”選擇最新的固件文件.bin格式。等待升級完成Link會自動重啟。注意升級過程中絕對不能拔USB線否則Link會變磚。如果真變磚了可以嘗試短接Link上的某個跳線具體看版本進(jìn)入Boot模式重新燒錄固件。6. 那些文檔里不會寫的實操經(jīng)驗最后分享幾個我在實際項目中踩過的坑和總結(jié)的技巧這些在官方文檔里找不到但能幫你省下不少時間。6.1 杜邦線的質(zhì)量直接影響調(diào)試穩(wěn)定性WCH-Link和CH32板子之間通常用杜邦線連接。劣質(zhì)杜邦線的接觸電阻可能達(dá)到幾歐姆導(dǎo)致SWDIO/SWCLK信號畸變調(diào)試時斷時續(xù)。我的做法是用萬用表量一下杜邦線的通斷和電阻超過1歐姆的直接換掉。另外線長不要超過15cm太長會引入寄生電容影響信號質(zhì)量。6.2 復(fù)位電路的設(shè)計缺陷會導(dǎo)致下載失敗有些CH32開發(fā)板的復(fù)位電路設(shè)計不合理NRST引腳上的電容太大比如100nF導(dǎo)致復(fù)位時間過長WCH-Link在復(fù)位期間無法建立連接。解決辦法是把電容換成10nF或者干脆去掉電容用芯片內(nèi)部的復(fù)位電路。我遇到過一塊板子下載十次成功一次換了電容后次次成功。6.3 選項字節(jié)誤操作會導(dǎo)致芯片鎖死CH32的選項字節(jié)Option Bytes里有讀保護位和寫保護位。如果不小心使能了讀保護芯片就無法再下載程序了會提示“讀保護錯誤”。解鎖的方法是用WCH-LinkUtility連接芯片選擇“解除讀保護”然后重新下載。這個過程會擦除整個Flash所以操作前一定要確認(rèn)代碼有備份。6.4 多芯片調(diào)試時的模式切換策略如果你手頭同時有CH32V003和CH32F103需要來回切換WCH-Link的模式。我的策略是給每個芯片配一個WCH-Link雖然多花幾十塊錢但省去了反復(fù)切換的麻煩。如果預(yù)算有限至少準(zhǔn)備一個WCH-LinkUtility的快捷方式放在桌面切換時一鍵打開。6.5 USB設(shè)備開發(fā)中的電源管理細(xì)節(jié)CH32的USB外設(shè)在掛起Suspend時電流應(yīng)該降到2.5mA以下。如果你的設(shè)備在電腦休眠后無法喚醒或者喚醒后枚舉失敗檢查一下USB掛起中斷的處理。在掛起中斷里應(yīng)該把系統(tǒng)時鐘切換到低速時鐘關(guān)閉不必要的外設(shè)降低功耗。喚醒時再恢復(fù)時鐘和外設(shè)。這個細(xì)節(jié)在數(shù)據(jù)手冊里有但很多人做USB HID時只關(guān)注枚舉和通信忽略了電源管理。6.6 用WCH-Link給其他芯片下載的可行性有人問能不能用WCH-Link給STM32下載程序。答案是部分可以。WCH-Link在ARM模式下理論上支持標(biāo)準(zhǔn)的SWD協(xié)議可以給STM32F103等ARM Cortex-M芯片下載。但實際測試中WCH-Link對STM32的支持并不完美有時候會報“ID不匹配”。如果你手頭只有WCH-Link可以試試但不要指望它能完全替代ST-Link。我試過給STM32F103C8T6下載成功率大概七成偶爾需要重試幾次。6.7 固件下載后的驗證步驟下載完成后不要急著拔線。先做三件事讀回校驗用WCH-LinkUtility的“讀取”功能把Flash里的內(nèi)容讀回來和源文件對比。如果一致說明下載成功。復(fù)位運行按一下板子上的復(fù)位鍵觀察程序是否正常運行。有些芯片下載后需要手動復(fù)位才會運行新程序。檢查選項字節(jié)確認(rèn)讀保護、寫保護、看門狗等配置是否符合預(yù)期。特別是看門狗如果誤使能了硬件看門狗程序跑一會兒就復(fù)位很難排查。這三步做完基本可以確認(rèn)下載環(huán)節(jié)沒有問題。如果程序運行異常就可以把精力放在代碼邏輯上而不是懷疑下載過程。6.8 關(guān)于CH32V003的特別提醒CH32V003是CH32系列里最便宜的型號但它的調(diào)試接口只有SWDIO和SWCLK兩根線沒有NRST。這意味著WCH-Link無法通過硬件復(fù)位來控制芯片只能通過軟件復(fù)位。如果芯片跑飛了進(jìn)入了死循環(huán)WCH-Link可能連不上。這時候需要手動把SWDIO引腳拉低再上電強制芯片進(jìn)入調(diào)試模式。具體操作是用一根杜邦線把SWDIO接到GND插USB等Link識別到芯片后拔掉杜邦線再點下載。這個技巧在CH32V003上特別有用我至少用過十幾次。6.9 編譯優(yōu)化等級對下載的影響MounRiver Studio默認(rèn)的編譯優(yōu)化等級是-O0無優(yōu)化生成的代碼比較大。如果你的Flash快滿了可以改成-Os優(yōu)化尺寸。但要注意高優(yōu)化等級可能會改變代碼的執(zhí)行時序特別是涉及延時和USB通信的部分。我遇到過改成-O2后USB枚舉失敗的情況改回-O0就正常了。所以優(yōu)化等級要逐步調(diào)整每次調(diào)整后都要完整測試。6.10 備份你的WCH-Link配置WCH-Link的模式和固件版本信息可以導(dǎo)出備份。在WCH-LinkUtility里有一個“導(dǎo)出配置”的功能把當(dāng)前Link的狀態(tài)保存成文件。如果以后Link出了問題可以導(dǎo)入配置快速恢復(fù)。這個功能很少有人用但關(guān)鍵時刻能省去重新配置的麻煩。我習(xí)慣每換一個項目就導(dǎo)出一次配置標(biāo)注好對應(yīng)的芯片型號下次直接導(dǎo)入。