神农鼎 发表于 2026-7-8 10:34:06

STC32G144K246, 程序空间超过64K字节,KEIL C251 编译器如何设置

STC32G144K246, 程序空间超过64K字节,KEIL C251 编译器如何设置



神农鼎 发表于 2026-7-8 10:35:29

<p>根据 STC32G144K246 手册(第12章 &quot;i-Cache,存储器&quot;)以及 Keil C251 编译器的特性,以下是完整的设置说明。</p>
<hr />
<h2>STC32G144K246 程序空间超过64KB的 Keil C251 设置方法</h2>
<h3>1. 芯片存储器概况</h3>
<p>STC32G144K246 的 <strong>Flash 程序存储器为 246K 字节</strong>,地址范围从 <code>FC:2800H</code> 到 <code>FF:FFFFH</code>,其中:</p>
<table>
<thead>
<tr>
<th align="center">区域</th>
<th align="center">地址范围</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">代码区(code)</td>
<td align="center"><code>FF:0000H ~ FF:FFFFH</code></td>
<td>64KB,复位入口在 <code>FF:0000H</code></td>
</tr>
<tr>
<td align="center">扩展代码区(ecode)</td>
<td align="center"><code>FC:2800H ~ FE:FFFFH</code></td>
<td>超过64KB的扩展代码空间</td>
</tr>
</tbody>
</table>
<p>(来源:STC32G144K246 手册第12章 &quot;i-Cache,存储器&quot;)</p>
<h3>2. Keil C251 编译器设置步骤</h3>
<p>Keil C251 编译器支持 <strong>Huge 存储器模式</strong>,可以生成超过64KB地址空间的代码。具体设置如下:</p>
<h4>步骤一:选择正确的芯片型号</h4>
<p>在 Keil 工程中,Device 选择 <strong>STC32G144K246</strong> 系列(或对应的 STC32G 系列型号),Keil C251 会自动识别其存储器映射。</p>
<h4>步骤二:设置 Memory Model 为 Huge</h4>
<p>在 Keil 中操作:</p>
<ol>
<li>点击菜单栏 <strong>Project → Options for Target 'Target 1'...</strong>(或直接点击工具栏的魔术棒图标)</li>
<li>切换到 <strong>Target</strong> 选项卡</li>
<li>在 <strong>Memory Model</strong> 下拉框中,选择 <strong>Huge</strong></li>
<li>在 <strong>Code Rom Size</strong> 下拉框中,选择 <strong>Huge: 64K program or less</strong>(注意:这里虽然写&quot;64K program or less&quot;,但配合 Huge Memory Model 后,编译器会使用 3 字节/4 字节指针访问超过 64KB 的代码空间)</li>
</ol>
<blockquote>
<p><strong>说明</strong>:Huge 模式下,函数调用默认使用 24 位(3字节)或 32 位地址,可以访问整个 246KB 程序空间。</p>
</blockquote>
<h4>步骤三:代码分区(可选,用于精细控制)</h4>
<p>如果希望将特定函数或变量放在指定地址区域,可以使用 <code>_at_</code> 关键字或修改链接脚本(L51_BANK.A51 或类似的分区文件)。但对于大多数应用,直接使用 Huge 模式即可自动管理超过 64KB 的代码。</p>
<h4>步骤四:使用 far 关键字(必要时)</h4>
<p>对于某些需要显式指定为远地址访问的变量或函数指针,可以使用 C251 的扩展关键字:</p>
<pre><code class="language-c">char far code_array;   // 放在扩展代码区
void far func(void);      // 远函数
</code></pre>
<h3>3. 编译器命令行等效设置</h3>
<p>如果通过命令行或 Makefile 构建,对应的编译选项为:</p>
<pre><code>C251.exe 源文件.cMODE HUGEROM HUGE
</code></pre>
<h3>4. 注意事项</h3>
<ul>
<li><strong>STC32G 系列是 32 位 8051 内核</strong>,必须使用 <strong>Keil C251</strong> 编译器(不是 Keil C51)。C51 只能生成 64KB 以内的代码。</li>
<li>在 Huge 模式下,代码执行效率会略有降低(因为地址计算更复杂),但这是访问超过 64KB 程序空间的必要代价。</li>
<li>STC32G144K246 带有 <strong>i-Cache(指令缓存)</strong>,可以有效缓解大容量 Flash 的读取延迟,手册第12章有详细说明。</li>
<li>官方例程包(如实验箱演示程序)中已经默认配置为 Huge 模式,可以直接参考其工程设置。</li>
</ul>
<h3>5. 快速检查清单</h3>
<table>
<thead>
<tr>
<th align="left">项目</th>
<th align="left">正确设置</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">编译器</td>
<td align="left">Keil C251(不是 C51)</td>
</tr>
<tr>
<td align="left">Device 型号</td>
<td align="left">STC32G144K246 或对应型号</td>
</tr>
<tr>
<td align="left">Memory Model</td>
<td align="left"><strong>Huge</strong></td>
</tr>
<tr>
<td align="left">Code Rom Size</td>
<td align="left"><strong>Huge: 64K program or less</strong></td>
</tr>
<tr>
<td align="left">操作系统</td>
<td align="left">无特殊要求</td>
</tr>
</tbody>
</table>
<p>如果按照上述设置后仍然遇到编译错误(如 <code>OUT OF MEMORY</code> 或 <code>SEGMENT TOO LARGE</code>),请检查是否有个别模块未正确设置为 Huge 模式,或需要进一步使用代码分区(banking)技术。欢迎提供具体的编译错误信息,我可以进一步协助排查。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=STC32G144K246%20%E7%A8%8B%E5%BA%8F%E7%A9%BA%E9%97%B4%E8%B6%85%E8%BF%8764K%E5%AD%97%E8%8A%82%20KEIL%20C251%20%E7%BC%96%E8%AF%91%E5%99%A8%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;STC32G144K246 程序空间超过64K字节 KEIL C251 编译器如何设置&quot;</a></p>
<p><strong>📌 相关论坛讨论</strong></p>
<ol>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=24524&amp;highlight=STC32G144K246%2C%20%E7%A8%8B%E5%BA%8F%E7%A9%BA%E9%97%B4%E8%B6%85%E8%BF%8764K%E5%AD%97%E8%8A%82%EF%BC%8CKEIL%20C251%20%E7%BC%96%E8%AF%91%E5%99%A8%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE&amp;page=1&amp;extra=#pid221707">17-USB-CDC-简单的收发测试,STC32G144K246实验箱演示程序</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=2854&amp;highlight=STC32G144K246%2C%20%E7%A8%8B%E5%BA%8F%E7%A9%BA%E9%97%B4%E8%B6%85%E8%BF%8764K%E5%AD%97%E8%8A%82%EF%BC%8CKEIL%20C251%20%E7%BC%96%E8%AF%91%E5%99%A8%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE&amp;page=2&amp;extra=#pid19821">#打卡学习贴 记录32g12k的学习研究过程</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=20579&amp;highlight=STC32G144K246%2C%20%E7%A8%8B%E5%BA%8F%E7%A9%BA%E9%97%B4%E8%B6%85%E8%BF%8764K%E5%AD%97%E8%8A%82%EF%BC%8CKEIL%20C251%20%E7%BC%96%E8%AF%91%E5%99%A8%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE&amp;page=1&amp;extra=#pid190510">STC32G144K246-128K-RAM使用注意使用far关键字</a></li>
</ol>
<p>⏱️ 查找用时 23.5s | 总回答用时 34.4s</p>

神农鼎 发表于 2026-7-8 10:36:54




神农鼎 发表于 2026-7-8 10:39:08





页: [1]
查看完整版本: STC32G144K246, 程序空间超过64K字节,KEIL C251 编译器如何设置