请教大神!STC32G144K246核心板调试项目程序下载后自动运行,重新上电检测不到单片机
各位大神好!请教一下一个很奇怪的现象,我用一块咱们的STC32G144K246-pin100的核心板调试项目程序,已经基本上可以了,在KEIL里debug,各个模块的功能都正常工作,但是突然再下载debug后,程序自动运行标志变灰色,但实际上并没有真正工作,我按stop后单步运行有反应,但是不是正常状态,而且设置断点等无法运行到断点,当我结束debug后再上电就发现无法连接检测单片机,我以为是单片机坏了,就又买了几个,焊上去后跑例子程序都正常,但是一下载我的那个项目程序就出现上面的现象,而同样的程序之前编译下载调试都是正常的,不知道咱们STC公司能不能帮忙解决一下,现在这个项目要的很急,卡在这里进行不下去了。{:daku:}
<p>好的,我已经查看了您发来的这个论坛帖子(TID:24563),帖子中反映的是 <strong>STC32G144K246-pin100</strong> 核心板在调试项目时出现的"程序下载后芯片失联"问题。这是一个比较典型的问题,我来做个详细分析并提供解决方案。</p>
<hr />
<h2>🔍 问题分析</h2>
<p>根据帖子描述,关键现象是:</p>
<ol>
<li><strong>之前调试一切正常</strong>,说明硬件连接和下载工具都没问题</li>
<li><strong>下载项目程序后</strong> -> 再上电就<strong>检测不到单片机</strong></li>
<li><strong>换新单片机跑例子程序正常</strong>,但一下载项目程序就复现同样问题</li>
</ol>
<p>这说明<strong>问题出在用户项目代码本身</strong>,而不是硬件损坏。</p>
<hr />
<h2>🎯 最可能的根本原因</h2>
<p>根据 <strong>STC32G144K246-20260625 数据手册</strong>,STC 系列的 ISP 下载/检测依赖 <strong>P3.0 (RxD) 和 P3.1 (TxD)</strong> 这两个引脚。当用户程序在初始化代码中做了以下任意一件事,就会导致芯片上电后立刻"失联":</p>
<h3>1️⃣ P3.0/P3.1 被配置为其他 I/O 模式 🔴(最常见原因)</h3>
<p>P3M1 的复位值为 <code>1111,1100</code>,即 P3.0/P3.1 复位后默认为<strong>准双向口</strong>(00),这是 ISP 正常通信的前提。</p>
<p>如果你的项目代码中有类似这样的初始化:</p>
<pre><code class="language-c">P3M0 |= 0x03; // P3.0/P3.1 设为推挽输出
// 或
P3M1 |= 0x03; // P3.0/P3.1 设为高阻输入
</code></pre>
<p>芯片上电后运行到这条语句的瞬间,P3.0/P3.1 的模式被改变,ISP 软件就再也无法与芯片握手了。</p>
<h3>2️⃣ P3.0/P3.1 被切换到其他外设功能 🔴</h3>
<p>如果你的程序通过 <strong>P_SW1 / P_SW2</strong> 等寄存器将串口1(ISP 所用串口)切换到了其他引脚组,或者将 P3.0/P3.1 用作 SPI/I2C/PWM 等外设引脚,同样会导致 ISP 无法通信。</p>
<h3>3️⃣ 程序一启动就进入掉电模式 🔴</h3>
<p>如果 main() 一开始就执行了:</p>
<pre><code class="language-c">PCON |= 0x02; // PD=1,进入掉电模式
</code></pre>
<p>芯片会立即进入休眠状态,自然无法响应 ISP 的检测信号。</p>
<h3>4️⃣ 时钟频率被修改到 ISP 无法同步的范围</h3>
<p>如果程序将 IRC 频率设置到极端值,可能导致 ISP 工具无法同步波特率。</p>
<hr />
<h2>✅ 解决方案</h2>
<h3>方案一:紧急恢复芯片(已"变砖"的芯片这样救)</h3>
<p>STC32G144K246 支持 <strong>USB-HID 下载</strong>,可以通过 <strong>P3.2 按键冷启动</strong> 强制进入下载模式:</p>
<ol>
<li><strong>按住 P3.2/INT0 按键接地</strong></li>
<li><strong>重新给核心板上电</strong>(断电再上电,冷启动)</li>
<li>此时不要松开 P3.2,等待 ISP 软件识别出 <strong>"(HID1) USB Writer"</strong></li>
<li>识别到后可以松开 P3.2</li>
<li>点击 <strong>下载/编程</strong> 按钮,擦除原来的程序</li>
</ol>
<blockquote>
<p>📌 <strong>重要</strong>:手册明确说明,拔插 USB 插头不能代替电源开关。必须使用电源开关<strong>冷启动</strong>(断电再上电),让 MCU 从系统区启动而不是从用户程序区启动。</p>
</blockquote>
<h3>方案二:检查并修改项目代码(根治)</h3>
<p>请重点排查以下几个地方:</p>
<p><strong>① 检查 P3.0/P3.1 的 I/O 口配置</strong></p>
<ul>
<li>搜代码中的 <code>P3M0</code>、<code>P3M1</code> 寄存器操作</li>
<li><strong>不要改变 P3.0 和 P3.1 的模式</strong>,保持准双向口(复位默认值)</li>
</ul>
<p><strong>② 检查外设功能切换寄存器</strong></p>
<ul>
<li>搜代码中的 <code>P_SW1</code>、<code>P_SW2</code> 寄存器</li>
<li>确认没有将串口1或 P3.0/P3.1 切换到其他功能</li>
</ul>
<p><strong>③ 检查 PCON 寄存器</strong></p>
<ul>
<li>确保没有在初始化早期设置 <code>PCON |= 0x02</code>(掉电模式)</li>
</ul>
<p><strong>④ 在 main() 开头加入延时</strong></p>
<ul>
<li>在初始化外设之前,加入约 500ms~1s 的延时,给 ISP 工具足够的检测窗口</li>
</ul>
<pre><code class="language-c">void main()
{
// ★ 先延时,给 ISP 检测机会
delay_ms(500);
// 然后再做其他初始化
// PxM0 = ...; // 但不要动 P3.0/P3.1
// ...
}
</code></pre>
<h3>方案三:使用不停电下载功能</h3>
<p>如果项目用到了 USB 功能,可以实现 USB 不停电下载(通过软复位到系统区),这样就不依赖 P3.0/P3.1 的冷启动了。参考手册中 <code>IAP_CONTR = 0x60</code> 的软复位方式。</p>
<hr />
<h2>📚 信息来源</h2>
<ul>
<li><strong>STC32G144K246-20260625 数据手册</strong> — 第 3.1.2 节《管脚图,最小系统》中详细说明了 USB 下载的三种方法及注意事项</li>
<li><strong>第 14 章 I/O 口</strong> — P3M1/P3M0 寄存器配置表</li>
</ul>
<hr />
<p>如果您能提供项目代码中与 <strong>GPIO 初始化</strong>、<strong>外设功能切换</strong> 以及 <strong>main 函数入口部分</strong> 的代码片段,我可以帮您更精确地定位问题所在。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&mod=forum&q=https%3A%2F%2Fwww.stcaimcu.com%2Fthread-24563-1-1.html&f=_all&m=yes&syn=yes&s=relevance&fid=0">🔍 搜索 "https://www.stcaimcu.com/thread-24563-1-1.html"</a></p>
重新制作 仿真母片 项目程序运行占用RAM情况怎么样
可能USB功能需要留出部分可用运行空间 下载仿真固件后只能用于仿真调试,如果再次下载应用固件会失去仿真功能,需要重新制作仿真芯片,
我们用的STC系列芯片的仿真功能基于Keil的Monior-51,属于侵入式调试机制,需要占用芯片本身的Flash空间存放监控程序,所以不支持在烧录用户应用固件的情况下在线调试。
这点和JTAG、SWD等接口的仿真机制是完全不同的。
页:
[1]