wsuocheng 发表于 2025-9-29 10:33:00

STC8H1K08单片机P3.7端口上电过程中出现高电平脉冲

       公司某款产品使用STC8H1K08-36I-QFN20型号单片机作为主控制器,产品调试过程中发现如下问题,P3.7端口在上电过程中出现高电平脉冲,最高幅值0.7V左右。更换该款产品的其他电路测试问题依然存在,于是更换使用该型号单片机的另外一款产品测试,问题也依然存在。测试过程中测试了单片机的其他引脚不存在此问题。
      1. 硬件电路详见附件。
      2. GPIO初始化程序如下:
      
#include"GPIO_Init.h"
#include"delay.h"

void GPIO_Init(void)
{
      GPIO_InitTypeDef      GPIO_InitStructure;

      // P1.0,P1.2,P1.3 -> NC                                                      推挽输出,上电默认输出低电平
      // P1.1 -> CTRL_5VS2                                                               推挽输出,上电默认输出低电平
      // P1.4 -> SW_SIGNAL                                                                浮空输入
      // P1.5 -> HEAD_SWITCH                                                      浮空输入
      // P1.6 -> PROXIMITY_RX                                                      浮空输入
      // P1.7 -> CH_CTRL                                                                        推挽输出,上电默认输出高电平
      P1 &= 0x70;
      P1 |= 0x80;                                                                                                      // 上电后通道开关切换到近炸输入引脚
      GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7;               
      GPIO_InitStructure.Mode = GPIO_OUT_PP;               
      GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);
      GPIO_InitStructure.Pin= GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;      
      GPIO_InitStructure.Mode = GPIO_HighZ;
      GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);

      // P3.0 -> CMD_RX                                                                                 上拉准双向口
      // P3.1 -> CMT_TX                                                                                 上拉准双向口
      // P3.2,P3.4,P3.6 -> NC                  推挽输出,上电默认输出低电平
      // P3.3 -> CTRL_REMOTE_PWR                                       推挽输出,上电默认输出低电平
      // P3.5 -> CTRL_ARMING                                                      推挽输出,上电默认输出低电平
      // P3.7 -> CTRL_FIRE                                                                推挽输出,上电默认输出低电平      
      P3 &= 0x03;
      GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1;
      GPIO_InitStructure.Mode = GPIO_PullUp;
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
      GPIO_InitStructure.Pin= GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7;               
      GPIO_InitStructure.Mode = GPIO_OUT_PP;               
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
      
      // P5.4 -> NC                                                                                                推挽输出,上电默认输出高电平
      // P5 &= 0xEF;
      GPIO_InitStructure.Pin= GPIO_Pin_4;               
      GPIO_InitStructure.Mode = GPIO_OUT_PP;               
      GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);
}      3. 测试波形如下:(蓝色P3.7端口,绿色VDD:3.3V)
      
      4. PCB 不见布线如下:

国芯人工智能 发表于 2025-9-29 10:43:01

关于STC8H1K08单片机P3.7端口在上电过程中出现高电平脉冲问题的分析与建议

尊敬的工程师:

您好!感谢您分享在产品调试过程中遇到的技术问题。针对您描述的STC8H1K08-36I-QFN20单片机P3.7端口在上电过程中出现约0.7V高电平脉冲的现象,结合您提供的硬件电路信息和GPIO初始化代码片段,我们从硬件设计、电源上电时序、IO口初始化配置、PCB布局以及芯片内部结构等多个维度进行了分析,并提出相应的排查建议和解决方案。

一、问题现象回顾

1. 问题描述:
使用STC8H1K08-36I-QFN20单片机作为主控。
P3.7端口在系统上电过程中出现幅值约0.7V的高电平脉冲。
更换多块电路板及使用该型号单片机的其他产品均出现相同问题。
其他引脚未发现类似现象。

2. 初步判断:
排除了个别电路板或单片机个体问题的可能性。
现象具有重复性和一致性,表明问题可能与硬件设计、软件配置或芯片特性相关。

二、可能原因分析

1. 上电时序与复位不完整
单片机在上电过程中,VCC电源可能未完全稳定,导致内部逻辑尚未完全初始化。
复位信号(如外部复位电路或内部复位)未能有效延迟到电源稳定后再释放。
在复位信号释放前,某些IO口可能处于高阻态或随机状态,造成短暂的高电平脉冲。

2. IO口默认状态配置不当
STC8H系列单片机在复位后,默认的IO口状态可能为高阻输入或弱上拉状态。
如果P3.7未在初始化代码中被及时配置为推挽输出并置低,可能会因外部干扰或内部上拉电阻导致短暂高电平。
从提供的代码片段看,P3.7未出现在初始化列表中,需确认是否遗漏配置。

3. 外部电路影响
若P3.7连接有外部电路(如MOS管栅极、LED、电容等),在上电瞬间可能形成瞬态电流路径。
PCB布局中若存在较大的寄生电容或感性负载,也可能引起瞬态电压波动。
若P3.7用于控制外部电源或开关电路,该脉冲可能影响下游电路工作。

4. 电源稳定性与去耦设计
VCC电源纹波或噪声可能影响IO口的输出状态。
去耦电容布局不合理或容量不足,可能导致电源上电不稳定,从而影响IO行为。

三、建议排查步骤

1. 检查GPIO初始化代码
确认P3.7是否在初始化过程中被正确配置为推挽输出,并在初始化阶段置低。
建议在系统启动初期(main函数开始)就对所有未使用的IO口进行初始化,避免其处于不确定状态。
示例代码建议:

```c
void GPIOInit(void)
{
    // 其他GPIO配置...

    // 配置P3.7为推挽输出,默认输出低电平
    GPIOP3M0 |= (1

[本文内容由国芯人工智能辅助生成,仅供参考]

乘风飞扬 发表于 2025-9-29 11:06:03

将P3.7的外围元器件都断开,然后加一个下拉电阻试试。

DebugLab 发表于 2025-9-29 14:09:29

IO默认为1,初始化要先设置IO为0,再设置为推挽模式(作为输出)

wsuocheng 发表于 2025-9-29 15:04:24

乘风飞扬 发表于 2025-9-29 11:06
将P3.7的外围元器件都断开,然后加一个下拉电阻试试。

已经将电路板其余器件都焊接掉,只保留单片机,外部线性稳压电源供电,问题依然存在。

wsuocheng 发表于 2025-9-29 15:05:37

DebugLab 发表于 2025-9-29 14:09
IO默认为1,初始化要先设置IO为0,再设置为推挽模式(作为输出)

程序是先将IO设置为0,然后置为推挽输出的。
      P3 &= 0x03;
      GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1;
      GPIO_InitStructure.Mode = GPIO_PullUp;
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
      GPIO_InitStructure.Pin= GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7;               
      GPIO_InitStructure.Mode = GPIO_OUT_PP;               
      GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);

wsuocheng 发表于 2025-9-29 15:13:44

国芯人工智能 发表于 2025-9-29 10:43
关于STC8H1K08单片机P3.7端口在上电过程中出现高电平脉冲问题的分析与建议

尊敬的工程师:

按照您所说的,我这边做了如下测试:

1. 外部电路影响:
用热风枪取下除单片机意外的其他器件,外部使用线性稳压电源供电,供电瞬间问题依然存在。
2. 关于GPIO初始化代码的配置:
主程序:
void main(void)
{
        EAXSFR();                                                                                //ʹÄÜ·ÃÎÊXFR
        InternalXdata_Enable();
        GPIO_Init();
        USART_Init();
        // Timer0_Init();                                                // ÎÞ×Ô»Ù
        PWMA_Init();
        PWMB_Init();
        EA        = 1;
        SystemRunState = WAIT_ARMING_CMD_STATE;
        while(1)GPIO初始化程序:
void GPIO_Init(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;

        // P1.0,P1.2,P1.3 -> NC                                                        ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³öµÍµçƽ
        // P1.1 -> CTRL_ARMING                                                        ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³öµÍµçƽ
        // P1.4 -> CTRL_REMOTE_PWR                                        ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³öµÍµçƽ
        // P1.5 -> CH_CTRL                                                                        ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³ö¸ßµçƽ
        // P1.6 -> PROXIMITY_RX                                                        ¸¡¿ÕÊäÈë
        // P1.7 -> HEAD_SWITCH                                                        ¸¡¿ÕÊäÈë
        P1 &= 0xE0;
        P1 |= 0x20;                                                                                                        // ÉϵçºóͨµÀ¿ª¹ØÇл»µ½½üÕ¨ÊäÈëÒý½Å
        GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;               
        GPIO_InitStructure.Mode = GPIO_OUT_PP;               
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);
        GPIO_InitStructure.Pin= GPIO_Pin_6 | GPIO_Pin_7;       
        GPIO_InitStructure.Mode = GPIO_HighZ;
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);

        // P3.0 -> CMD_RX                                                                               ÉÏÀ­×¼Ë«Ïò¿Ú
        // P3.1 -> CMT_TX                                                                               ÉÏÀ­×¼Ë«Ïò¿Ú
        // P3.2,P3.3£¬P3.6 -> NC                  ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³öµÍµçƽ
        // P3.4 -> CTRL_5VS2                                                               ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³öµÍµçƽ
        // P3.5 -> SW_SIGNAL                                                                ¸¡¿ÕÊäÈë
        // P3.7 -> CTRL_FIRE                                                                ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³öµÍµçƽ       
        P3 &= 0x23;
        GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.Mode = GPIO_PullUp;
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
        GPIO_InitStructure.Pin= GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7;               
        GPIO_InitStructure.Mode = GPIO_OUT_PP;               
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
        GPIO_InitStructure.Pin= GPIO_Pin_5;       
        GPIO_InitStructure.Mode = GPIO_HighZ;
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);
       
        // P5.4 -> NC                                                                                                ÍÆÍìÊä³ö£¬ÉϵçĬÈÏÊä³ö¸ßµçƽ
        // P5 &= 0xEF;
        GPIO_InitStructure.Pin= GPIO_Pin_4;               
        GPIO_InitStructure.Mode = GPIO_OUT_PP;               
        GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);
}P3端口除P3.0 P3.1外,其余端口按位与0,然后设置为推挽输出模式。

网老四 发表于 2025-9-29 20:02:38

测试了下手头的STC8H1K08 TSSOP20封装.
,没写程序,只在rom区开头填了几个0x00,相当于无程序落跑,以避开用户代码的影响.
确实上电时在P3.7脚有尖脉冲输出.加下拉电阻可以显著缩短脉冲宽度到几个us样子,但无法彻底消除.

wsuocheng 发表于 2025-9-30 09:06:44

网老四 发表于 2025-9-29 20:02
测试了下手头的STC8H1K08 TSSOP20封装.
,没写程序,只在rom区开头填了几个0x00,相当于无程序落跑,以避开用户 ...

感谢您百忙之中抽空帮忙测试,谢谢了!我这边测试了两个产品都存在这样的问题,而别的引脚却没有这个脉冲,再加上您的测试结果可以肯定是芯片本身的问题。希望STC厂家能帮忙测试分析下是什么原因导致的这个现象,我这边的客户还在等我的分析报告{:daku:}。

xiaobendan 发表于 2025-10-1 15:16:07

有点久有点嘛,有影响就换个脚。
之前有个好像是15W408还是哪个型号的LQFP44的,也是有个脚上电就会有个下拉的脉冲输出,这导致继电器会跳一下。
后来没办法就把这个脚和另外一个接LED指示灯的脚交换了一下。上电闪那么一下,无伤大雅。
页: [1] 2
查看完整版本: STC8H1K08单片机P3.7端口上电过程中出现高电平脉冲