尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

车载MCU四层测试体系与七种实战技术解析

车载MCU四层测试体系与七种实战技术解析 1. 项目概述为什么车载MCU测试不是“刷个固件”那么简单“车载MCU测试解析”——这六个字背后藏着整车电子电气架构里最硬核、也最容易被低估的一环。我干汽车电子测试十年从早期CAN总线ECU黑盒验证到如今AUTOSAR架构下多核MCU的全栈测试踩过的坑比走过的高速还多。很多人一听到“MCU测试”第一反应是“不就是用J-Link烧个程序、串口看下log”——这种理解放在十年前或许勉强够用但今天一辆量产车里动辄集成十几颗MCUBCM、VCU、BMS、TBOX、座舱域控、ADAS域控、网关、空调控制器……每颗MCU又运行着RTOS或AUTOSAR OS承载着ASIL-B甚至ASIL-D级别的功能安全要求测试早已不是“能跑就行”而是“必须证明它在任何极端条件下都不出错”。你搜到的那些热词——“failed to create module configuration mcu.”、“!! mcu mcu shutdown: timer too close”、“mcu control dc-dc output voltage using feedback pin dac pwm i2c digital potentiometer”——它们不是报错日志里的噪音而是真实产线和实车调试中高频出现的“死亡提示”。前者往往指向配置管理混乱或启动时序冲突后者直指硬件抽象层与电源管理模块的耦合缺陷而那个“timer too close”的警告十有八九是看门狗喂狗逻辑在高负载中断下失守的前兆。这些都不是靠改一行代码就能解决的它们暴露的是测试策略的断层功能测试覆盖了但时序边界没压单元测试通过了但MCU资源争抢没测静态分析扫过了但ADC采样抖动引发的控制偏差却漏掉了。这个项目面向的是三类人一是刚入行的汽车电子测试工程师需要建立对MCU级测试的系统性认知避开“只会点按钮”的陷阱二是嵌入式开发人员尤其负责底层驱动和BSP的同事需要理解测试如何反向验证你的设计鲁棒性三是项目负责人或质量工程师需要知道如何为MCU测试设定可量化的验收门槛而不是把“测试通过”当成一句模糊的口头承诺。它不教你怎么用Python写自动化脚本那是pytest框架的事也不讲Linux命令怎么查USB设备那是车载系统运维的事它只聚焦一件事当一颗MCU芯片被焊上PCB、通电、加载Bootloader那一刻起你该用什么方法、什么工具、什么标准去确认它真正具备了支撑整车功能安全与可靠运行的底层能力。下面所有内容都围绕这个核心展开。2. 测试体系设计从芯片手册到整车功能的四层穿透式验证车载MCU测试绝非单点动作而是一个自底向上、层层穿透的验证体系。我把它拆成四个不可跳过的层级每一层都对应不同的测试目标、工具链和失败代价。跳过任何一层都可能让问题流到下一阶段代价呈指数级放大——在实验室发现一个MCU时钟抖动问题成本可能是几百元在整车厂试装线上发现成本是停线一天如果流到用户手里那就是召回。2.1 第一层硅片级验证Silicon-Level Validation这是最底层也是最容易被忽略的一层。很多团队直接从“烧录固件”开始但MCU芯片本身是否工作在标称规格内它的内部振荡器精度、ADC参考电压温漂、Flash擦写寿命、SRAM保持电压阈值这些参数出厂时就存在批次差异。我们曾遇到某批次STM32H7芯片在-40℃环境下ADC采样值整体偏移12LSB而供应商数据手册标称温漂是±5LSB——这个偏差在常温下完全测不出但足以让BMS的单体电压采集失效。实操要点必须使用原厂推荐的校准流程比如NXP S32K系列需运行S32DS自带的Calibration Tool在-40℃、25℃、105℃三个温度点分别执行ADC、DAC、内部RC振荡器校准并将校准系数写入指定OTP区域。不能图省事只在校准一次。Flash耐久性抽样测试按AEC-Q100 Grade 1要求对每批次芯片抽取5颗执行10万次擦写循环不是模拟是真实擦写每次擦写后读回校验记录错误扇区位置。我们用的是Segger J-Flash Pro配合自定义脚本关键参数是Erase Cycle Time必须≥10ms否则会加速氧化层退化。电源纹波敏感度测试用可编程电源如Keysight N6705C叠加100mVpp1MHz正弦纹波观察MCU是否复位或进入低功耗异常状态。重点监测VDDA模拟供电和VDDIOIO供电两路因为很多ADC失效源于VDDA纹波超标而非主电源。提示这一层测试通常由芯片原厂或Tier1一级供应商完成但OEM必须索要完整的《Silicon Validation Report》并抽查报告中的原始数据。我们曾发现某报告里ADC温漂测试只做了两个温度点被我们当场要求补测第三点。2.2 第二层固件级验证Firmware-Level Validation这是MCU测试的主战场覆盖Bootloader、BSP、RTOS、AUTOSAR基础软件BSW和应用层SWC的集成验证。核心矛盾在于功能正确 ≠ 时序安全 ≠ 资源充足 ≠ 故障可恢复。一个能完美控制电机转速的MCU可能在同时处理CAN报文SPI传感器数据PWM输出时因中断嵌套深度超限而丢帧。关键测试项与原理启动时序验证Boot Timing测量从VDD稳定到main()函数第一行代码执行的时间。AUTOSAR规范要求≤100ms但实际中我们要求≤50ms留出50ms给后续诊断初始化。工具用示波器抓RESET引脚和GPIO_DEBUG在main()开头置高之间的延迟。难点在于MCU内部复位电路的不确定性必须在不同温度、电压下重复10次取最大值。内存占用与碎片分析用arm-none-eabi-size生成.map文件后用Python脚本解析Heap和Stack使用峰值。特别注意StackAUTOSAR规定每个Task Stack ≥ 512Byte但我们实测发现当启用CAN FD且报文过滤表满载时CanIf_MainFunction_Read的栈峰值会飙升至1.2KB。解决方案不是盲目加栈而是重构过滤逻辑把查表操作移到后台Task。中断响应时间Interrupt Latency这是安全攸关功能的生命线。例如ADAS摄像头帧同步信号触发的DMA中断从信号上升沿到DMA传输启动必须≤2μs。我们用逻辑分析仪Saleae Logic Pro 16同时抓外部中断引脚和DMA请求信号计算差值。测试时必须关闭所有非必要中断只保留该中断优先级最高。2.3 第三层通信协议栈验证Protocol Stack Validation车载MCU几乎从不孤立工作它必须通过CAN、LIN、FlexRay、Ethernet或UART与其它ECU对话。协议栈测试不是“发一帧收一帧”而是验证其在真实网络压力下的健壮性。典型场景与实测数据CAN总线错误帧注入测试用Vector CANoe CANstress模块以1%概率随机注入Bit Error、Stuff Error、CRC Error。观察MCU的CAN控制器是否在连续128次错误后自动进入Bus Off状态并在128ms后自动恢复符合ISO 11898-1。我们曾发现某MCU在Stuff Error注入下错误计数器溢出导致永久Bus Off根源是驱动里没清零ECR寄存器。Ethernet TCP连接风暴测试针对TBOX MCU用iperf3发起100个并发TCP连接每个连接持续发送1MB数据。监控MCU的TCP Retransmit Rate和Socket Buffer Overflow Count。合格标准重传率0.1%缓冲区溢出0。失败案例中80%源于lwIP的tcp_accept队列长度设置过小默认5需调至20。LIN从机响应一致性测试用ETAS LSI Master发送0x3C诊断帧要求MCU在20ms内返回0x7C响应。我们用示波器抓LIN总线波形测量从帧头结束到响应帧头开始的时间差。发现某批次MCU因LIN Clock Divider配置错误导致响应延迟达28ms超出LIN 2.2A规范。2.4 第四层整车功能闭环验证Vehicle Function Loop Validation这是终极考验把MCU放回真实整车环境验证它如何支撑最终用户功能。此时测试不再关注MCU本身而是关注它参与的功能链是否可靠。实战案例空调自动模式失效复现用户抱怨“夏天自动模式吹冷风冬天却吹热风”。排查发现MCU的NTC温度传感器采样值在高温高湿环境下漂移但BSP层未启用ADC Oversampling过采样功能。测试方法在环境舱中模拟60℃/95%RH用红外热像仪监测蒸发器表面温度同步记录MCU上报的蒸发器温度值对比偏差。解决方案在BSP初始化中强制开启ADC_Oversampling_Ratio_16x并将采样结果做滑动平均滤波。无钥匙进入响应延迟用户拉门把手后车门解锁平均延迟1.2秒标准要求≤0.8秒。根本原因是MCU的LF接收器在处理多个低频唤醒信号时中断服务程序ISR中执行了过多浮点运算用于信号强度计算挤占了RF接收中断的CPU时间。测试手段用J-Link RTT实时打印各中断进入/退出时间戳绘制时间线图谱。优化方案将浮点运算移到主循环ISR只做信号捕获和标记。这四层不是线性流程而是网状迭代。第二层测试发现的问题可能倒逼第一层重新选型第四层暴露的缺陷常需回到第二层修改BSP。真正的MCU测试工程师必须能在这四层间自由切换视角。3. 核心测试技术详解从静态分析到动态注入的七种武器光有分层框架不够还得有趁手的“武器”。我总结出七种在实战中反复验证有效的MCU测试技术每一种都对应特定的缺陷类型且都有明确的工具链和判断标准。它们不是理论而是我亲手在产线调试台上敲出来的。3.1 静态代码分析Static Code Analysis在编译前揪出90%的潜在缺陷很多人以为静态分析就是跑个PC-lint打几份报告就完事。错了。真正的价值在于定制规则集和与CI流水线深度集成。我们基于MISRA C:2012和AUTOSAR C14构建了包含217条自定义规则的检查集其中32条是专为MCU场景设计的。关键自定义规则与实测效果Rule_MCU_042禁止在中断服务程序ISR中调用malloc/free。触发此规则的代码在FreeRTOS环境下会导致堆内存碎片化最终在长时间运行后触发pvPortMalloc返回NULL。我们曾用此规则在量产前发现3处违规避免了售后批量故障。Rule_MCU_108要求所有volatile变量的访问必须用__atomic_load_n或__atomic_store_n封装。原因ARM Cortex-M7的乱序执行可能导致volatile读写被重排引发状态机逻辑错误。此规则帮我们捕获了某BMS SOC估算算法中cell_voltage_array更新顺序错误的问题。Rule_MCU_189强制#define宏定义必须带括号包裹且禁止在宏内使用或--操作符。这是为防止MAX(a, b)这类宏展开后产生未定义行为。在MCU资源紧张时工程师常滥用宏优化此规则拦截了大量隐蔽bug。工具链实操使用Cppcheck 2.11作为基础引擎通过--rule-filemcu_rules.xml加载自定义规则。将检查集成到GitLab CI配置before_script阶段自动执行cppcheck --enableall --inconclusive --suppressmissingInclude --file-filter*.c --xml --xml-version2 ./src/ 2 cppcheck_report.xml关键技巧--inconclusive参数必须开启否则会漏掉possible null pointer dereference等高危警告--suppressmissingInclude用于屏蔽第三方库头文件缺失告警避免干扰主线。注意静态分析不是“越严越好”。我们曾将规则设为--enablewarning,style,performance结果每天产生2000告警团队放弃维护。后来精简为--enableerror,warning,information并只对src/core/目录启用全部规则对src/drivers/目录仅启用安全相关规则效率提升5倍。3.2 内存泄漏与越界检测Memory Sanitization用AddressSanitizer直击MCU软肋MCU内存极其珍贵malloc滥用或数组越界是常见死因。传统printf打点法效率低、干扰大。我们采用AddressSanitizerASan的裁剪版在QEMU仿真环境中运行MCU固件实现零侵入检测。移植与配置要点ASan需修改MCU的链接脚本.ld文件预留Shadow Memory区域。以STM32F4为例需在RAM末尾划出128KB作为Shadow区1:8映射并在startup_stm32f4xx.s中修改_estack地址。编译时添加标志-fsanitizeaddress -mcpucortex-m4 -mfloat-abihard -mfpufpv4。注意-fsanitizeaddress会显著增大代码体积35%因此仅用于测试固件不用于量产。关键参数ASAN_OPTIONSabort_on_error1:detect_stack_use_after_return1确保越界立即中止便于定位。实测案例某TBOX固件在处理OTA升级包时memcpy目标缓冲区大小计算错误导致struct ota_header越界写入相邻的ota_state变量。ASan在QEMU中精准报出ERROR: AddressSanitizer: heap-buffer-overflow on address 0x20001a2c at pc 0x0800456c bp 0x20001a10 sp 0x20001a08并显示越界偏移量16 bytes。修复后实车OTA成功率从92%提升至99.98%。3.3 时序压力测试Timing Stress Test用Timer Drift模拟真实世界MCU的时钟源内部RC、外部晶振、PLL在温度、电压变化下会产生漂移这是很多偶发故障的根源。我们不依赖数据手册的“典型值”而是用实测漂移数据驱动测试。测试方法用高精度频率计如Keysight 53230A测量MCUSYSCLK输出引脚在-40℃、25℃、105℃下各测1小时记录频率偏差ppm。将实测数据导入MATLAB拟合出Frequency f(Temperature, VDD)公式。例如某MCUFreq 120MHz * (1 0.00002*(T-25) - 0.000005*(VDD-3.3))。在测试脚本中根据当前环境温度和供电电压动态调整HAL_Delay的补偿系数。例如若实测SysTick每100ms慢0.8ms则在测试循环中插入usleep(800)进行补偿。实战价值某BCM的雨刮间歇模式在高温环境下周期变短用户感觉雨刮太快。根源是SysTick中断因晶振温漂而变快。通过时序压力测试我们量化出温漂曲线并在BSP层加入温度补偿算法使间歇周期误差从±15%降至±1.2%。3.4 电源噪声注入测试Power Supply Noise Injection用可控干扰暴露设计弱点MCU对电源噪声极其敏感尤其是ADC、PLL和Flash编程电路。我们不用示波器被动观察而是主动注入可控噪声验证抗扰度。注入方案工具Picotest J2100A噪声注入器配合10:1高压探头。注入点VDDA模拟电源、VDDIOIO电源、VREF参考电压三路分别注入100mVpp100kHz、500mVpp1MHz、1Vpp10MHz三种噪声。判定标准MCU不得复位、不得进入HardFault、ADC采样值偏差≤FSR的0.5%、CAN通信误码率≤1e-6。避坑经验注入时必须断开所有外部负载如LED、继电器否则噪声会通过负载回路耦合导致误判。VREF注入最危险某次测试中1Vpp10MHz噪声导致ADC基准崩溃MCU直接锁死。解决方案是在VREF引脚增加100nF陶瓷电容10Ω磁珠实测后抗扰度提升3倍。3.5 故障注入测试Fault Injection Test用JTAG强制制造“不可能发生”的错误安全关键MCU必须证明即使硬件出错也能安全降级。我们用JTAG接口直接修改寄存器模拟真实故障。典型注入场景Flash ECC错误注入通过J-Link Commander执行mem32 0x08000000 1读取Flash首地址然后用mem32 0x08000000 0xFFFFFFFF写入错误数据触发ECC纠错机制。验证MCU是否记录FLASH_ECC_ERROR事件并进入安全状态。RAM奇偶校验错误注入修改SCB-SHCSR寄存器强制触发MEMFAULT。观察MCU是否执行MemManage_Handler并正确清除SCB-CFSR中的MMFAR和BFAR标志。时钟故障注入禁用RCC-CR中的HSION位模拟外部晶振失效。验证MCU是否自动切换到内部RC振荡器并保持基本功能如CAN通信。工具脚本# jlink_fault_inject.jlink si swd speed 4000 connect loadbin fault_trigger.bin, 0x20000000 r gfault_trigger.bin是预编译的汇编代码执行BKPT #0后挂起等待手动注入。3.6 自动化回归测试Automated Regression Test用PythonPyOCD构建无人值守测试台手工测试MCU是灾难。我们搭建了基于PyOCD的自动化测试台支持7×24小时无人值守运行。架构与脚本核心硬件PyOCD调试器 Raspberry Pi 4作为测试主机 Relay Board控制MCU上下电。软件Python脚本调用pyocd flash烧录固件pyocd gdbserver启动GDB服务pexpect控制GDB会话执行测试命令。关键函数run_test_case()def run_test_case(test_name, hex_file, gdb_script): # 1. 上电 relay_control(on) time.sleep(2) # 2. 烧录 subprocess.run([pyocd, flash, -t, stm32f407vg, hex_file]) # 3. 启动GDB会话 gdb_proc subprocess.Popen([arm-none-eabi-gdb, --batch, -x, gdb_script, firmware.elf]) # 4. 监控串口输出 serial_log serial_read_until(TEST_PASS, timeout30) return TEST_PASS in serial_log实测效果单次完整回归测试含127个用例耗时23分钟人力成本从4人天降至0.5人天。发现某次OTA升级后I2C总线在第87次循环测试时出现BUSY标志卡死手工测试从未复现。根源是HAL_I2C_Master_Transmit中未清除I2C_ISR_BUSY标志仅在特定时序下触发。3.7 实车数据回溯分析In-Vehicle Data Trace用CANoeTrace Analyzer解剖“幽灵故障”很多故障只在实车环境中偶发实验室无法复现。我们用CANoe录制整车CAN/LIN/Ethernet总线数据结合MCU内部ITMInstrumentation Trace Macrocell日志进行时空对齐分析。实施步骤在MCU固件中启用ITMCoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; ITM-LAR 0xC5ACCE55; ITM-TCR | ITM_TCR_ITMENA_Msk;用ST-Link的SWO引脚输出ITM数据接入CANoe的Trace模块。录制实车行驶数据含GPS、IMU、CAN报文、ITM日志导出为.asc格式。在Trace Analyzer中设置时间轴对齐以CAN ID 0x123车速报文为基准将ITM日志中的Task Switch Event与之同步。经典案例用户投诉“高速行驶时ACC突然退出”。回溯发现当车速120km/h且CAN ID 0x456雷达目标列表报文丢失时MCU的RadarTask因超时未收到数据而触发安全状态。但实验室用CANoe模拟报文丢失却无法复现。最终发现实车中报文丢失伴随CAN Bus Off事件而实验室模拟未注入Bus Off。解决方案在RadarTask中增加Bus Off状态监听提前降级。这七种技术没有一种是银弹。它们必须组合使用用静态分析筛出高危代码用ASan验证内存安全用时序压力测试暴露温漂缺陷再用实车数据回溯定位偶发问题。这才是MCU测试的完整闭环。4. 实操全流程从环境搭建到问题闭环的12个关键步骤纸上得来终觉浅。下面我把一次典型的车载MCU测试全流程拆解为12个不可跳过的实操步骤。每个步骤我都标注了耗时、必备工具、常见陷阱和我的个人心得。这不是理想化的流程图而是我在吉利、比亚迪、蔚来产线调试台前用汗水换来的清单。4.1 步骤1硬件环境准备耗时2小时必备工具MCU最小系统板带JTAG/SWD、UART、CAN、USB接口可编程直流电源Keysight E36313A精度0.1%四通道示波器Rigol DS4054带协议解码逻辑分析仪Saleae Logic Pro 16温箱-40℃~125℃精度±0.5℃关键动作与陷阱电源接线必须用双绞线MCU的VDD和GND引脚必须用0.5mm²双绞线连接电源否则开关噪声会耦合进ADC。我曾因用普通杜邦线导致ADC采样值在12位精度下抖动达±8LSB。示波器探头接地夹必须就近接MCU的GND引脚而非电源地。否则地环路引入噪声Reset信号毛刺会被误判为干扰。温箱内必须放置PT100温度传感器实时监测MCU芯片表面温度而非依赖温箱设定值。实测发现温箱设定105℃时MCU表面温度仅98℃因散热差异。我的心得这一步花2小时看似长但能避免后续90%的“玄学问题”。我见过太多团队跳过这步直接烧录结果在-40℃测试时MCU不启动折腾三天才发现是电源线太细导致压降过大。4.2 步骤2固件编译与符号表提取耗时15分钟工具链编译器arm-none-eabi-gcc 10.3.1构建系统CMake 3.22Ninja符号提取arm-none-eabi-nm -C -n firmware.elf symbols.txt关键参数与原因CMAKE_BUILD_TYPERelWithDebInfo既保留调试信息.debug_*段又开启优化-O2平衡测试真实性与调试便利性。arm-none-eabi-nm必须加-Cdemangle C符号和-n按地址排序否则symbols.txt无法用于后续地址映射。重点检查_stack_start、_stack_end、_heap_start、_heap_end四个符号它们是内存分析的基石。避坑提示不要用objdump -t它输出格式不规整难于脚本解析。符号文件必须保存每次固件变更都要重新生成。我们用Git管理symbols/目录与固件版本一一对应。4.3 步骤3JTAG连接与基础通信验证耗时10分钟工具J-Link Commanderv7.86验证命令序列J-Link connect Please specify device name - STM32F407VG Specify target interface - SWD Specify target interface speed - 4000 kHz J-Link speed 4000 J-Link mem32 0x08000000 1 # 读取Flash首地址应返回0x20000000栈顶地址 J-Link halt J-Link regs # 查看寄存器确认PC在0x08000000附近失败排查若connect失败先检查SWDIO和SWCLK引脚是否接反常见错误。若mem32返回全0可能是Flash被写保护执行J-Link unlock STM32F4。若halt后PC不在启动地址说明Bootloader已运行需复位后立即halt。4.4 步骤4Bootloader启动时序测量耗时30分钟工具示波器通道1接RESET通道2接GPIO_DEBUG操作流程在startup_stm32f4xx.s中Reset_Handler函数第一行添加mov r0, #1 str r0, [r1, #0] 假设r1指向GPIO_DEBUG寄存器编译烧录示波器设置触发条件为Channel 1下降沿RESET释放。测量Channel 1下降沿到Channel 2上升沿的时间差即启动时序。数据记录温度电压启动时序ms是否达标-40℃3.0V48.2是25℃3.3V32.1是105℃3.6V58.7否超50ms根因分析105℃时Flash读取速度下降需在SystemInit()中增加FLASH_ACR_LATENCY_3WS3个等待周期。4.5 步骤5内存占用与栈溢出测试耗时45分钟工具PyOCDPython脚本脚本核心逻辑def test_stack_overflow(): # 1. 设置Watchpoint监控栈顶地址 pyocd_cmd(wp 0x20001000 4 w) # 监控栈顶向下4字节 # 2. 运行固件 pyocd_cmd(continue) # 3. 检查是否触发Watchpoint status pyocd_cmd(status) if Watchpoint in status: print(STACK OVERFLOW DETECTED!) return False return True关键技巧Watchpoint地址必须是栈顶地址减去sizeof(stack_guard)我们设为4字节。测试必须在所有Task都启动后进行否则Idle Task的栈不会被压满。4.6 步骤6CAN总线错误帧注入测试耗时1小时工具Vector CANoeCANstress模块测试用例设计Case 1Bit Error注入率1%持续10分钟Case 2CRC Error注入率0.1%持续30分钟Case 3Stuff Error注入率0.5%持续20分钟判定脚本def check_can_bus_off(): # 读取MCU的CAN_ESR寄存器 esr_value pyocd_read_mem32(0x4000600C) # STM32F4 CAN1 ESR地址 return (esr_value 0x00000080) ! 0 # BUSOFF位实测数据某MCU在Case 2中第18分钟触发Bus Off但128ms后未自动恢复。根源是HAL_CAN_Start()后未调用HAL_CAN_ActivateNotification(hcan, CAN_IT_ERROR)。4.7 步骤7ADC温漂校准验证耗时2小时工具Fluke 754过程校验仪输出精密电压温箱校准流程温箱设-40℃用Fluke输出0.000V、1.000V、2.000V、3.000V记录ADC读数。计算实际增益和偏移Actual_Value (Raw_Value - Offset) / Gain与校准系数比对偏差0.1%即不合格。我的经验校准必须在温箱温度稳定30分钟后进行否则热传导导致MCU内部温度滞后。4.8 步骤8电源噪声抗扰度测试耗时1.5小时工具Picotest J2100A示波器注入参数VDDA100mVpp 100kHz持续1分钟VDDIO500mVpp 1MHz持续1分钟VREF1Vpp 10MHz持续30秒监控指标RESET引脚电平是否复位CAN_TX波形是否畸变UART输出是否乱码ADC采样值是否超差失败案例VREF注入时ADC值跳变。解决方案在VREF引脚增加100nF电容并将电容地就近接到MCU的VSSA模拟地。4.9 步骤9故障注入与安全状态验证耗时1小时工具J-Link CommanderPython脚本注入脚本# inject_flash_ecc.jlink si swd speed 4000 connect mem32 0x08000000 1 # 读取原始值 mem32 0x08000000 0xDEADBEEF # 写入错误数据 reset halt mem32 0x08000000 1 # 检查是否被ECC纠正验证点Flash是否自动纠错读回应为原始值FLASH_SR寄存器EOP和
返回列表