7989 发表于 2026-3-13 15:08:42

省电模式下电流8mA求助解决办法

单片机型号:AI8H2K32U。P2.3接的是5V给两个200K电阻分压,5V有时P2.3有2.5V,没有时单片机由CR2032供电。检测P2.3是否是低电平,P2.3低电平中断,在中断里开启掉电模式。CR2032电池供电时电流8mA,。实在找不到问题求帮助!


////////////////////////////////////////
// P2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT2_ISR(void) interrupt P2INT_VECTOR
{
    //<<AICUBE_USER_PORT2_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    uint8_t intf;

    intf = CheckP2nFlag(PIN_ALL);       //读取中断请求标志
    ClearP2nFlag(PIN_ALL);            //清除中断请求标志

        if(intf==0x08)   //判断是否是P2.3触发的中断
        {
                Powers();   //关闭所有输出
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                PCON|=0x02;                                //P2.3检测到低电平,MCU进入省电模式
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

        }
    //<<AICUBE_USER_PORT2_ISR_CODE1_END>>
}



void Powers(void)
{
        P0=0x00;P1=0x00;P2=0x00;P3=0x00;                       //IO口全输出低电平
        P0M0=0x00;P0M1=0xff;P1M0=0x00,P1M1=0xff;P2M0=0x00,P2M1=0xff;P3M0=0x00,P3M1=0xff;P5M0 = 0x00; P5M1 = 0xFF;//全高阻输入
        P0PU=0x00;P1PU=0x00;P2PU=0x00;P3PU=0x00;P5PU = 0x00;                 //禁止上拉
        P0NCS=0xff;P1NCS=0xff;P2NCS=0xff;P3NCS=0xff;   //禁止施密特触发器
        P0IE=0x00;P1IE=0x00;P2IE=0x00;P3IE=0x00;               //禁止数字输入
        IE=0x00;                //禁止所有中断
        TCON&=0xAF; AUXR&=0xEF;T4T3M&=0x77;         //定时器停止计数
        ADC_CONTR&=0x7F;//关闭ADC电源       
}


lcwswust 发表于 2026-3-13 15:51:11

有5V供电时,供电电流多少?
如果这句“PCON|=0x02”之前加一句死循环“while(1);”,即不让它进入掉电模式,电流是多少?
主频是多少?单片机手册中该主频对应的正常工作模式电流是多少?
P5没关闭数字输入吗?听说引脚高阻模式下可能会感应到信号或电压位于中间电平会引起较大的电流消耗。

神农鼎 发表于 2026-3-13 16:09:56

https://www.stcaimcu.com/thread-18720-1-1.html

wulin 发表于 2026-3-13 16:12:31

省电模式不单是MCU的事,外围电路也得精心设计。利用内部低压检测中断就能触发掉电模式,不必用2个电阻分压取样。下载程序时硬件选项有多种低压选择。另外ADC取样电路也存在同样问题。总之进入掉电模式必须关闭所有可能耗电的内部开关和外部硬件电流通路才能达到目的。

7989 发表于 2026-3-13 22:43:29

lcwswust 发表于 2026-3-13 15:51
有5V供电时,供电电流多少?
如果这句“PCON|=0x02”之前加一句死循环“while(1);”,即不让它进入掉电模式 ...

在把外围电路全部断开,只接USB的情况下,执行Powers();   //关闭所有输出代码后6.1mA,
没有执行Powers();测电流8mA,
外围电路都接上是接近11mA, 用了硬件SPI功能,执行Powers();代码后 TFT屏的 RES和BLK,还是有电流,接近3mA,
在外为什么也不接,电容电阻全断开只给单片机供电时,且有烧录程序时,最低6.1mA,
烧写https://www.stcaimcu.com/thread-18720-1-1.html省电模式代码,电流不足1mA,
怀疑省电模式没开起来,但是把P2.3的电阻断开,P2.3低电平时,SPI不工作,TFT无显示,说明进省电模式了。
现在怎么找不到原因了!!!!

7989 发表于 2026-3-14 10:20:56

lcwswust 发表于 2026-3-13 15:51
有5V供电时,供电电流多少?
如果这句“PCON|=0x02”之前加一句死循环“while(1);”,即不让它进入掉电模式 ...

又仔细测试,用P2.3检测低电平,我这样分压检测的更不行,要短接到低,才能触发P2.3==0;然后触发了,P2.3==0;然后PCON|=0x02;执行后也没有进入省电模式,程序一样在跑! 用PCON=PD,也不行 不自动是为什么!!!

lcwswust 发表于 2026-3-14 10:59:33

7989 发表于 2026-3-14 10:20
又仔细测试,用P2.3检测低电平,我这样分压检测的更不行,要短接到低,才能触发P2.3==0;然后触发了,P2. ...

这样吧,先关闭引脚中断,直接在主循环里进入掉电模式试试。
有可能中断一直在发生,所以不断唤醒。
我不太了解在中断里进掉电模式是否有问题,由于进掉电模式时还在中断里,担心下次中断不能进入而不能唤醒。

7989 发表于 2026-3-14 11:09:21

lcwswust 发表于 2026-3-14 10:59
这样吧,先关闭引脚中断,直接在主循环里进入掉电模式试试。
有可能中断一直在发生,所以不断唤醒。
我不 ...

void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
       
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
        P_SW2|=0x80;
                IRCDB=0x10;IAP_TPS=24;      //掉电定时器频率
                WKTCL = 0x7F;   WKTCH = 0xFE; //启动掉电唤醒定时器并给最大值16唤醒一次
       
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      USBLIB_OUT_Done();            //查询方式处理USB接收的数据

      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
                printf_usb("省电模式");       
                delay_ms(1000);
                PCON=PD;
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}
这是单独建立的新工程,只开了时钟和查询方式的USB-CDC, 代码也就只写了这个掉电唤醒和省电模式。还是进不了,打印窗口还是1秒打印一次!
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
       
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
//        P_SW2|=0x80;
//                IRCDB=0x10;IAP_TPS=24;      //掉电定时器频率
//                WKTCL = 0x7F;   WKTCH = 0xFE; //启动掉电唤醒定时器并给最大值16唤醒一次
       
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      USBLIB_OUT_Done();            //查询方式处理USB接收的数据

      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
                printf_usb("省电模式");       
                delay_ms(1000);
                PCON=PD;
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}
最后掉电唤醒也注释了,还是进不了省电模式!这省电模式拿到部分AI8H2K32单片机才有?

lcwswust 发表于 2026-3-14 11:17:13

7989 发表于 2026-3-14 11:09
void main(void)
{
    //

USB我不了解,它应该也是比较费电的,即便没有数据发送,接口上也是不断有数据(token)传输的,建议不要用USB,而是用串口。
不要连接USB口。

7989 发表于 2026-3-14 18:23:29

lcwswust 发表于 2026-3-14 11:17
USB我不了解,它应该也是比较费电的,即便没有数据发送,接口上也是不断有数据(token)传输的,建议不要用U ...

终于弄好了,用USB不论是中断还是查询都不能进省电模式,还有程序里的中断都要用最低优先级,IO口不要用准双向模式,准双向的IO口特别容易被干扰,IO口没有开中断及唤醒,都会莫名其妙的换醒省电模式,基本就开启不了省电模式。 现在还是这个硬件电路,CR2302的电池供电也就2.2uA, 设置了掉电唤醒定时器,16秒唤醒一次,这个电池应该可以待机一两年了。谢谢你解惑{:baoquan:}
页: [1] 2
查看完整版本: 省电模式下电流8mA求助解决办法