TRACE32 / Lauterbach 调试下载问题修改说明
日期:2026-07-13
工程目录:
C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\Spi_Master_Demo_YTM32B1HA0
1. 问题现象
在 YTM32B1HA0 的 MCAL SPI demo 工程中,使用 Lauterbach TRACE32 下载/调试时出现异常,而使用 Ozone 调试可以正常运行。
过程中出现过的典型现象包括:
FLASH programming error around address ST:0x200FC10--0x200FC1F
target reset detected
DAP: DebugPortFail: CTRLSTAT=0x00000000
running (core power down)
其中 ST:0x200FC10 实际应理解为 0x0200FC10,该地址位于 PFlash0 的 .TEXT 段中,对应函数:
Spi_Lld_ReadRXBuffer()
Mcal/Spi/src/Spi_Lld.c:1425
因此该问题不是普通 RAM 地址访问问题,而是 Flash 下载/运行后调试口连接稳定性问题。
2. 原因分析
本次问题主要分为两个阶段。
2.1 下载阶段问题
HA0 PFlash 的 program page 为 32 Byte。原 linker 配置中,部分 load segment 的起始地址或长度没有完全按照 32 Byte 对齐,可能导致 TRACE32 target flash algorithm 在烧写 ELF 时遇到非整页烧写场景,从而在 .TEXT 区域附近报 flash programming error。
2.2 运行后 DAP 掉线问题
Ozone 工程使用的是 SWD:
Project.SetTargetIF ("SWD")
原 TRACE32 脚本使用的是 JTAG:
SYStem.CONFIG DEBUGPORTTYPE JTAG
MCAL 程序运行后会执行:
Port_Init(&Port_Config);
该配置可能会重新配置部分非 SWD 的 JTAG 复用引脚,导致 TRACE32 使用 JTAG 时,在点击 Go 后调试口失联,出现:
DAP: DebugPortFail: CTRLSTAT=0x00000000
running (core power down)
将 TRACE32 调试接口切换为 SWD 后,与 Ozone 保持一致,问题消失。
3. 修改文件清单
本次主要修改以下文件:
board\yt_linker.ld
cmake\targets\GENERATED_SDK_TARGET.cmake
..\ytm32b1ha0-debug.cmm
其中 ytm32b1ha0-debug.cmm 位于 testScript 目录:
C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\ytm32b1ha0-debug.cmm
4. 具体修改内容
4.1 修改 board\yt_linker.ld
新增 Flash page 对齐宏:
FLASH_PAGE_SIZE = 32;
对 Flash 中的 loadable section 结尾进行 32 Byte 对齐:
.BVT
.IVT
.NC_TEXT
.TEXT
.ARM
对带 ROM copy image 的 RAM section 进行 32 Byte 对齐:
.CODE_RAM
.D_DATA
.NC_DATA
.DATA_RAM
重点修改包括:
CODE_RAM_rom_start = ((CODE_RAM_rom_start_not_align + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;
D_DATA_rom_start = ((D_DATA_rom_start_not_align + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;
NC_DATA_rom_start = ((NC_DATA_rom_start_not_align + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;
DATA_RAM_rom_start = ((DATA_RAM_rom_start_not_align + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;
并对 section 本身增加对齐:
.CODE_RAM ALIGN(FLASH_PAGE_SIZE) : AT(CODE_RAM_rom_start)
.D_DATA ALIGN(FLASH_PAGE_SIZE) : AT(D_DATA_rom_start)
.NC_DATA ALIGN(FLASH_PAGE_SIZE) : AT(NC_DATA_rom_start)
.DATA_RAM ALIGN(FLASH_PAGE_SIZE) : AT(DATA_RAM_rom_start)
修改目的:
保证 ELF 中 Flash load segment 的起始地址按 32 Byte 对齐;
保证 Flash load segment 的 FileSiz 按 32 Byte 对齐;
避免 TRACE32 flash algorithm 处理非整页烧写时失败。
修改后确认的 ELF Program Header 关键段如下:
LOAD 0x02000000 size 0x000a0
LOAD 0x02000800 size 0x003e0
LOAD 0x0200c000 size 0x05d20
LOAD 0x02011d20 size 0x00020
LOAD 0x02011d40 size 0x003c0
这些段的起始地址和长度均满足 32 Byte 对齐。
4.2 修改 ytm32b1ha0-debug.cmm
4.2.1 降低调试口时钟
由原先较高 JTAG 时钟调整为:
SYStem.JtagClock CTCK 2MHz
说明:TRACE32 命令名仍为 JtagClock,但这里用于配置调试口访问速度。降低速度可以提高 reset / flash / run 阶段 DAP 访问稳定性。
4.2.2 调试接口由 JTAG 改为 SWD
原配置:
SYStem.CONFIG DEBUGPORTTYPE JTAG
修改为:
SYStem.CONFIG DEBUGPORTTYPE SWD
修改目的:
与 Ozone 工程保持一致;
避免 MCAL Port_Init() 运行后复用 JTAG 相关引脚导致 TRACE32 失联;
解决点击 Go 后出现 DAP: DebugPortFail: CTRLSTAT=0x00000000 的问题。
4.2.3 增加看门狗处理
脚本中增加 WDG 解锁和配置操作:
&WDG_SVCR = 0x401A8000
&WDG_CR = 0x401A8004
&WDG_TOVR = 0x401A800C
并执行相关 Data.Set 操作。
修改目的:
避免 TRACE32 flash algorithm 运行过程中目标芯片被看门狗复位;
减少下载过程中出现 target reset detected 的概率。
4.2.4 Flash algorithm 装载地址恢复为原厂推荐区域
当前配置:
FLASH.TARGET 0x20020000 0x20021000 0x1000 ~~~~\..\flashAlgorithm\ytm32b1ha0.bin
修改目的:
使用 OCRAM 区域执行 flash algorithm;
避免与 DTCM / stack / application RAM 区域冲突。
4.2.5 下载文件改为当前 build ELF
当前配置:
FLASH.Program.ALL
Data.LOAD.Elf ~~~~\Spi_Master_Demo_YTM32B1HA0\build\Spi_Master_Demo_YTM32B1HA0.elf
FLASH.Program.off
修改目的:
使用修正后的 linker 生成的 ELF;
让 TRACE32 按 ELF Program Header 进行 Flash 下载;
避免旧 HEX 文件或非当前 build 产物影响验证结果。
4.3.6 烧录后重新加载符号并设置入口
新增:
Data.LOAD.Elf ~~~~\Spi_Master_Demo_YTM32B1HA0\build\Spi_Master_Demo_YTM32B1HA0.elf /NoCODE
Register.Set MSP STACK_end
Register.Set PSP STACK_end
Register.Set PC Reset_Handler
修改目的:
烧录结束后只加载符号,不重复写 Flash;
将 MSP / PSP 设置到应用栈顶;
将 PC 设置到 Reset_Handler;
保证点击 Go 后程序从应用启动入口运行,而不是从 TRACE32 flash algorithm 的上下文继续执行。
4.3.7 关闭非必要窗口操作
注释:
;per.view ~~~~\..\ytm32b1ha0.per
;Data.List
修改目的:
减少脚本执行后的额外外设访问;
避免在目标状态不稳定时触发不必要的 DAP 访问。
5. 验证结果
修改后重新编译工程成功。
Build size:
text 24992
data 992
bss 6224
dec 32208
hex 7dd0
ELF load segment 已确认 32 Byte 对齐。
使用修改后的 TRACE32 脚本:
C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\ytm32b1ha0-debug.cmm
执行下载后点击 Go,程序可以正常运行,未再出现 DAP 失联问题。
6. 推荐使用方式
建议使用以下流程:
重新编译工程;
板子断电重上电;
在 TRACE32 中执行:
DO C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\ytm32b1ha0-debug.cmm
脚本执行完成后点击 Go。
7. 注意事项
当前验证使用的是 ytm32b1ha0-debug.cmm。
ytm32b1ha0-trace.cmm 如果后续也要使用,需要同步修改为 SWD,并同步 ELF 下载方式及 FLASH.TARGET 配置。
如果后续重新通过配置工具生成工程,GENERATED_SDK_TARGET.cmake 或 yt_linker.ld 可能被覆盖,需要重新确认本说明中的修改是否仍然保留。
主要集中在 linker 对齐、编译配置和 TRACE32 调试下载脚本。
82ad020a-e80a-4c52-b238-d90db2a8be21-HA Trace32 test okt.zip