掉电唤醒定时器请教
请教下,芯片:STC81H1K08 TSSOP20
应用:
掉电模式下,1,设置INT1 上升下降沿触发退出唤醒,2,唤醒定时器10多秒退出唤醒。
现在2个都能正常唤醒。但当INT1唤醒后,再进入掉电模式,必须等唤醒定时器唤醒一次后,才能唤醒。
如果取消唤醒定时器唤醒,则INT1唤醒正常。
不明白哪里出错,我尝试过唤醒定时器在唤醒后赋值0X00也不行。附上该部分代码帮忙指点下,谢谢。
// P33 (INT1)DC_IN:Raising edge
IT1 = 0; //使能INT1上升沿和下降沿中断
// IT1 = 1; //使能INT1下降沿中断
EX1 = 1; //使能INT1中断
// P36(INT2) Sensor_In
INTCLKO |= EX2; //使能INT2下降沿中断
// P37 (INT3)Signal_In
INTCLKO |= EX3; //使能INT3下降沿中断
// P30(INT4)
// INTCLKO |= EX4; //使能INT4下降沿中断
//P30(RXD)
EA = 1;
//WakeUp Timer
// WKTCL = 0xff; //设定掉电唤醒时钟约为1秒钟
// WKTCH = 0x87;
WKTCL = 0xf0; //设定掉电唤醒时钟约为16秒钟
WKTCH = 0xff;
PCON = 0x02; //MCU进入掉电模式
_nop_(); //掉电模式被唤醒后,MCU首先会执行此语句
//然后再进入中断服务程序
_nop_();
_nop_();
_nop_();
//wakeup
Pin_Test_o= 1;
// WKTCH = 0x00; //disable Wakeup Timer
下图中,黄色低电平表示进入掉电模式,为高表示唤醒。
蓝色表示INT1脚的电平。
当定时唤醒后,再进入掉电模式,第一次的INT1脚上升沿可以触发,退出唤醒模式,再次进入掉电模式后,后面2次不能唤醒。
等第2次的定时唤醒后,再进入掉电模式,第一次的INT1脚上升沿可以触发。
不明白为什么会这样。
如果取消掉电唤醒定时器,那INT1每次都可以唤醒。 我刚在STC8H芯片上测了一下是正常的。
示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
示波器蓝线连接INT1脚,按一次INT1按键拉低一次电平。
通过示波器观察,MCU进休眠后每次按下INT1按键都能唤醒MCU。
附件是测试例程,请参考。
乘风飞扬 发表于 2023-5-12 10:23
我刚在STC8H芯片上测了一下是正常的。
示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
示 ...
非常感谢,等下回去后看看哪里不同,谢谢。{:4_196:} 能贴完整的程序吗?
睡眠唤醒都简单,每个唤醒源都是独立的,互不相干。 参考了乘风飞扬的程序,现在可以了。如果 掉电唤醒定时 只在初始化时设置一次,功能正常。
而我之前的程序,在每次进入掉电模式之前都有设置一次,导致不正常。
梁工 发表于 2023-5-12 11:09
能贴完整的程序吗?
睡眠唤醒都简单,每个唤醒源都是独立的,互不相干。 ...
现在可以了,但这里奇怪的是,我每次进掉电模式会重新设置掉电定时唤醒,这样就会导致问题。如果只在上电时初始化一次,则正常。
乘风飞扬 发表于 2023-5-12 10:23
我刚在STC8H芯片上测了一下是正常的。
示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
示 ...
现在可以了,问题在于我每次进掉电模式都设置了掉电唤醒定时器一次,可以看我帖子里程序截图。
你可以试试象我那样,每次进入掉电模式时设置掉电唤醒定时器一次,看看是不是同我测试一样。谢谢。 STC_STC 发表于 2023-5-12 11:50
现在可以了,问题在于我每次进掉电模式都设置了掉电唤醒定时器一次,可以看我帖子里程序截图。
你可以试 ...
我都是每次进掉电模式前都设置掉电唤醒定时器,没有问题。
#define MAIN_Fosc 11059200L //定义主时钟
#include "..\..\STC8Hxxx.h"
/************* 本地函数声明 **************/
void delay_ms(u8 ms);
void SetWakeUpTime(u16 SetTime);
//========================================================================
// 函数: void main(void)
// 描述: 主函数.
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-25
// 备注:
//========================================================================
void main(void)
{
//IO口设置, 用户可根据自己具体情况设置
P0M1 = 0x00; P0M0 = 0x00; //P0设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //P1设置为准双向口
P2M1 = 0x00; P2M0 = 0x00; //P2设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //P3设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //P4设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //P5设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //P6设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //P7设置为准双向口
while(1)
{
SetWakeUpTime((3000 * 2048L) / 1000); //定时值 n = T * (Fwkt/16) / 1000, T单位为ms, 最大值16000.
PCON |= 0x02; //Sleep
_nop_();
_nop_();
_nop_();
_nop_();
P32 = 0; //点亮一个LED指示醒来
delay_ms(10); //delay 10 ms
P32 = 1; //灭LED
}
}
//========================================================================
// 函数: void SetWakeUpTime(u16 SetTime)
// 描述: 唤醒定时器设置时间值函数。
// 参数: SetTime: 要设置的时间值(睡眠的时间), 单位为ms.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-25
// 备注:
//========================================================================
void SetWakeUpTime(u16 SetTime)
{
if(SetTime > 0) SetTime--;
WKTCL = (u8)SetTime;
WKTCH = (u8)(SetTime >> 8) | 0x80;
}
//========================================================================
// 函数: voiddelay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-25
// 备注:
//========================================================================
voiddelay_ms(u8 ms)
{
u16 i;
do
{
i = MAIN_Fosc / 10000L;
while(--i) ;
}while(--ms);
}
页:
[1]
2