请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
楼主: slf***

STC的掉电唤醒定时器设计很独特

[复制链接]

该用户从未签到

45

主题

2836

回帖

6376

积分

超级版主

积分
6376
发表于 2023-2-16 13:24:58 | 显示全部楼层
没有专门的寄存器提示触发唤醒源是哪个。
如果是外中断唤醒,则可以在中断中设置标志。串口中断唤醒也可以设置标志。但是唤醒定时器唤醒没有标志。

该用户从未签到

5

主题

21

回帖

112

积分

注册会员

积分
112
发表于 2023-2-16 16:13:06 | 显示全部楼层
梁工 发表于 2023-2-15 16:11
WKTCH 和 WKTCL 是特殊功能寄存器,直接读取即可。
比如:i=WKTCH;j = WKTCL;

你好,我用你的方式实践了一下,依然不行,我把代码放入附件。大佬请明示!

test.zip

67.36 KB, 下载次数: 19

该用户从未签到

45

主题

2836

回帖

6376

积分

超级版主

积分
6376
发表于 2023-2-16 23:37:48 | 显示全部楼层
请直接下载“09-唤醒定时器唤醒-INT0提前唤醒读唤醒定时器模拟串口返回”里的HEX文件测试。


/*************        功能说明        **************
演示唤醒定时器和INT0对MCU唤醒。
从串口输出结果(ASCII),9600,8,N,1.
唤醒后返回此时唤醒定时器的值.
******************************************/


唤醒监控截图.JPG STC8G系列-电源管理-时钟-睡眠-唤醒相关程序.rar (460.38 KB, 下载次数: 46)

回复 支持 1 反对 0 送花

使用道具 举报

该用户从未签到

5

主题

21

回帖

112

积分

注册会员

积分
112
发表于 2023-2-19 17:12:44 | 显示全部楼层
梁工 发表于 2023-2-16 23:37
请直接下载“09-唤醒定时器唤醒-INT0提前唤醒读唤醒定时器模拟串口返回”里的HEX文件测试。

谢谢您,梁工,我看到压缩包的东西非常详细,我想整个相关资料下载下来,请问这个资源的来源在哪里?还是内部资料呢?

点评

这是我自个写的例程。  详情 回复 发表于 2023-2-19 20:31

该用户从未签到

45

主题

2836

回帖

6376

积分

超级版主

积分
6376
发表于 2023-2-19 20:31:38 | 显示全部楼层
wsr2580 发表于 2023-2-19 17:12
谢谢您,梁工,我看到压缩包的东西非常详细,我想整个相关资料下载下来,请问这个资源的来源在哪里?还是 ...

这是我自个写的例程。

该用户从未签到

5

主题

21

回帖

112

积分

注册会员

积分
112
发表于 2023-2-20 14:31:50 | 显示全部楼层
本帖最后由 wsr2580 于 2023-2-20 14:44 编辑
梁工 发表于 2023-2-19 20:31
这是我自个写的例程。

谢谢梁工,我正在实践你给的项目。其中,我还有个问题场景,我上面所说的从串口中断中触发唤醒如何让MCU知道是串口中断。
您提到了:串口中断唤醒也可以设置标志。但是唤醒定时器唤醒没有标志。
我不理解这个回答的意思。为了节约您的时间,我再复述一下我的需求:1. 就是因为串口唤醒的时候我不知道如何让代码知道是串口唤醒还是由唤醒定时器唤醒的。

请看我使用的芯片的唤醒位置:

1.png

2. 如果我用两个串口,我如何知道是哪个串口?

再想问你一个问题,因为我一般使用的ESP32系列由串口唤醒是通过几个连续的串口下降沿(会丢一部分数据),3. 我不知道这里的芯片是怎么检测串口进行唤醒的,会不会丢数据,在手册中也没有看到。

你的意思是不是虽然串口唤醒时不会进入串口中断,但是一旦接受1字节数据就能进入中断,可以从这个中断获得状态?
如果是这样,我每次在进入睡眠的时候将一个全局的标志位设置后,在中断中就可以检测到这个标志位,清空标志位可以在进入睡眠函数之后一行。是这个意思吗?那么第2个问题就可以设置标志位的不同值即可。

谢谢梁工!敬颂商祺!

点评

唤醒定时器唤醒没有标志,但串口唤醒后,会启动串口接收,等待收到一个字节,就会进入串口中断(要允许中断),在中断中设置标志即可。关键是,唤醒后要等待超过接收一个字节的时间,才会知道是否串口唤醒。 也可以  详情 回复 发表于 2023-2-20 16:20

该用户从未签到

5

主题

21

回帖

112

积分

注册会员

积分
112
发表于 2023-2-20 15:33:51 | 显示全部楼层
本帖最后由 wsr2580 于 2023-2-20 15:35 编辑

我找到我这里出现的问题了,因为C51架构使用的是大端模式存放数据,但是我常用的ESP32、STM32是小端模式;大小端模式除了EEPROM等存储默认会是该端序以外,还会影响判断。
大端模式正确的获取数据并进行比较的程序应该是:
  1.         char wktcl, wktch;
  2.         // ...
  3.         wktcl = WKTCL;
  4.         wktch = WKTCH & 0x7f;  // 这个要与0x7f,是个坑,要看参考手册
  5.         printf("%c %c", wktcl, Hex2Char(wktcl >> 4));
  6.         printf("%c", Hex2Char(wktcl));
  7.         printf("%c %c", wktch, Hex2Char(wktch >> 4));
  8.         printf("%c", Hex2Char(wktch));
  9.         if(wktcl == (char)255 && wktch == (char)127) {
  10.             P55 = ~P55;  // 此时LED灯能闪烁
  11.         }
复制代码

点评

大小端模式只是存储顺序不同,在C语言编程中,是无关大小端的,要自行做数据处理。  详情 回复 发表于 2023-2-20 16:22

该用户从未签到

45

主题

2836

回帖

6376

积分

超级版主

积分
6376
发表于 2023-2-20 16:20:19 | 显示全部楼层
wsr2580 发表于 2023-2-20 14:31
谢谢梁工,我正在实践你给的项目。其中,我还有个问题场景,我上面所说的从串口中断中触发唤醒如何让MCU知 ...

唤醒定时器唤醒没有标志,但串口唤醒后,会启动串口接收,等待收到一个字节,就会进入串口中断(要允许中断),在中断中设置标志即可。关键是,唤醒后要等待超过接收一个字节的时间,才会知道是否串口唤醒。
也可以唤醒后读取唤醒定时器的值,如果不是7FFF,则不是唤醒定时器唤醒,是别的唤醒源唤醒。

该用户从未签到

45

主题

2836

回帖

6376

积分

超级版主

积分
6376
发表于 2023-2-20 16:22:00 | 显示全部楼层
wsr2580 发表于 2023-2-20 15:33
我找到我这里出现的问题了,因为C51架构使用的是大端模式存放数据,但是我常用的ESP32、STM32是小端模式; ...

大小端模式只是存储顺序不同,在C语言编程中,是无关大小端的,要自行做数据处理。

该用户从未签到

5

主题

21

回帖

112

积分

注册会员

积分
112
发表于 2023-2-24 10:31:00 | 显示全部楼层
梁工 发表于 2023-2-20 16:20
唤醒定时器唤醒没有标志,但串口唤醒后,会启动串口接收,等待收到一个字节,就会进入串口中断(要允许中 ...

那这个芯片会在串口唤醒时丢失数据吗?

点评

跑内部IRC时钟,唤醒时间大约80us左右,波特率小于等于2400,则串口唤醒能正确接收,不会丢数据。但是如果大于等于4800,则会影响接收。 如果跑外部晶振,则晶振起振时间有长有短,几百us至几ms不等,唤醒后直接接收  详情 回复 发表于 2023-2-24 11:48
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-4-18 11:47 , Processed in 0.069070 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表