找回密码
 立即注册
查看: 121|回复: 5

8G1K08A IO口 P32 P31 P30 启动时都要低地平怎么设置?求助大佬!

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-03-25 09:47:49
已绑定手机

3

主题

7

回帖

43

积分

新手上路

积分
43
发表于 2025-3-24 15:40:04 | 显示全部楼层 |阅读模式
8G1K08A    启动时P32为推免输出    P32=0;   P31  P30 是高阻输入;  输入为低电平!    启动时这三个IO怎么设置?   

关于 I/O 的注意事项:
1、 P3.0 和 P3.1 口上电后的状态为弱上拉双向口模式
2、 除 P3.0 和 P3.1 外,其余所有 IO 口上电后的状态均为高阻输入状态,用户在使用 IO 口
前必须先设置 IO 口模式
3、 芯片上电时如果不需要使用 USB 进行 ISP 下载, P3.0/P3.1/P3.2 这 3 个 I/O 口不能同时
为低电平,否则会进入 USB
下载模式而无法运行用户代码
4、 芯片上电时,若 P3.0 和 P3.1 同时为低电平, P3.2 口会短时间由高阻输入状态切换到双
向口模式,用以读取 P3.2 口外部状态来判断是否需要进入 USB 下载模式

#include "intrins.h"
#include "main.h"
#include "STC8G.h"

void main()
{

        //  P3M0 |= 0x0c; P3M1 &= ~0x0c; //调试用!
        
        P3M0 = (P3M0 & ~0x03) | 0x0c;  //设置  P32 P33 推挽输出 // P30 P31高阻输入  //
              P3M1 = (P3M1 & ~0x0c) | 0x03;

              P32=0;
              P33=0;
     
            P5M0 &= ~0x30;  //设置  高阻输入  P5.4 P5.5//
            P5M1 |= 0x30;


   //启动内部时钟不用设置      
        
         WDT_CONTR = 0x24;                           //使能看门狗,溢出时间约为1s
        
        //使能ADC中断
          Timer0_Init();
          ADC_Int();
          ADC_Start();
        
   while (1)
                {
                        WDT_CONTR = 0x34; // 看门狗;
                        //URms20=380;
                        if(Second1>4)//20ms
      {

        Second1=0;
        Key();
        Protect();
                                Uset();
                        
      }
                        
                        
                }
}








void Timer0_Init(void)                //4毫秒@6.000MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x40;                                //设置定时初始值
        TH0 = 0xA2;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}





void Timer0_Isr(void) interrupt 1
{
   
              Second20ms++;
        Second1++;
         
           
            ADC_Start() ;
        
   if(Second20ms>9)//40ms  RMS
     {
        ADsquare20 = ADsquare;              
        URms2= ADsquare20/10;                                               
        URms20=(URms2*51)/100;        
              Second20ms=0;        
              ADsquare = 0;  
               
     }

            
     if(Sign.pulseX==1)
      
     {
            
        P32 =1;   //吸合  P32BX
                        
                        
             Count.SecondX++ ;        
           if(Count.SecondX>4)
            {
                    
        P32=0;//吸合 P32BX
        Sign.CloseFirst=1;
                    Sign.pulseX=0;  
                    Count.SecondX=0;
            }     
     
     }
     
    if(Sign.pulseF==1)
      
     {
               
        P33=1;  //  放  P33AF
              Count.SecondF++  ;        
           if(Count.SecondF>3)
            {
                     P33=0;   //  放P33AF
                     Sign.pulseF=0;
                     ProtectDelayTime=0;
                     Sign.CloseFirst=0;
                     Count.SecondF=0;
            }     
     
     }  
        
        
}






   

void ADC_Int(void)
{
         //50KSPS@6.000MHz
          ADCCFG &= ~0x0f;
          ADCCFG |= 0x01;                        //SPEED(1) // 转换结果右对齐h
          P_SW2 |= 0x80;  
    ADCTIM = 0x2e;                        //CSSETUP(0), CSHOLD(1), SMPDUTY(14)
    P_SW2 &= 0x7f;               
    ADC_CONTR = 0x85;                            //使能ADC模块  AD       P5.5  ADC5        
    EADC = 1;                                   //使能ADC中断        
          EA = 1;

}


void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                         //清中断标志        
    ADValue=ADC_RES;                               //读取ADC结果
          ADValue=(ADValue<<8)+ADC_RESL;
          ADValue=ADValue>>6;
          ADsquare+=ADValue;
          ADcount++;               
}

void ADC_Start(void)
{

    ADC_CONTR |= 0x40;                          //启动AD转换

}


void Protect(void)//20ms
{        

  if(URms20>UsetX)//220V   170   400V  270        
  {
    if(Sign.CloseFirst==0)
    {   
      Sign.DelayX++;  
      if(Sign.DelayX>4)
      {//吸合时间到c            
              Sign.pulseX=1;        
              Sign.DelayX=0;        
      }         
    }   
   if(ProtectDelayTime>0)
    {            
      ProtectDelayTime--;               
    }      
  }
  else  if(URms20<UsetF)  //380:230 //220V  130  //    风电0.2 Un
  {//欠压处理c  
      if(Sign.CloseFirst==1)
         {     
                      if(ProtectDelayTime>TimeSet)
                       {//延时时间到c            
                  Sign.pulseF=1;                                 
                       }
                      else
                      {
                        ProtectDelayTime++;                                                                        
                      }                     
         }
    }

}//Protect

void Key(void)
{//时间设定值计算c
          KeySet=(P3)&0x03;
   switch(KeySet)
       {
        case 0:
            TimeSet=50;//1s  00h
            break;
        case 2:
            TimeSet=150;//3s  
             break;
        case 1:
            TimeSet=250;//5s
             break;
        case 3:
            TimeSet=500;//10s  11h
            break;
      }
}


void Uset(void)
{//电压设定值c

     if(P54==0)
       {
            UsetX=170;//吸
                                    UsetF=130; //分
           
        }
                         else
                         {
                                    UsetX=270; //吸
                                    UsetF=230;//分
                                 
                         }
}

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-24 15:43:00 | 显示全部楼层
针对STC8G1K08A在启动时P32、P31、P30的配置问题,以下是解决方案及详细说明:

1. 问题背景
根据STC8G1K08A的I/O口特性,芯片上电时P3.0和P3.1为弱上拉双向口模式,其余I/O口为高阻输入状态。若在启动时P3.0、P3.1、P3.2同时为低电平,芯片可能进入USB下载模式,无法正常运行用户代码。因此,需要合理配置这些I/O口的状态。

2. 目标需求
P32设置为推挽输出,并初始化为低电平。
P31和P30设置为高阻输入,且确保输入为低电平。

3. 解决方案
通过配置I/O口模式寄存器(P3M0和P3M1)实现上述目标。以下是具体代码实现:
  1. c
  2. include "STC8G.h"
  3. void main() {
  4.     // 配置P3.2为推挽输出,P3.0和P3.1为高阻输入
  5.     P3M0 = (P3M0 & ~0x03) | 0x04;  // P3.2推挽输出,P3.0和P3.1保持默认
  6.     P3M1 = (P3M1 & ~0x07) | 0x03;  // P3.0和P3.1高阻输入,P3.2推挽输出
  7.     // 设置P3.2为低电平
  8.     P32 = 0;
  9.     // 确保P3.0和P3.1为高阻输入状态,外部电路需确保输入为低电平
  10.     while (1) {
  11.         // 主程序逻辑
  12.     }
  13. }
复制代码

4. 代码解析
P3M0和P3M1配置:
P3M0 = (P3M0 & ~0x03) | 0x04;  
    将P3.2(bit2)设置为推挽输出(P3M0的bit2置1),同时保持P3.0和P3.1的默认状态。
P3M1 = (P3M1 & ~0x07) | 0x03;  
    将P3.0和P3.1(bit0和bit1)设置为高阻输入(P3M1的bit0和bit1置1),同时保持P3.2的推挽输出模式。
P32初始化:
P32 = 0;  
    将P3.2初始化为低电平。
外部电路:
确保P3.0和P3.1的外部电路在启动时提供低电平,避免进入USB下载模式。

5. 注意事项
避免USB下载模式:确保P3.0、P3.1、P3.2不同时为低电平。
外部电路设计:若P3.0和P3.1需要高阻输入且为低电平,需通过外部下拉电阻或电路实现。
I/O口模式设置:在使用I/O口前,必须明确设置其模式,避免未定义行为。

通过以上配置,可满足启动时P32为推挽输出低电平,P31和P30为高阻输入且为低电平的需求,同时避免进入USB下载模式。

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

点评

AI 回答错误,因该是 P3.2外接上拉电阻10K就可以了,另外用户要确保上电时, P3.0/P3.1/P3.2 外部不被拉低  详情 回复 发表于 2025-3-25 08:00
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-24 16:17:01 | 显示全部楼层
上电瞬间不能同时为低电平,否则会等待USB下载
注意这是上电瞬间,和用户程序(配置IO口)无关
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-03-25 09:47:49
已绑定手机

3

主题

7

回帖

43

积分

新手上路

积分
43
发表于 2025-3-24 20:49:07 | 显示全部楼层
Debu*** 发表于 2025-3-24 16:17
上电瞬间不能同时为低电平,否则会等待USB下载
注意这是上电瞬间,和用户程序(配置IO口)无关 ...
谢谢!其实USB下载模式完全没有必要!搞不好还有BUG!

点评

可以勾选这个选项 总不能上电时候这4个脚都是低电平吧  详情 回复 发表于 2025-3-24 22:41
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-24 22:41:24 | 显示全部楼层
WZQ4*** 发表于 2025-3-24 20:49
谢谢!其实USB下载模式完全没有必要!搞不好还有BUG!


可以勾选这个选项
总不能上电时候这4个脚都是低电平吧

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15611
发表于 2025-3-25 08:00:44 | 显示全部楼层
国芯人*** 发表于 2025-3-24 15:43
针对STC8G1K08A在启动时P32、P31、P30的配置问题,以下是解决方案及详细说明:

1. 问题背景

AI 回答错误,因该是 P3.2外接上拉电阻10K就可以了,另外用户要确保上电时, P3.0/P3.1/P3.2 外部不被拉低
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 23:00 , Processed in 0.132759 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表