<?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[RAM Flash Driver 算法]]></title><description><![CDATA[<p dir="auto">一个面向 YTM32B1 MCU 的紧凑型、位置无关（Position-Independent）Flash 驱动，编译为一个小型二进制镜像（<code>FlashDriver.bin</code>）。应用既可将它作为 C 数组内嵌，也可下载到 SRAM，再通过固定的函数表调用。该设计面向引导加载程序（Bootloader）/OTA 场景——当需要擦除、编程正在被修改的 Flash 区域时，驱动代码本身必须运行在别处。</p>
<h2>定位与 PIC 优势</h2>
<ul>
<li><strong>位置无关代码（PIC）</strong>：镜像以 <code>-fpic -fpie</code> 编译，不含任何绝对地址假设。主机应用从镜像基址（<code>FLS_DRV_BASE_ADDR</code>）处的函数表中解析每个函数入口，因此二进制可被加载到不同的 SRAM/Flash 地址而无需重新编译。</li>
<li><strong>从 SRAM 运行</strong>：驱动在 SRAM 中执行，因此可以擦除、编程<em>任意</em> Flash 区域，包括应用自身所在的区域——这正是 Bootloader/OTA 更新的典型需求。</li>
<li><strong>占用极小</strong>：整个镜像（函数表 + 代码 + 常量）必须放入 4 KB 链接区域（<code>link/relative.ld</code>）；当前 YTM32B1ME1 构建产物仅约 856 字节。</li>
<li><strong>单头文件集成</strong>：主机侧只需 <code>fls_drv_bin.h</code>（数组模式下另需生成的 data 头文件）。API 签名遵循 SDK Flash 驱动惯例并返回 <code>status_t</code>，覆盖引导加载所需的核心操作（Init/Deinit、扇区擦除、编程、BootSwap）。它是 SDK 驱动的紧凑子集，并非完整替代品。</li>
<li><strong>多芯片一次构建</strong>：一次 CMake 调用即可产出全部芯片变体。</li>
</ul>
<h2>注意事项</h2>
<ol>
<li><strong>校验函数表</strong>：<code>FLASH_DRV_GetVersion()</code> 应返回 <code>1</code>。否则说明 <code>FLS_DRV_BASE_ADDR</code> 处的镜像不正确（数组未链接，或二进制下载到了错误的 SRAM 地址）。</li>
<li><strong>PRESCALER</strong>：在 <code>FLASH_DRV_Init()</code> 之前且每次时钟变更后将 EFM CTRL 的 PRESCALER 配置为 <code>flashClockHz / 2,000,000</code>；以目标芯片 SDK/参考手册为准。</li>
<li><strong>对齐</strong>：<code>EraseSector</code> 的 <code>dest</code>/<code>size</code> 为扇区大小整数倍；<code>Program</code> 的 <code>dest</code>/<code>size</code> 为 <code>FEATURE_EFM_WRITE_UNIT_SIZE</code> 整数倍且 <code>pData</code> 4 字节对齐。</li>
<li><strong>先擦除再编程</strong>：编程前目标区域必须为 <code>0xFF</code>（已擦除）；操作后回读校验。</li>
<li><strong>SRAM 模式</strong>：<code>FlashDriver.bin</code> 必须实际加载到 <code>FLS_DRV_BASE_ADDR</code> 处；地址错误会在首次 API 调用时导致硬错误（Hard Fault）或未定义行为。</li>
<li><strong>链接溢出</strong>：若构建报 "region <code>m_text</code> overflowed"，说明镜像超过 4 KB 链接区域。</li>
<li><strong>缺少 <code>bin2h.exe</code></strong>：若 <code>bin_project/tools/bin2h.exe</code> 不存在，生成 <code>fls_drv_bin_data.h</code> 的构建后步骤将失败。</li>
<li><strong>中断/cache</strong>：若 ISR 可能访问被操作的 Flash 区域，请在擦除/编程期间屏蔽中断；建议在 Flash 操作前禁用 cache。</li>
<li><strong>BootSwap</strong>：仅在芯片支持时调用，且仅在具备已验证恢复路径的流程中使用。</li>
<li><strong>不建议将驱动作为常驻可执行内容持久保存</strong>：函数表中保存的是基于 <code>FLS_DRV_BASE_ADDR</code> 解析的相对偏移。建议仅在需要执行 Flash 操作时，将镜像加载到受控的 SRAM 地址，并在调用任何擦除/编程 API 前校验基址和 <code>FLASH_DRV_GetVersion()</code>。若基址错误、镜像损坏或程序异常跑飞，可能解析到错误的函数地址，进而造成 Flash 误擦除或误编程。</li>
</ol>
<p dir="auto"><strong>提示：</strong> 请在使用前，仔细阅读项目根目录下的 README 文档，以获取完整的环境配置与运行说明。<br />
关于各版本的迭代细节与功能变更，敬请参阅 CHANGELOG 文件。</p>
<h2>相关链接：</h2>
<p dir="auto"><a href="https://forum.ytmicro.com/topic/164/ytm32mc03-%E6%9C%89%E6%B2%A1%E6%9C%89ram-flashdriver%E7%9A%84%E6%A1%88%E4%BE%8B-%E5%81%9Aboot%E7%94%A8%E7%9A%84?_=1767074645275">https://forum.ytmicro.com/topic/164/ytm32mc03-有没有ram-flashdriver的案例-做boot用的?_=1767074645275</a></p>
<h2>工程下载：</h2>
<p dir="auto"><a href="https://yt-static-main.oss-cn-shanghai.aliyuncs.com/nodebb/8/f1585e87-1035-47bc-82ea-b621e3c2d320.zip" rel="nofollow ugc">flash_driver_bin-v1.1.1-20260814.zip</a></p>
]]></description><link>https://forum.ytmicro.com/topic/2198/ram-flash-driver-算法</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 12:26:45 GMT</lastBuildDate><atom:link href="https://forum.ytmicro.com/topic/2198.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Aug 2026 02:19:32 GMT</pubDate><ttl>60</ttl></channel></rss>