desperado1 发表于 2025-1-18 20:06:23

8H8K64U使用内部RTC唤醒后不能正常工作

<p>供电电压2.1V--3.3V<br />
使用内部RTC设置1分钟后唤醒,在进入掉电模式后的功耗在1.5uA--4.5uA一般在1分27秒左右会从掉电模式唤醒,此时功耗大概在3.7mA左右,但此时设置的IO口好像不能正常工作,比如不能通过高电平使能升压电路,如果断开供电后再重新供电,会进入Module_Start(),但从掉电唤醒后就不能进入Module_Start()</p>
<pre><code>void main()
{
        P_SW2|=0x80;        //扩展寄存器(XFR)访问使能
        P1M0 = 0xc0; P1M1 = 0x38; //p1.3p1.4p1.5高阻输入,p1.6p1.7推挽输出,其它准双向口
        P3M0 = 0x00; P3M1 = 0xf0; //p3.4p3.5p3.6p3.7高阻,其它双向
        P5M0 = 0Xff;P5M1 = 0X00; //设置P5口为准双向口
        P1IE = 0xff;P3IE = 0xff; //开启P1和P3的数字输入
        RTC_config();                //RTC初始化

        /* 系统初始化设置 */
        UartInit();                 //串口初始化 波特率115200
        ADC_Init();

        EA = 1;   //打开总中断
        Module_Start();

        while(1)
        {
                if(B_1m)
                {
                        B_1m = 0;
                        Module_Start();//给模组供电并开机,上传遥测数据
                }

                if(B_Alarm)
                {
                        B_Alarm = 0;
                        Module_Start();//给模组供电并开机,上传遥测数据
                }

       }

}
/****RTC初始化函数**/
void RTC_config(void)
{
    INIYEAR = 25;   //Y:2021
    INIMONTH = 1;    //M:12
    INIDAY = 14;      //D:31
    INIHOUR = 23;   //H:23
    INIMIN = 59;      //M:59
    INISEC = 50;      //S:50
    INISSEC = 0;      //S/128:0

    ALAHOUR = 21;        //闹钟小时
    ALAMIN= 32;        //闹钟分钟
    ALASEC= 0;        //闹钟秒
    ALASSEC = 0;        //闹钟1/128秒

    IRC32KCR = 0x80;   //启动内部32K晶振.

                while (!(IRC32KCR &amp; 0x01));//等待时钟稳定
    RTCCFG |= 0x02;

    RTCIF = 0x00;   //清中断标志
    RTCIEN = 0x90;    //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
    RTCCR = 0x01;   //RTC使能

    while(RTCCFG &amp; 0x01);
}

/******************** RTC中断函数 *********************/
void RTC_Isr() interrupt 36
{
        if(RTCIF &amp; 0x80)    //闹钟中断
        {
                RTCIF &amp;= ~0x80;
                B_Alarm = 1;
        }

        if(RTCIF &amp; 0x10)    //分钟中断
        {
                RTCIF &amp;= ~0x10;
                B_1m = 1;
        }
}
</code></pre>

DebugLab 发表于 2025-1-19 15:09:02

初始化时:
打开EAXFR
正确设置IAP_TPS
初始化IO状态和模式
外接32768晶振,初始化时要启用该晶振并等待频率稳定

_奶咖君_ 发表于 2025-1-20 13:19:27

没看到你从那里进的睡眠模式啊0.0 还有你model_start 的内容呢0.0

desperado1 发表于 2025-1-20 15:48:58

_奶咖君_ 发表于 2025-1-20 13:19
没看到你从那里进的睡眠模式啊0.0 还有你model_start 的内容呢0.0

代码大致如下:

void Module_Start(void)
{
        P1IE = 0xff;P3IE = 0xff; //开启P1和P3的数字输入
        P17 = 1;        //使能升压模块
        P16 = 1;        //给模组开机
        delay_ms(7);
        P35 = 1;        //给传感器供电
        Vcc();         //获取VCC值
        POWER(); //获取电源值

       
        Voltage = Voltage - v_min;
        while(1)
        {               
                received_byte = UART_ReceiveByte();        //接收单个字节
                if(received_byte == 0x11)        //如果收到串口发送来的消息给模组关机
                {
                        received_byte = 0x00;
                        Gpio_Set();

                }
                // 如果接收到 0x22
                else if (received_byte == 0x22)
                {
                        received_byte = 0x00;
                        handle_alert_flags();// 处理标志位并上传遥测数据
                }
       
        }
}

void Gpio_Set(void)
{
       
        P1M0 = 0xc0; P1M1 = 0x38;
        P3M0 = 0x00; P3M1 = 0xf0;
        P5M0 = 0Xff; P5M1 = 0X00;       

        P10 = 0;
        P11 = 0;
        P12 = 0;
        P13 = 0;
        P14 = 0;
        P15 = 0;
        P16 = 0;
        P17 = 0;
       
        P30 = 0;
        P31 = 0;
        P32 = 0;
        P33 = 0;
        P34 = 0;
        P35 = 0;
        P36 = 0;
        P37 = 0;
        P1IE = 0x00; P3IE = 0x00;         P5IE = 0x00;        //关闭P1、p5和P3的数字输入
        _nop_();_nop_();_nop_();_nop_();_nop_();
        PCON |= 0x02;
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
}

desperado1 发表于 2025-1-20 15:53:14

DebugLab 发表于 2025-1-19 15:09
初始化时:
打开EAXFR
正确设置IAP_TPS


可以的话烦请用类似的代码跑下帮忙看看是啥情况,感谢!

_奶咖君_ 发表于 2025-1-20 16:00:06

desperado1 发表于 2025-1-20 15:48
代码大致如下:

void Module_Start(void)


从代码这里看,唤醒之后,没有能跳出Module_Start里面while(1) 循环的代码。。。你这里就变成了一直循环接收 Uart的数据判断数据了。。

desperado1 发表于 2025-1-20 16:23:58

_奶咖君_ 发表于 2025-1-20 16:00
从代码这里看,唤醒之后,没有能跳出Module_Start里面while(1) 循环的代码。。。你这里就变成了一直循环 ...

感谢!原来唤醒后还是接着掉电前的程序位置继续运行的,瞬间就懂了,再次感谢
页: [1]
查看完整版本: 8H8K64U使用内部RTC唤醒后不能正常工作