<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[关于云途MCAL支持劳德巴赫调试修改说明]]></title><description><![CDATA[<h1>TRACE32 / Lauterbach 调试下载问题修改说明</h1>
<p dir="auto">日期：2026-07-13</p>
<p dir="auto">工程目录：</p>
<pre><code class="language-text">C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\Spi_Master_Demo_YTM32B1HA0
</code></pre>
<h2>1. 问题现象</h2>
<p dir="auto">在 YTM32B1HA0 的 MCAL SPI demo 工程中，使用 Lauterbach TRACE32 下载/调试时出现异常，而使用 Ozone 调试可以正常运行。</p>
<p dir="auto">过程中出现过的典型现象包括：</p>
<pre><code class="language-text">FLASH programming error around address ST:0x200FC10--0x200FC1F
target reset detected
DAP: DebugPortFail: CTRLSTAT=0x00000000
running (core power down)
</code></pre>
<p dir="auto">其中 <code>ST:0x200FC10</code> 实际应理解为 <code>0x0200FC10</code>，该地址位于 PFlash0 的 <code>.TEXT</code> 段中，对应函数：</p>
<pre><code class="language-text">Spi_Lld_ReadRXBuffer()
Mcal/Spi/src/Spi_Lld.c:1425
</code></pre>
<p dir="auto">因此该问题不是普通 RAM 地址访问问题，而是 Flash 下载/运行后调试口连接稳定性问题。</p>
<h2>2. 原因分析</h2>
<p dir="auto">本次问题主要分为两个阶段。</p>
<h3>2.1 下载阶段问题</h3>
<p dir="auto">HA0 PFlash 的 program page 为 32 Byte。原 linker 配置中，部分 load segment 的起始地址或长度没有完全按照 32 Byte 对齐，可能导致 TRACE32 target flash algorithm 在烧写 ELF 时遇到非整页烧写场景，从而在 <code>.TEXT</code> 区域附近报 flash programming error。</p>
<h3>2.2 运行后 DAP 掉线问题</h3>
<p dir="auto">Ozone 工程使用的是 SWD：</p>
<pre><code class="language-text">Project.SetTargetIF ("SWD")
</code></pre>
<p dir="auto">原 TRACE32 脚本使用的是 JTAG：</p>
<pre><code class="language-text">SYStem.CONFIG DEBUGPORTTYPE JTAG
</code></pre>
<p dir="auto">MCAL 程序运行后会执行：</p>
<pre><code class="language-c">Port_Init(&amp;Port_Config);
</code></pre>
<p dir="auto">该配置可能会重新配置部分非 SWD 的 JTAG 复用引脚，导致 TRACE32 使用 JTAG 时，在点击 Go 后调试口失联，出现：</p>
<pre><code class="language-text">DAP: DebugPortFail: CTRLSTAT=0x00000000
running (core power down)
</code></pre>
<p dir="auto">将 TRACE32 调试接口切换为 SWD 后，与 Ozone 保持一致，问题消失。</p>
<h2>3. 修改文件清单</h2>
<p dir="auto">本次主要修改以下文件：</p>
<pre><code class="language-text">board\yt_linker.ld
cmake\targets\GENERATED_SDK_TARGET.cmake
..\ytm32b1ha0-debug.cmm
</code></pre>
<p dir="auto">其中 <code>ytm32b1ha0-debug.cmm</code> 位于 testScript 目录：</p>
<pre><code class="language-text">C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\ytm32b1ha0-debug.cmm
</code></pre>
<h2>4. 具体修改内容</h2>
<h3>4.1 修改 <code>board\yt_linker.ld</code></h3>
<p dir="auto">新增 Flash page 对齐宏：</p>
<pre><code class="language-ld">FLASH_PAGE_SIZE = 32;
</code></pre>
<p dir="auto">对 Flash 中的 loadable section 结尾进行 32 Byte 对齐：</p>
<pre><code class="language-ld">.BVT
.IVT
.NC_TEXT
.TEXT
.ARM
</code></pre>
<p dir="auto">对带 ROM copy image 的 RAM section 进行 32 Byte 对齐：</p>
<pre><code class="language-ld">.CODE_RAM
.D_DATA
.NC_DATA
.DATA_RAM
</code></pre>
<p dir="auto">重点修改包括：</p>
<pre><code class="language-ld">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;
</code></pre>
<p dir="auto">并对 section 本身增加对齐：</p>
<pre><code class="language-ld">.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)
</code></pre>
<p dir="auto">修改目的：</p>
<ul>
<li>保证 ELF 中 Flash load segment 的起始地址按 32 Byte 对齐；</li>
<li>保证 Flash load segment 的 FileSiz 按 32 Byte 对齐；</li>
<li>避免 TRACE32 flash algorithm 处理非整页烧写时失败。</li>
</ul>
<p dir="auto">修改后确认的 ELF Program Header 关键段如下：</p>
<pre><code class="language-text">LOAD 0x02000000 size 0x000a0
LOAD 0x02000800 size 0x003e0
LOAD 0x0200c000 size 0x05d20
LOAD 0x02011d20 size 0x00020
LOAD 0x02011d40 size 0x003c0
</code></pre>
<p dir="auto">这些段的起始地址和长度均满足 32 Byte 对齐。</p>
<h3>4.2 修改 <code>ytm32b1ha0-debug.cmm</code></h3>
<h4>4.2.1 降低调试口时钟</h4>
<p dir="auto">由原先较高 JTAG 时钟调整为：</p>
<pre><code class="language-cmm">SYStem.JtagClock CTCK 2MHz
</code></pre>
<p dir="auto">说明：TRACE32 命令名仍为 <code>JtagClock</code>，但这里用于配置调试口访问速度。降低速度可以提高 reset / flash / run 阶段 DAP 访问稳定性。</p>
<h4>4.2.2 调试接口由 JTAG 改为 SWD</h4>
<p dir="auto">原配置：</p>
<pre><code class="language-cmm">SYStem.CONFIG DEBUGPORTTYPE JTAG
</code></pre>
<p dir="auto">修改为：</p>
<pre><code class="language-cmm">SYStem.CONFIG DEBUGPORTTYPE SWD
</code></pre>
<p dir="auto">修改目的：</p>
<ul>
<li>与 Ozone 工程保持一致；</li>
<li>避免 MCAL <code>Port_Init()</code> 运行后复用 JTAG 相关引脚导致 TRACE32 失联；</li>
<li>解决点击 Go 后出现 <code>DAP: DebugPortFail: CTRLSTAT=0x00000000</code> 的问题。</li>
</ul>
<h4>4.2.3 增加看门狗处理</h4>
<p dir="auto">脚本中增加 WDG 解锁和配置操作：</p>
<pre><code class="language-cmm">&amp;WDG_SVCR = 0x401A8000
&amp;WDG_CR   = 0x401A8004
&amp;WDG_TOVR = 0x401A800C
</code></pre>
<p dir="auto">并执行相关 <code>Data.Set</code> 操作。</p>
<p dir="auto">修改目的：</p>
<ul>
<li>避免 TRACE32 flash algorithm 运行过程中目标芯片被看门狗复位；</li>
<li>减少下载过程中出现 <code>target reset detected</code> 的概率。</li>
</ul>
<h4>4.2.4 Flash algorithm 装载地址恢复为原厂推荐区域</h4>
<p dir="auto">当前配置：</p>
<pre><code class="language-cmm">FLASH.TARGET 0x20020000 0x20021000 0x1000  ~~~~\..\flashAlgorithm\ytm32b1ha0.bin
</code></pre>
<p dir="auto">修改目的：</p>
<ul>
<li>使用 OCRAM 区域执行 flash algorithm；</li>
<li>避免与 DTCM / stack / application RAM 区域冲突。</li>
</ul>
<h4>4.2.5 下载文件改为当前 build ELF</h4>
<p dir="auto">当前配置：</p>
<pre><code class="language-cmm">FLASH.Program.ALL
Data.LOAD.Elf ~~~~\Spi_Master_Demo_YTM32B1HA0\build\Spi_Master_Demo_YTM32B1HA0.elf
FLASH.Program.off
</code></pre>
<p dir="auto">修改目的：</p>
<ul>
<li>使用修正后的 linker 生成的 ELF；</li>
<li>让 TRACE32 按 ELF Program Header 进行 Flash 下载；</li>
<li>避免旧 HEX 文件或非当前 build 产物影响验证结果。</li>
</ul>
<h4>4.3.6 烧录后重新加载符号并设置入口</h4>
<p dir="auto">新增：</p>
<pre><code class="language-cmm">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
</code></pre>
<p dir="auto">修改目的：</p>
<ul>
<li>烧录结束后只加载符号，不重复写 Flash；</li>
<li>将 MSP / PSP 设置到应用栈顶；</li>
<li>将 PC 设置到 <code>Reset_Handler</code>；</li>
<li>保证点击 Go 后程序从应用启动入口运行，而不是从 TRACE32 flash algorithm 的上下文继续执行。</li>
</ul>
<h4>4.3.7 关闭非必要窗口操作</h4>
<p dir="auto">注释：</p>
<pre><code class="language-cmm">;per.view ~~~~\..\ytm32b1ha0.per
;Data.List
</code></pre>
<p dir="auto">修改目的：</p>
<ul>
<li>减少脚本执行后的额外外设访问；</li>
<li>避免在目标状态不稳定时触发不必要的 DAP 访问。</li>
</ul>
<h2>5. 验证结果</h2>
<p dir="auto">修改后重新编译工程成功。</p>
<p dir="auto">Build size：</p>
<pre><code class="language-text">text 24992
data   992
bss   6224
dec  32208
hex   7dd0
</code></pre>
<p dir="auto">ELF load segment 已确认 32 Byte 对齐。</p>
<p dir="auto">使用修改后的 TRACE32 脚本：</p>
<pre><code class="language-text">C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\ytm32b1ha0-debug.cmm
</code></pre>
<p dir="auto">执行下载后点击 Go，程序可以正常运行，未再出现 DAP 失联问题。</p>
<h2>6. 推荐使用方式</h2>
<p dir="auto">建议使用以下流程：</p>
<ol>
<li>重新编译工程；</li>
<li>板子断电重上电；</li>
<li>在 TRACE32 中执行：</li>
</ol>
<pre><code class="language-text">DO C:\Users\xiangye\Desktop\trace32\YTMicro\ytm32b1ha0\testScript\ytm32b1ha0-debug.cmm
</code></pre>
<ol start="4">
<li>脚本执行完成后点击 Go。</li>
</ol>
<h2>7. 注意事项</h2>
<ol>
<li>当前验证使用的是 <code>ytm32b1ha0-debug.cmm</code>。</li>
<li><code>ytm32b1ha0-trace.cmm</code> 如果后续也要使用，需要同步修改为 SWD，并同步 ELF 下载方式及 <code>FLASH.TARGET</code> 配置。</li>
<li>如果后续重新通过配置工具生成工程，<code>GENERATED_SDK_TARGET.cmake</code> 或 <code>yt_linker.ld</code> 可能被覆盖，需要重新确认本说明中的修改是否仍然保留。</li>
<li>主要集中在 linker 对齐、编译配置和 TRACE32 调试下载脚本。</li>
</ol>
<p dir="auto"><a href="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/28/c386184e-4d4c-412f-a3af-0c4eea8cd16a.zip" rel="nofollow ugc">82ad020a-e80a-4c52-b238-d90db2a8be21-HA Trace32 test okt.zip</a></p>
]]></description><link>https://forum.ytmicro.com/topic/2118/关于云途mcal支持劳德巴赫调试修改说明</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 21:04:55 GMT</lastBuildDate><atom:link href="https://forum.ytmicro.com/topic/2118.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Jul 2026 09:26:26 GMT</pubDate><ttl>60</ttl></channel></rss>