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 & 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 & 0x01);
}
/******************** RTC中断函数 *********************/
void RTC_Isr() interrupt 36
{
if(RTCIF & 0x80) //闹钟中断
{
RTCIF &= ~0x80;
B_Alarm = 1;
}
if(RTCIF & 0x10) //分钟中断
{
RTCIF &= ~0x10;
B_1m = 1;
}
}
</code></pre>
初始化时:
打开EAXFR
正确设置IAP_TPS
初始化IO状态和模式
外接32768晶振,初始化时要启用该晶振并等待频率稳定 没看到你从那里进的睡眠模式啊0.0 还有你model_start 的内容呢0.0 _奶咖君_ 发表于 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_();
}
DebugLab 发表于 2025-1-19 15:09
初始化时:
打开EAXFR
正确设置IAP_TPS
可以的话烦请用类似的代码跑下帮忙看看是啥情况,感谢! desperado1 发表于 2025-1-20 15:48
代码大致如下:
void Module_Start(void)
从代码这里看,唤醒之后,没有能跳出Module_Start里面while(1) 循环的代码。。。你这里就变成了一直循环接收 Uart的数据判断数据了。。 _奶咖君_ 发表于 2025-1-20 16:00
从代码这里看,唤醒之后,没有能跳出Module_Start里面while(1) 循环的代码。。。你这里就变成了一直循环 ...
感谢!原来唤醒后还是接着掉电前的程序位置继续运行的,瞬间就懂了,再次感谢
页:
[1]