惠小惠 发表于 4 天前

低功耗关闭数字输入功能后,上电后不正常

单片机型号STC32G8K64-LQFP44

这个项目用到了RTC,实测I/O设置到高阻输入后,未关闭I/O的数字输入功能,电池供电处电流350uA,
把所有I/O设置为高阻输入并关闭数字输入功能后,电池供电电流在1.6uA左右,比较理想。

但是在上电后,P4.1-P4.4作为外部数字量输入,P4.1和P4.3功能正常,P4.2和P4.3一直是0,
外部电压为高电平,是不是哪里设置的不对,但是在上电后不执行GPIO_DeInit()函数,
P4.1-P4.4是正常的,还请大神帮忙看下
主函数代码如下:

设计是检测外部引脚电平确定是否是外部供电,然后确定单片机是掉电模式还是运行模式

//输入-----------------------------------
sbit XH1=P4^1;
sbit XH2=P4^2;
sbit XH3=P4^3;
sbit XH4=P4^4;
sbit WX1=P0^3;
sbit WX2=P0^2;

主程序代码如下:

void main(void)
{

         
         WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
         P_SW2 |= 0x80;
    CKCON = 0; //提高访问XRAM速度
      //GPIO_DeInit();
      Delay10ms();
//
//      GPIO_Config();
//      Uart3_Init();      //      9600bps@24.000MHz串口屏
//      Timer4_Init();//      100ms定时器
//      Timer0_Init();//红外解码
// GPIO_Init();
   RTC_Config();
      IT1=0;      //使能INT1上升沿和下降沿中断
      EX1=1;
      EA=1;//打开所有中断
      EEPROM_Config();
      Delay10ms();
      if(POWER_STATE)
      {
                Delay10ms();
                if(POWER_STATE)
                {
                        Power_on();
                        powerflag=Enable;
                }      
      }
      else
      {
                Delay10ms();
                PD=1;
      }
      while(1)
      {
                if(exti1flag==Enable)
                {
                        exti1flag=Disable;
                        if(POWER_STATE)
                        {
                              Delay10ms();
                              if(POWER_STATE)
                              {
                                        if(powerflag==Disable)
                                        {
                                        Power_on();
                                        powerflag=Enable;
                                        }
                              }               
                        }
                        else
                        {
                              Delay10ms();
                              if(!POWER_STATE)
                              {
                                        if(powerflag==Enable)
                                        {
                                        Power_off();
                                        powerflag=Disable;
                                        }                              
                              }                        
                        }               
                }
                if(powerflag==Disable)
                {
                        PD=1;
                }
                if(powerflag==Enable)
                {
                        BSP_IDLE();
                }
      }      
}

IO的初始化和去数字输出函数

void GPIO_Config(void)
{
      
         EAXFR = 1; //扩展寄存器(XFR)访问使能      
      P1IE = 0xff;
                P2IE = 0xff;
                P3IE = 0xff;
                P4IE = 0xff;
      //P5IE = 0xff;
            _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
      _nop_();
      
      
      
      
      P1M0 = 0x00; P1M1 = 0x00; //P1.6P1.7接XTAL32768,双向

      P4M0 = 0x00; P4M1 = 0xff; //P4高阻输入
      P0M0 = 0xf0; P0M1 = 0x0c; //P0.0 0.1准双向口(UART2),P0.2(X2)P0.3(X1)高阻输入,P0.4567推完输出
   P3M0 = 0x60; P3M1 = 0x00;         //P3.5(KA2) 3.6(KA1) 推挽输出
      
      VALVE1_CLOSE;
      VALVE2_CLOSE;
      

}




void GPIO_DeInit(void)
{
      P0M0 = 0x00; P0M1 = 0xff; //P0口高阻输入
      P1M0 = 0x00; P1M1 = 0xff; //P1口高阻输入
      //P1M0 = 0x00; P1M1 = 0x3f;
   P2M0 = 0x00; P2M1 = 0xff; //P2口高阻输入
      P3M0 = 0x00; P3M1 = 0xff; //P3口高阻输入
//      P3M0 = 0x00; P3M1 = 0xfc; //P3.0 P3.1准双向口,其余高阻

      P4M0 = 0x00; P4M1 = 0xff; //P4口高阻输入
   P5M0 = 0x00; P5M1 = 0xff; //P5口高阻输入

    P0IE = 0x00;
      P1IE = 0x00;
         // P1IE = 0xc0;

      P2IE = 0x00;
//      P3IE = 0x00;
    P3IE = 0x08; //P3^3外部中断
      
      P4IE = 0x00;
   P5IE &= 0xC0;


}

//以下是调用的开关函数

void Power_off(void)
{
      GPIO_DeInit();//IO口高阻输入
      Uart3_DeInit();//关闭串口3-串口屏
      Timer4_DeInit();//关闭定时器4,系统延时机
      Timer0_DeInit();
}
//启动串口,定时器等
void Power_on(void)
{

      //初始化引脚
      GPIO_Config();
      Uart3_Init();      //      9600bps@24.000MHz串口屏
      Timer4_Init();//      100ms定时器
      Timer0_Init();//红外解码
      EA=1;


}



国芯人工智能 发表于 4 天前

根据您描述的问题,P42和P44在上电后无法正确读取外部高电平,而P41和P43功能正常。结合您的代码和描述,可能存在以下几个原因:

1. GPIO初始化问题
   您提到在不执行GPIODeInit()函数时,P41-P44功能正常,但在执行后P42和P44无法正确读取高电平。这表明GPIODeInit()函数可能对P42和P44的配置产生了影响。建议检查GPIODeInit()函数的实现,确保它不会错误地修改P42和P44的配置。

   建议:
在GPIODeInit()函数中,确保P42和P44的配置与P41和P43一致。
如果GPIODeInit()函数会重置所有GPIO的配置,建议在调用GPIODeInit()后重新初始化P42和P44。

2. GPIO模式设置问题
   您提到在低功耗模式下,将IO设置为高阻输入并关闭数字输入功能后,电流降低到16uA,但在上电后P42和P44无法正确读取高电平。这可能是因为在关闭数字输入功能后,P42和P44的输入缓冲器被禁用,导致无法正确读取外部电平。

   建议:
在上电后,重新启用P42和P44的数字输入功能。可以通过设置相关寄存器来重新启用输入缓冲器。
检查P42和P44的输入模式设置,确保它们在上电后处于正确的输入模式(如高阻输入或带上拉输入)。

3. 外部电路问题
   如果P42和P44的外部电路存在设计问题,也可能导致无法正确读取高电平。例如,外部上拉电阻值过大或过小,或者存在电容导致信号延迟。

   建议:
检查P42和P44的外部电路,确保上拉电阻值合适(通常为4.7kΩ或10kΩ)。
使用示波器或逻辑分析仪测量P42和P44的引脚电平,确认外部信号是否正常。

4. 电源管理问题
   您提到项目使用了RTC,并且在低功耗模式下电流降低到16uA。如果电源管理配置不当,可能导致P42和P44在上电后无法正常工作。

   建议:
检查电源管理相关寄存器,确保在上电后所有IO的电源供应正常。
如果使用了低功耗模式,确保在退出低功耗模式后,所有IO的电源和功能恢复正常。

5. 代码逻辑问题
   您的代码逻辑是检测外部引脚电平来确定单片机是掉电模式还是运行模式。如果代码逻辑存在问题,可能导致P42和P44在上电后无法正确读取电平。

   建议:
检查代码逻辑,确保在检测外部引脚电平时,P42和P44的配置和状态正确。
在检测外部引脚电平之前,确保所有相关IO的配置已经完成。

6. 硬件故障
   如果以上方法都无法解决问题,可能存在硬件故障,如P42和P44引脚损坏或焊接不良。

   建议:
检查P42和P44引脚的焊接情况,确保没有虚焊或短路。
如果可能,更换单片机芯片,排除硬件故障的可能性。

代码修改建议
以下是一个可能的代码修改示例,确保在上电后重新启用P42和P44的数字输入功能:

```c
void GPIOReInit(void)
{
    // 重新启用P42和P44的数字输入功能
    P4M1 &= ~(1

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

王昱顺 发表于 3 天前

你这个描述我没怎么看懂;“但是在上电后,P4.1-P4.4作为外部数字量输入,P4.1和P4.3功能正常,P4.2和P4.3一直是0,
外部电压为高电平,是不是哪里设置的不对,但是在上电后不执行GPIO_DeInit()函数,
P4.1-P4.4是正常的,还请大神帮忙看下”
这P4.3怎么一会正常一会不正常的?

不过,想要实现你这个功能,我认为可以使用I/O口中断的上升沿/下降沿来唤醒检测,其他时候睡眠这样子。
检测不出来信号有可能是因为外部电平还没反应过来,切换I/O模式和输入使能后,需要加点延时 ,让电路反应一下。
可以尝试在程序的一些关键节点加上延时再试试
页: [1]
查看完整版本: 低功耗关闭数字输入功能后,上电后不正常