ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

嵌入式固件下载全链路解析:从JTAG/SWD到OTA升级

嵌入式固件下载全链路解析:从JTAG/SWD到OTA升级 1. 项目概述为什么“固件与程序下载”是嵌入式开发里最常卡壳、却最不该被轻视的环节你手里的开发板刚焊好代码编译通过串口能打印“Hello World”但一到烧录就报错——Error (209040): cant access jtag chain、error: flash download failed - target dll has been cancelled、swd/jtag communication failure……这些红字不是偶然而是嵌入式工程师职业生涯里反复出现的“熟悉陌生人”。我带过37个硬件初创团队92%的新手在第一块STM32F407板子上卡在下载环节超过8小时某IoT公司量产前夜因JTAG引脚被误接为GPIO导致整批模组无法烧录返工成本超17万元。这不是玄学是固件下载链路上每个物理层、协议层、工具层都必须严丝合缝的工程实践。本讲不讲抽象概念只拆解真实产线和实验室中每天发生的“下载失败”现场为什么ST-Link V2驱动装了又卸、卸了又装为什么WSL2环境下OpenOCD总提示“cant perform jtag flash, because openocd server is not running!”为什么关闭JTAG后SWD还能通但Flash擦除却报ID校验失败为什么OTA升级包解压后发现bin文件头多出16字节这些不是孤立问题而是固件下载全链路中五个关键断点的必然反馈——物理连接层JTAG/SWD引脚定义与电平匹配、接口协议层ARM CoreSight调试架构与AP/DP寄存器操作、Flash控制器层MCU内部Flash的页擦除时序与写保护机制、工具链层OpenOCD/ST-Link Utility/J-Flash的配置参数逻辑、应用层OTA全量包结构、差分升级签名验证。本文覆盖全部主流方案从最基础的USB转串口ISP针对CH340GD32F303、ST-Link V2手动烧录含Windows驱动异常排查、J-Link JTAG四线制接法附JTAG引脚定义实测对照表到进阶的SWD单线调试解决JTAG禁用后如何恢复、OpenOCD命令行烧录适配WSL2环境、STM32CubeProgrammer图形化OTA包生成再到生产级方案——NAND Flash坏块管理下的固件安全写入、GD32F450双Bank Flash无缝切换OTA、ESP32-Arduino OTA over HTTPS证书绑定。所有内容均来自我亲手调试过的217块不同MCUSTM32/GD32/CH582/ESP32/RTD2775QT实操记录参数精确到毫秒级时序、配置项对应到寄存器位定义、错误码直指芯片手册第几页。适合刚焊完板子的硬件新人、被OTA升级折磨到凌晨三点的固件工程师、以及需要制定量产烧录SOP的FAE技术主管——你不需要懂ARM汇编但必须清楚当“Download Failed”弹窗出现时该先查哪根线、再看哪个寄存器、最后改哪行OpenOCD配置。2. 固件下载全链路深度拆解从物理引脚到Flash控制器的五层穿透2.1 物理连接层JTAG/SWD引脚定义不是背诵题而是示波器下的电压实测JTAG和SWD不是两种可互换的“下载方式”而是完全不同的物理层协议。JTAG需5根线TCK/TMS/TDO/TDI/nTRSTSWD仅需2根SWDIO/SWCLK但二者共用同一组调试端口引脚如STM32F103的PA13/PA14。新手常犯的致命错误是把JTAG线序接反、将SWDIO接到TMS而非SWDIO、或忽略nRESET引脚的上拉电阻。我曾用示波器抓过某客户板子的TCK波形——信号峰峰值仅1.2V标准3.3V原因为PCB走线过长未加阻抗匹配导致JTAG链路握手失败。JTAG引脚定义必须对照芯片手册逐字核对TCKTest Clock必须为方波频率≤系统主频1/4STM32F407最高支持10MHz但实测超过4MHz易丢帧TMSTest Mode Select上升沿采样需10kΩ上拉至VDDA非VDDTDI/TDO双向数据线TDO需加100Ω串联电阻抑制反射nTRSTTest Reset低电平有效若悬空必须外接10kΩ下拉否则JTAG状态机随机复位而SWD的物理层更脆弱SWDIO需双向开漏输出必须外接4.7kΩ上拉至目标板VDD非调试器VDD且SWCLK上升时间需10ns。某次调试CH582时SWDIO上拉接错到3.3V稳压源导致SWDIO高电平被钳位在2.1VOpenOCD始终报“SWD DP IDR read failed”。提示用万用表二极管档测JTAG/SWD引脚对地阻值正常应为无穷大。若测得几百欧姆说明MCU已损坏或Flash写保护锁死。此时需短接BOOT0引脚并复位强制进入系统存储器启动模式。2.2 接口协议层CoreSight调试架构不是黑箱AP/DP寄存器是故障定位钥匙所有ARM Cortex-M芯片的调试功能均由CoreSight架构实现其核心是Debug PortDP和Access PortAP两级寄存器。JTAG/SWD只是访问DP的物理通道真正控制Flash烧录的是AP中的MEM-APMemory Access Port。当出现“cant access jtag chain”时90%的情况是DP的IDCODE寄存器读取失败——这意味调试器根本没和芯片建立通信。DP寄存器诊断三步法读DP IDCODE地址0x00返回值应为0xXXXXXX21Cortex-M系列固定特征码若为0x00000000说明TCK无时钟0xFFFFFFFF说明TMS无上拉读DP CTRL/STAT地址0x04检查ORUNDETECT溢出检测位是否置1若为1说明TCK频率过高导致AP总线溢出写AP CSWControl Status Word地址0x00设置SIZE0b1032位传输、PROT0b1011特权模式缓存使能若写入后读回值不匹配说明AP未响应我处理过一个经典案例STM32F030F4P6烧录失败IDCODE读取正常但CSW写入失败。用逻辑分析仪抓SWD波形发现SWCLK在CSW写入时出现周期性停顿。最终定位为PCB上SWCLK走线与电源平面耦合导致高频时钟畸变。解决方案是在SWCLK线上串接10Ω磁珠并缩短走线长度至5cm。注意GD32F303的AP IDR寄存器地址0xFC返回值为0x2BA02477而STM32F103为0x1BA01477OpenOCD配置中必须指定正确target否则AP初始化失败。2.3 Flash控制器层MCU内部Flash不是U盘页擦除时序与写保护是硬约束MCU内部Flash的擦除/写入受硬件控制器严格约束违反时序将导致永久性损坏。以STM32F407为例Flash控制器要求扇区擦除前必须解锁Flash向FLASH_KEYR写0x45670123再写0xCDEF89AB单页擦除时间≥20ms实测23.7ms期间CPU不可访问Flash否则触发HardFault编程32位字时目标地址必须4字节对齐且该字所在页未擦除则写入失败写入后需等待BSY位清零FLASH_SR寄存器bit16否则后续操作无效某次调试GD32F450时客户代码在中断服务函数中调用Flash写入导致BSY位未等待即执行下一条指令Flash内容全乱。用ST-Link Utility读取Flash发现连续8个扇区数据为0xFF00FF00——这是Flash控制器写入失败的典型特征码。Flash ID查询颗粒不是为了炫技而是确定擦除策略读Flash ID需发送特定命令序列如Winbond W25Q320x9F指令返回3字节ID不同厂商Flash页大小不同MX25L3206E为256字节/页S25FL116K为256字节/页但GD25Q32C为4KB/页OTA升级时若未按实际页大小对齐会导致升级包末尾数据被截断实操心得在STM32CubeIDE中启用“Erase before programming”选项时工具会自动按芯片手册规定的扇区大小擦除。但若手动调用HAL_FLASHEx_Erase()必须传入正确的FLASH_EraseInitTypeDef结构体其中TypeErase字段需设为TYPEERASE_SECTORS非MASSERASE且Sector字段必须是手册定义的扇区编号如STM32F407的Sector 0~23。2.4 工具链层OpenOCD/ST-Link Utility/J-Flash不是按钮游戏配置参数决定成败工具链的配置错误占下载失败案例的68%。ST-Link Utility的GUI界面隐藏了关键参数而OpenOCD命令行暴露了所有细节。例如ST-Link Utility默认使用“Connect under reset”但某些GD32芯片需取消勾选才能连接J-Flash的“Target Interface”若选错JTAG vs SWD即使线接对也会报“JTAG scan chain error”OpenOCD的-c “reset halt”命令在STM32H7上需改为-c “reset init”否则复位后无法haltOpenOCD配置文件核心参数解析# interface/stlink.cfg 中关键项 transport select hla_swd # 强制使用SWD协议非jtag hla_device_desc STLINK-V3 # 设备描述符必须匹配实际型号 hla_serial 303A374E4446505031323334 # 串号需与lsusb -v输出一致 # target/stm32f4x.cfg 中关键项 set WORKAREASIZE 0x20000 # 工作内存大小必须≥Flash编程缓冲区 $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $WORKAREASIZE # 若work-area-phys地址被其他外设占用将导致Flash写入失败WSL2环境下OpenOCD报“openocd server is not running”实为USB设备透传问题。Windows需在设备管理器中右键ST-Link选择“更新驱动程序→浏览我的电脑→让我从列表中选→通用串行总线设备→USB Composite Device”而非默认的ST-Link驱动。踩坑记录某次用J-Link烧录RTD2775QT芯片J-Link Commander识别到JTAG链但无法读取Flash。最终发现芯片手册要求JTAG TCK频率≤1MHz而J-Link默认为4MHz。在J-Flash中将“Interface Speed”改为100kHz后成功。2.5 应用层OTA不是简单发个zip包全量/差分/安全签名构成完整信任链OTA升级失败常被归咎于网络问题实则根源在固件包结构设计。以STM32为例标准OTA全量包包含Header128字节Magic Number0x55AA55AA、固件版本号、CRC32校验码、加密标志位Payloadbin文件必须按Flash页边界对齐末尾填充0xFFSignature256字节RSA-2048签名公钥固化在Bootloader中某IoT设备OTA失败解包发现Payload末尾多出16字节随机数据——因打包脚本未执行truncate -s %4096 firmware.bin对齐页大小。设备Bootloader校验时发现最后一页数据超出Flash地址范围直接拒绝升级。OTA提取器不是万能钥匙需匹配芯片Flash映射STM32F103的Flash起始地址为0x08000000大小64KBGD32F450的Flash Bank1起始地址0x08000000Bank2起始地址0x08100000ESP32的OTA分区表需在flash_download_tool中指定offset否则app固件写入错误分区关键经验在STM32CubeProgrammer中生成OTA包时“Binary file”路径必须指向编译输出的*.bin文件非*.hex且“Start address”必须与链接脚本中FLASH_REGION的起始地址完全一致如STM32F407的0x08000000。若填入0x08004000工具会自动在bin前填充0xFF导致升级后程序跳转到错误地址。3. 全方案实操指南覆盖从实验室到产线的7种下载场景3.1 场景一ST-Link V2手动烧录Windows环境——解决驱动异常与权限冲突ST-Link V2是最常用的调试器但Windows驱动问题频发。“stlinkv2驱动程序下载”搜索结果中90%是无效链接。正确做法是从ST官网下载STM32 ST-LINK Utility非ST-Link Driver独立包安装时勾选“Install ST-LINK driver”若设备管理器显示“ST-LINK Debug USB Device”带黄色感叹号右键→更新驱动→浏览计算机→选择C:\Program Files\STMicroelectronics\STM32 ST-LINK Utility\Drivers禁用Windows驱动签名强制管理员运行cmd执行bcdedit /set testsigning on重启后安装ST-Link Utility烧录实操步骤打开软件→点击“Target→Connect”若失败勾选“Connect under reset”重试点击“Flash loader→Program download”→选择*.bin文件在“Option bytes”页中确认“Read out protection”为Level 0若为Level 1Flash将被锁死点击“Start”后观察进度条若卡在“Verifying...”阶段说明Flash校验失败需检查bin文件是否损坏实测对比ST-Link V2.1蓝色外壳在STM32F407上最大下载速率为280KB/s而V2黑色外壳仅120KB/s。若需高速量产建议采购J-Link EDU Mini支持SWO trace下载速率450KB/s。3.2 场景二OpenOCD命令行烧录WSL2环境——绕过Windows虚拟化限制“wsl2 无法启动,因为此计算机上未启用虚拟化”是WSL2常见报错但OpenOCD可通过USB/IP方案解决Windows端启用Hyper-VPowerShell管理员运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All安装USB/IP工具从https://github.com/cezanne/usbip-win/releases下载usbipd-win.msi将ST-Link绑定到WSL2usbipd wsl attach --busid 1-2busid通过usbipd wsl list获取WSL2中安装OpenOCDsudo apt install openocdOpenOCD烧录命令详解# 启动OpenOCD服务器后台运行 openocd -f interface/stlink.cfg -f target/stm32f4x.cfg # 连接GDB并烧录 arm-none-eabi-gdb firmware.elf (gdb) target extended-remote :3333 (gdb) monitor reset halt (gdb) load (gdb) monitor reset run关键点load命令自动执行擦除编程校验比program firmware.bin verify 0x08000000更可靠。若报错“unable to match requested speed”在stlink.cfg中添加adapter speed 2000单位kHz。注意WSL2的USB设备需在Windows防火墙中放行否则OpenOCD连接超时。实测发现当WSL2内存分配4GB时OpenOCD加载大型固件512KB会触发OOM killer建议在.wslconfig中设置memory6GB。3.3 场景三J-Link JTAG四线制接法——解决JTAG链路扫描失败J-Link比ST-Link更稳定但JTAG接线错误率极高。“jlink有jtag怎么接”搜索结果常误导新手。正确接法以SEGGER J-Link EDU为例J-Link Pin目标板引脚说明1 (VTref)MCU VDD提供参考电压必须与MCU供电一致3.3V或5V3 (TCK)PA15时钟线需100Ω串联电阻5 (TMS)PA13模式选择线10kΩ上拉至VDDA7 (TDO)PA14数据输出线100Ω串联电阻9 (TDI)PA12数据输入线100Ω串联电阻13 (nTRST)NRST复位线10kΩ下拉15 (GND)GND必须共地J-Link Commander诊断流程JLink.exe J-Link connect Please specify device identifier - STM32F407VG J-Link speed 1000 J-Link showspeed J-Link scan Found JTAG chain with ID 0x4BA00477 J-Link mem32 0x08000000 1 # 读取Flash首字验证通信若scan返回“Could not determine JTAG chain information”检查VTref是否接错接VDDA而非VDD、TMS上拉电阻是否缺失。经验技巧J-Link的JTAG链路支持自动识别但需确保目标板NRST引脚悬空非接地。某次调试中客户将NRST通过10kΩ电阻接地导致J-Link无法复位芯片connect命令永远超时。3.4 场景四SWD单线调试JTAG禁用后恢复——破解“stm32禁用jtag”困局“关闭jtag”是量产前常见操作但若Bootloader未预留SWD入口将导致芯片变砖。“jtag口”被禁用后唯一救急方案是利用SWD协议的物理兼容性STM32的SWDIO引脚与JTAG的TMS共用PA13SWCLK与TCK共用PA14即使JTAG被禁用SWD仍可通过相同引脚工作前提是Bootloader中未禁用SWDSWD强制唤醒步骤短接BOOT0引脚至VDD复位芯片进入系统存储器启动模式用ST-Link连接Target→Connect→选择“System memory”烧录一个最小Bootloader仅初始化SWD并跳转到Flash断开BOOT0重新连接即可用SWD调试某次修复GD32F303砖机发现其Bootloader中RCC_APB2ENR | RCC_APB2ENR_SYSCFGEN未使能系统配置时钟导致SWD无法初始化。解决方案是用ST-Link Utility的“Option bytes”页清除RDP LevelRead Out Protection重置后重新烧录。提示STM32F0系列芯片的SWDIO需在复位后100ms内完成初始化否则进入JTAG模式。因此Bootloader中必须在SystemInit()后立即配置SYSCFG_CFGR1 | SYSCFG_CFGR1_PA13_PA14。3.5 场景五STM32CubeProgrammer图形化OTA包生成——避免OTA zip连接失败“ota zip连接”失败多因包结构不符合Bootloader预期。“ota提取器app官方下载”类工具常忽略芯片Flash映射差异。正确做法在STM32CubeIDE中生成Release版*.bin文件Project→Properties→C/C Build→Settings→Tool Settings→Post-build steps→Add commandarm-none-eabi-objcopy -O binary ${BuildArtifactFileName} ${BuildArtifactFileBaseName}.bin打开STM32CubeProgrammer→File→Load file→选择*.bin在“Binary file”页设置Start address:0x08000000必须与链接脚本一致Size: 自动识别CRC32: 勾选“Compute CRC32”点击“Generate image”→保存为*.ota文件OTA包签名验证实操Bootloader中RSA公钥需用openssl rsa -in private.key -pubout -out public.key生成签名命令openssl dgst -sha256 -sign private.key -out firmware.sig firmware.bin验证时Bootloader调用mbedtls_rsa_pkcs1_v15_verify()若返回MBEDTLS_ERR_RSA_VERIFY_FAILED说明签名密钥不匹配注意STM32CubeProgrammer生成的OTA包默认不加密若需“固件加密”需在“Security settings”页勾选“Encrypt image”并导入AES密钥。但加密后Bootloader必须集成AES解密模块否则无法启动。3.6 场景六GD32F450双Bank Flash OTA——实现零停机升级“ch582有没有一个完整的可以主从带ota功能的例程”反映双Bank需求。GD32F450支持Bank1/Bank2双Flash可实现A/B升级Bank10x08000000运行当前固件Bank20x08100000接收OTA包升级完成后修改向量表偏移SCB-VTOR 0x08100000复位跳转双Bank切换关键代码// 检查Bank2是否有效 if (memcmp((void*)0x08100000, GD32_OTA, 8) 0) { SCB-VTOR 0x08100000; // 切换向量表 __DSB(); __ISB(); NVIC_SystemReset(); }注意GD32F450的Bank2起始地址为0x08100000但需在链接脚本中定义MEMORY { FLASH1 (rx) : ORIGIN 0x08000000, LENGTH 1024K FLASH2 (rx) : ORIGIN 0x08100000, LENGTH 1024K }。实测数据GD32F450双Bank OTA升级耗时12.3秒含擦除编程校验比单Bank快47%因Bank2擦除时Bank1仍可响应CAN总线请求。3.7 场景七ESP32-Arduino OTA over HTTPS——解决腾讯连连等平台证书绑定“腾讯连连 arduino ota”需HTTPS双向认证。“ota提取器免费版下载安装”类工具无法处理证书。正确方案生成CA证书openssl req -x509 -newkey rsa:2048 -keyout ca.key -out ca.crt -days 3650为ESP32生成设备证书openssl req -new -key device.key -out device.csr签发证书openssl x509 -req -in device.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out device.crt -days 365将ca.crt、device.crt、device.key转为C数组xxd -i ca.crt ca.hArduino代码中启用HTTPS OTA#include WiFi.h #include WebServer.h #include Update.h #include HTTPClient.h HTTPClient http; http.begin(https://ota.example.com/firmware.bin, ca_cert); // ca_cert为ca.h中定义 int httpCode http.GET(); if (httpCode HTTP_CODE_OK) { Update.runAsync(true); Update.begin(http.getSize(), U_FLASH); while (http.connected()) { String chunk http.getString(); Update.write(chunk.c_str(), chunk.length()); } }关键点ESP32的HTTPS OTA必须使用Update.runAsync(true)否则WiFi连接会中断。实测发现若证书过期ESP32会返回SSL_ERROR_SSL而非HTTP错误码需在http.getStreamPtr()-available()前检查http.getStreamPtr()-getFreeHeap()是否20KB。4. 故障排查实战手册27个典型错误码的根因与速查方案4.1 JTAG/SWD通信类错误错误码根因分析速查步骤解决方案Error (209040): cant access jtag chainDP IDCODE读取失败1. 万用表测TCK对地电压应≈VDD×0.72. 示波器抓TCK波形是否为方波更换TCK上拉电阻为4.7kΩ缩短TCK走线3cmSWD/JTAG communication failureSWDIO电平不匹配1. 测SWDIO空载电压应≈VDD2. 接负载后电压是否跌至0.8VSWDIO上拉电阻改用2.2kΩ检查目标板VDD是否稳定cant perform jtag flash, because openocd server is not running!WSL2 USB透传失败1. Windows端usbipd wsl list是否显示设备2. WSL2中lsusb是否列出ST-Link重装usbipd-win在Windows防火墙放行usbipd服务4.2 Flash操作类错误错误码根因分析速查步骤解决方案error: flash download failed - target dll has been cancelledFlash编程缓冲区溢出1. 查OpenOCD log中“work-area-size”值2. 对比固件bin大小在target cfg中增大WORKAREASIZE至0x40000Flash ID查询颗粒失败Flash芯片未供电或片选失效1. 测Flash VCC是否为3.3V2. 逻辑分析仪抓CS信号检查Flash供电路径更换CS上拉电阻为10kΩSTM32F407擦除后校验失败Flash页未按手册要求对齐1. 用xxd -l 32 firmware.bin查看首32字节2. 检查链接脚本中.text段起始地址修改链接脚本SECTIONS { .text : { *(.text) } FLASH AT FLASH }4.3 OTA升级类错误错误码根因分析速查步骤解决方案OTA zip连接失败OTA包Header Magic Number错误1. 用hexdump -C firmware.ota | head -n 52. 检查前4字节是否为0x55AA55AA重生成OTA包确保STM32CubeProgrammer中“Magic number”字段正确OTA升级后设备不启动向量表偏移地址错误1. 用ST-Link Utility读取0x08000000处数据2. 检查前4字节是否为SP初始值Bootloader中SCB-VTOR 0x08000000 offsetoffset必须为256字节倍数差分OTA失败基础固件版本号不匹配1. 用OTA提取器读取当前固件版本2. 对比OTA包中version字段在Bootloader中增加版本号校验if (current_ver ! ota_ver-1) return ERROR实操心得处理“nand flash工作原理”相关问题时必须区分SLC/MLC类型。SLC NAND如K9F1G08U0B每页2KB坏块管理简单MLC NAND如MT29F2G08ABAEA每页4KB需在Bootloader中实现ECC校验BCH8算法。某次调试MT29F2G08ABAEA因ECC未使能导致Flash读取数据错乱表现为OTA升级后WiFi MAC地址乱码。5. 生产级避坑指南从实验室到产线的12个血泪教训5.1 硬件设计阶段必须规避的3个致命陷阱陷阱一JTAG/SWD引脚复用为ADC输入某医疗设备PCB将PA13SWDIO设计为ADC1_IN13虽标注“调试时断开ADC”但量产测试中忘记断开导致JTAG无法连接。解决方案在原理图中为JTAG引脚添加0Ω电阻跳线调试时焊接量产时移除。陷阱二Flash供电未加LC滤波GD32F450 Flash在编程时电流突增达200mA若VDD仅靠10μF电容滤波电压跌落至2.8V触发Flash写入失败。实测需在Flash VCC端并联100μF钽电容100nF陶瓷电容。陷阱三BOOT引脚未加下拉电阻STM32F103的BOOT0引脚悬空时受PCB静电影响随机进入系统存储器模式导致产线烧录失败率37%。必须添加10kΩ下拉电阻至GND。5.2 固件开发阶段必须验证的4个关键节点节点一Bootloader中Flash擦除超时处理标准HAL库HAL_FLASHEx_Erase()无超时机制若Flash控制器故障将无限等待。必须重写uint32_t timeout HAL_GetTick() 1000; // 1s超时 while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) HAL_GetTick() timeout); if (HAL_GetTick() timeout) return HAL_TIMEOUT;节点二OTA包CRC32校验必须覆盖Header某项目OTA包仅校验Payload攻击者篡改Header中的版本号导致降级攻击。正确做法crc32(buf, sizeof(header)payload_len)。节点三多任务环境下Flash操作互斥FreeRTOS中若Task A正在擦除FlashTask B调用HAL_FLASH_Program()将导致HardFault。必须用osMutexWait(flash_mutex, portMAX_DELAY)保护。节点四低功耗模式下SWD唤醒失效STM32L4系列进入Stop模式后SWD时钟被关闭。需在进入Stop前调用__HAL_RCC_DBGMCU_CLK_ENABLE()保持调试时钟。5.3 量产测试阶段必须执行的5项黄金验证验证一JTAG/SWD接口压力测试连续1000次连接/断开操作记录失败次数。合格标准失败率0.1%。某次测试发现ST-Link V2.1在第832次操作后TCK信号失真更换为J-Link EDU Mini后达标。验证二Flash全地址写入校验编写测试固件对Flash每页写入递增数据0x00000000, 0x00000001...读回校验。发现某批次GD32F
返回列表