DJF_NK2Hb 发表于 7 天前

原理图如下,代码写的拉高5.4脚,接了串口,上电之后,MCU不知进入什么状态



代码写的拉高5.4脚,接了串口,
上电之后,MCU不知进入什么状态,
5.4没有被拉高,断开串口RX脚就可以正常拉高,
有没有大佬帮忙看看什么原因?

#include "stc8g.h"
#include <intrins.h>

/* 类型定义 */
typedef unsigned char u8;
typedef unsigned int u16;

/* 引脚定义 */
sbit PLAY_STA = P3^2;   // 播放状态:0=播放,1=暂停
sbit KEY      = P3^3;   // 按键输入
sbit VOICE_PWR = P5^4;// 语音电源控制,高有效
sbit MOTOR_PWR = P5^5;// 电机电源控制,高有效

void main(void)
{
    // 上电后先初始化系统(设置I/O模式等)
//    SystemInit();
//      P3M0 = 0x00; P3M1 = 0x0F;
//    P3 = 0xff;      // 所有P3口输出高电平(KEY和PLAY_STA由外部电路决定)

    // P5口:P5.4(VOICE_PWR)输出低,P5.5(MOTOR_PWR)输出低
    // 其他未使用引脚设为准双向口输出高
    P5M0 = 0x30;    // P5.4、P5.5推挽输出
    P5M1 = 0x00;
    VOICE_PWR = 1;
      while(1);
    // 进入休眠,等待长按开机
//    Enter_Sleep();

//    while (1)
//    {
//      // ===== 开机检测循环 =====
//      while (1)
//      {
//            if (CheckPowerOn()) {
//                break;          // 长按2秒,开机
//            }
//            Enter_Sleep();      // 短按或抖动,继续休眠
//      }

//      // ===== 正常开机 =====
//      // 重新初始化系统(从掉电唤醒后,外设寄存器可能处于复位状态)
//      SystemInit();

//      // 开启语音IC电源
//      VOICE_PWR = 1;
//      current_mode = MODE1;
//      system_standby = 0;
//      standby_timer = 0;
//      shutdown_flag = 0;
//      system_power_on = 1;

//      // 等待语音IC上电稳定
//      delay_ms(1500);

//      // 发送播放指令
//      Uart_SendCMD(0x0D, 0, 0);

//      // 开启电机(模式1默认电机运动)
//      MOTOR_PWR = 1;

//      // ===== 工作主循环 =====
//      while (1)
//      {
//            // 串口通信处理
//            Uart_communication();

//            // 按键处理
//            KeyProcess();

//            // 待机状态下强制关闭电机
//            if (system_standby) {
//                MOTOR_PWR = 0;
//            }

//            // 关机请求
//            if (shutdown_flag) {
//                shutdown_flag = 0;
//                system_power_on = 0;
//                VOICE_PWR = 0;
//                MOTOR_PWR = 0;
//                Enter_Sleep();      // 进入掉电模式
//                break;            // 退出工作循环,回到开机检测
//            }
//      }
//    }
}





梁工 发表于 7 天前

上电后,P5.4为高阻,直到你设置其模式。

狂热主宰 发表于 7 天前

部分引脚会有电平变化
通常手册有说明

神农鼎 发表于 6 天前


大家看下,STC的 【AI助手】,不知搞对了没 ?


神农鼎 发表于 6 天前

<p>现在问题非常清楚了!我来整理一下完整的分析。</p>
<hr />
<h2>问题分析:P5.4 上电后无法拉高,断开串口 RX 后正常</h2>
<p>您好!我是 STC 的 FAE 工程师,看了您在论坛的帖子,这个问题我来帮您分析。</p>
<h3>根本原因</h3>
<p><strong>P5.4 被串口1的 RxD 功能占用了。</strong></p>
<p>根据 STC8G 手册 <strong>&quot;功能脚切换&quot;</strong> 章节中的串口功能脚切换表:</p>
<p>对于 <strong>STC8G1K08-8Pin系列</strong> 和 <strong>STC8G1K08A系列</strong>,串口1的 RxD/TxD 功能脚选择如下:</p>
<table>
<thead>
<tr>
<th align="center">S1_S</th>
<th align="center">RxD</th>
<th align="center">TxD</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">00</td>
<td align="center">P3.0</td>
<td align="center">P3.1</td>
</tr>
<tr>
<td align="center">01</td>
<td align="center">P3.2</td>
<td align="center">P3.3</td>
</tr>
<tr>
<td align="center"><strong>10</strong></td>
<td align="center"><strong>P5.4</strong></td>
<td align="center"><strong>P5.5</strong></td>
</tr>
<tr>
<td align="center">11</td>
<td align="center">-</td>
<td align="center">-</td>
</tr>
</tbody>
</table>
<p>也就是说,<strong>当 S1_S = 10 时,P5.4 被配置为串口1的 RxD 引脚</strong>。RxD 是输入引脚,此时即使您将 P5.4 设置为推挽输出并写 1,由于串口外设的输入功能在驱动该引脚,<strong>P5.4 的电平会被外部串口设备(或悬空状态)所影响</strong>,无法正常输出高电平。</p>
<p><strong>您断开串口 RX 脚后 P5.4 恢复正常</strong>,正是因为断开了外部对 RxD 引脚的钳位/拉低作用。</p>
<h3>解决方案</h3>
<p>有以下几种解决方式:</p>
<h4>方案一:检查并修改 P_SW1 寄存器(推荐)</h4>
<p>确保 <strong>P_SW1 的 S1_S 位为 00</strong>(默认值),即串口1使用 P3.0/RxD 和 P3.1/TxD,不要占用 P5.4。</p>
<pre><code class="language-c">// 在 main 函数最开头加上
P_SW1 &amp;= 0x3F;   // 清除 S1_S 位(位7、位6),恢复为 00
// 或者明确写:
P_SW1 = (P_SW1 &amp; 0x3F) | 0x00;// S1_S = 00,使用 P3.0/P3.1
</code></pre>
<h4>方案二:如果您确实需要使用 P5.4 作为普通 I/O</h4>
<p>检查您的代码中是否有对 <code>P_SW1</code> 寄存器的操作,确保没有将 S1_S 设置为 10。</p>
<h4>方案三:换用其他引脚作为 VOICE_PWR</h4>
<p>如果 P5.4 确实被串口功能占用无法避免,可以考虑将 VOICE_PWR 换到其他未被外设功能占用的引脚上。</p>
<h3>补充说明</h3>
<p>另外,根据 STC8G 手册 <strong>&quot;应用注意事项&quot;</strong> 章节的说明:</p>
<blockquote>
<p><strong>特别注意:由于 STC8G 系列的所有 I/O(除了 ISP 下载口 P3.0/P3.1 外)在上电后都是高阻输入模式。</strong></p>
</blockquote>
<p>所以您的代码中设置 P5M0/P5M1 是正确的做法,但前提是 P5.4 没有被串口外设功能占用。如果串口外设功能已经接管了 P5.4,那么 GPIO 模式寄存器的设置将无法生效。</p>
<h3>验证方法</h3>
<p>您可以在 <code>main()</code> 函数开头加入以下代码来确认问题:</p>
<pre><code class="language-c">void main(void)
{
    // 先强制将串口1功能脚切回默认的 P3.0/P3.1
    P_SW1 &amp;= 0x3F;      // S1_S = 00

    // 再设置 P5.4 为推挽输出
    P5M0 = 0x30;      // P5.4、P5.5 推挽输出
    P5M1 = 0x00;

    VOICE_PWR = 1;      // 此时应该能正常拉高

    while(1);
}
</code></pre>
<p>如果这样修改后 P5.4 能正常拉高,就确认是串口功能脚切换导致的问题。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=https%3A%2F%2Fwww.stcaimcu.com%2Fthread-24923-1-1.html&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;https://www.stcaimcu.com/thread-24923-1-1.html&quot;</a></p>
<p>⏱️ 查找用时 15.9s | 总回答用时 24.9s</p>

神农鼎 发表于 6 天前


神农鼎 发表于 6 天前

建议将如下内容贴到 STC的【AI助手】,
直接让他帮您写程序:

STC8G1K08A-SOP8, 工作频率 24MHz:
P3.0 做...... ;
P3.1 做...... ;
P3.2 做...... ;
P3.3 做...... ;
P5.4 做...... ;
P5.5 做...... ;
帮写个......的程序



lcwswust 发表于 6 天前

哪个型号?如果有USB烧写功能,要注意P3.2引脚,程序可能在等待ISP下载而未运行用户程序。
电路似乎不完整,5V_EN不知接了啥。

DJF_NK2Hb 发表于 6 天前

神农鼎 发表于 2026-7-16 09:17
现在问题非常清楚了!我来整理一下完整的分析。

问题分析:P5.4 上电后无法拉高,断开串口 RX 后正常


没有切换过,不是功能切换的问题,,换其他脚也不能拉高。

DJF_NK2Hb 发表于 6 天前

lcwswust 发表于 2026-7-16 09:29
哪个型号?如果有USB烧写功能,要注意P3.2引脚,程序可能在等待ISP下载而未运行用户程序。
电路似乎不完整 ...

接了开关,型号STC8G1K08-SOP8
页: [1] 2
查看完整版本: 原理图如下,代码写的拉高5.4脚,接了串口,上电之后,MCU不知进入什么状态