tony_2024 发表于 2024-9-25 11:19:41

8G1K08A进入掉电模式下,电流还有10几mA | 已解决

各位大佬,帮忙看一下这段代码,为什么进入掉电模式下。电流还有10多mA的电流?

谢谢。





#define MAIN_Fosc                11059200UL      //定义主时钟
#define IDL             0x01                  //PCON.0
#define PD            0x02                  //PCON.1

#include      "STC8Gxxx.h"

/*************      本地变量声明      **************/

u16      pwm;                //pwm
bit      B_PWM_Dir;      //方向, 0为+, 1为-.
u8      cnt;

/*************      本地函数声明      **************/
void      UpdatePwm(u8 id, u16 pwm_value);      //id: PCA序号, 0~2对应 PCA0 ~ PCA2,pwm_value: pwm值, 这个值是输出低电平的时间.
void      PCA_config(u8 io, u8 clk, u8 wide);      // io: 选择IO, 0: P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2),   1: 选择P5.5(ECI) P3.1(CCP0) P3.3(CCP1) P5.4(CCP2), 2: P3.1(ECI) P3.2(CCP0) P3.3(CCP1) P5.5(CCP2)).
                                                                                        //clk: 选择时钟, 0: 12T,1: 2T, 2: Timer0溢出率, 3: ECI引脚输入, 4: 1T,5: 4T,6: 6T,7: 8T
                                                                                        //wide: pwm的宽度, 0: 8位PWM,1: 7位PWM,2: 6位PWM,3: 10位位PWM
void      PwmOutContinue(u8 id, u8 level);      // id: PCA序号, 0~2对应 PCA0 ~ PCA2,level: 连续输出的电平,0为低电平, 1为高电平.
void          delay_ms(u8 ms);

/******************** 主函数 **************************/
void main(void)
{

    IT0 = 0;                                    //使能INT0上升沿和下降沿中断
    EX0 = 1;                                    //使能INT0中断
    EA = 1;

      PCA_config(0, 4, 3);      //io=0:      选择P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2), clk=4: 选择时钟1T, 3: 10位PWM
      
      pwm = 128;
      B_PWM_Dir = 0;

      while (1)
      {
            if(P32)
                {

                        delay_ms(1);
      
                        if(B_PWM_Dir)
                        {
                              if(--pwm <= 8)                B_PWM_Dir = 0;
                        }
                        else
                        {
                              if(++pwm >= 1016)      B_PWM_Dir = 1;
                        }
                        UpdatePwm(PCA1, pwm);      //更新PWM.
                        UpdatePwm(PCA2, pwm);      //更新PWM.
                }
                else
                {
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();

                        PWM1_OUT_1();      //初始输出0
                        PWM2_OUT_1();      //初始输出0

                        _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
            //   PCON = IDL;                                 //MCU进入IDLE模式
                         PCON = PD;                                  //MCU进入掉电模式

                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                }
      }
}

void INT0_Isr() interrupt 0
{
   _nop_();
}

//========================================================================
// 函数: voiddelay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 版本: V1.0, 2016-5-10
// 备注:
//========================================================================
voiddelay_ms(u8 ms)
{
      u16 i;
      do
      {
                i = MAIN_Fosc / 10000;
                while(--i)      ;
      }while(--ms);
}



//========================================================================
// 函数: void      PCA_config(u8 io, u8 clk, u8 wide)
// 描述: PCA配置函数。
// 参数: io: 选择IO, 0: P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2),   1: 选择P5.5(ECI) P3.1(CCP0) P3.3(CCP1) P5.4(CCP2), 2: P3.1(ECI) P3.2(CCP0) P3.3(CCP1) P5.5(CCP2)).
//       clk: 选择时钟, 0: 12T,1: 2T, 2: Timer0溢出率, 3: ECI引脚输入, 4: 1T,5: 4T,6: 6T,7: 8T
//               wide: pwm的宽度, 0: 8位PWM,1: 7位PWM,2: 6位PWM,3: 10位位PWM
// 返回: none.
// 版本: VER1.0
// 版本: V1.0, 2016-5-10
// 备注:
//========================================================================
void      PCA_config(u8 io, u8 clk, u8 wide)
{
      CR = 0;   //停止PCA定时器

      CMOD = (CMOD & ~0x0E) | ((clk & 7) << 1);                // PCA时钟选择, 0: 12T,1: 2T, 2: Timer0溢出率, 3: ECI引脚输入, 4: 1T,5: 4T,6: 6T,7: 8T

      PCA1_PWM(wide);      //PWM宽度      0: 8位PWM,1: 7位PWM,2: 6位PWM,3: 10位PWM
      PCA2_PWM(wide);      //PWM宽度      0: 8位PWM,1: 7位PWM,2: 6位PWM,3: 10位PWM
      
      PWM1_OUT_0();      //初始输出0
      PWM2_OUT_0();      //初始输出0

      if(io == 1)
      {
                P_SW1 = (P_SW1 & ~0x30) | 0x10;      // 将PCA/PWM切换到 P5.5(ECI) P3.1(CCP0) P3.3(CCP1) P5.4(CCP2)
                P3n_push_pull(0x0a);      //头文件的宏, P3.1 P3.3设置为推挽输出
                P5n_push_pull(0x10);      //头文件的宏, P5.4设置为推挽输出
      }
      else if(io == 2)
      {
                P_SW1 = (P_SW1 & ~0x30) | 0x20;      // 将PCA/PWM切换到 P3.1(ECI) P3.2(CCP0) P3.3(CCP1) P5.5(CCP2)
                P3n_push_pull(0x0c);      //头文件的宏, P3.2 P3.3设置为推挽输出
                P5n_push_pull(0x20);      //头文件的宏, P5.5设置为推挽输出
      }
      else
      {
      //      P_SW1 = P_SW1 & ~0x30;      // 将PCA/PWM切换到 P5.5(ECI) P3.2(CCP0) P3.3(CCP1) P5.4(CCP2)
                P3n_push_pull(0x8c);      //头文件的宏, P3.3设置为推挽输出
                P5n_push_pull(0x10);      //头文件的宏, P5.4设置为推挽输出
      //      P5n_pure_input(bitn)    //头文件的宏, P3.2设置为高阻输入
      }

      CH = 0;
      CL = 0;
//      PPCA = 1;      // 高优先级中断
      CR   = 1;      // 运行PCA定时器
}



//========================================================================
// 函数: void PwmOutContinue(u8 id, u8 level)
// 描述: 设置PWM连续输出电平(高或低).
// 参数:    id: PCA序号, 0~2对应 PCA0 ~ PCA2
//               level: 连续输出的电平,0为低电平, 1为高电平.
// 返回: none.
// 版本: V1.0, 2018-5-10
//========================================================================
void      PwmOutContinue(u8 id, u8 level)
{
    if(id == 1)
      {
                if(level == 0)      PWM1_OUT_0();
                else                        PWM1_OUT_1();
      }
      else if(id == 2)
      {
                if(level == 0)      PWM2_OUT_0();
                else                        PWM2_OUT_1();
      }
}

//========================================================================
// 函数: void UpdatePwm(u8 id, u16 pwm_value)
// 描述: 更新PWM值.
// 参数:      id: PCA序号, 0~2对应 PCA0 ~ PCA2
//               pwm_value: pwm值, 这个值是输出低电平的时间.
// 返回: none.
// 版本: V1.0, 2018-5-10
//========================================================================
void      UpdatePwm(u8 id, u16 pwm_value)
{
      if(id == 1)
      {
                PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP1H = (u8)pwm_value;
      //      PWM1_NORMAL();
      }
      else if(id == 2)
      {
                PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP2H = (u8)pwm_value;
      //      PWM2_NORMAL();
      }
}

//========================================================================
// 函数: void      PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2016-5-10
//========================================================================
void      PCA_Handler (void) interrupt PCA_VECTOR
{

      if(CCF1)      //PCA模块1中断
      {
                CCF1 = 0;                //清PCA模块1中断标志
      }

      if(CCF2)      //PCA模块2中断
      {
                CCF2 = 0;                //清PCA模块1中断标志
      }

      if(CF)      //PCA溢出中断
      {
                CF = 0;                        //清PCA溢出中断标志
      }

}





DebugLab 发表于 2024-9-25 12:41:47

哪里的电流,如何测的,是单片机VCC的电流还是整个电路的电流

神农鼎 发表于 2024-9-25 15:06:34



https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4808&extra=page%3D1

晓飛飛 发表于 2024-9-25 17:19:48

U2也是有静态工作电流的,你拆了U2看看

tony_2024 发表于 2024-9-26 08:13:49

谢谢大家

tony_2024 发表于 2024-9-26 08:15:01

晓飛飛 发表于 2024-9-25 17:19
U2也是有静态工作电流的,你拆了U2看看

是这个电子件,没有开输入高阻。

tony_2024 发表于 2024-9-26 08:15:35

DebugLab 发表于 2024-9-25 12:41
哪里的电流,如何测的,是单片机VCC的电流还是整个电路的电流

整板的电流

soma 发表于 2024-9-26 08:39:52

可以分开一个一个测电流,就知道那个耗电了

tony_2024 发表于 2024-9-26 17:15:52

soma 发表于 2024-9-26 08:39
可以分开一个一个测电流,就知道那个耗电了

搞定了,谢谢大家
页: [1]
查看完整版本: 8G1K08A进入掉电模式下,电流还有10几mA | 已解决