OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4703|回复: 22

stm8的halt模式,是不是会影响万年历的精度

[复制链接]

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
发表于 2017-2-28 17:07:00 | 显示全部楼层 |阅读模式
1金钱
最近公司在做周期唤醒的功能,要求用户设置时间,然后产品就可以按照一定的时间每天或者每周定时唤醒。平时都是处于halt状态(或低功耗),把LSI二分频作为RTC时钟源,然后把唤醒时钟的分频器设为16分频。38k/2=19K   19K/16=1.8187KHz

我把RTC时钟启动之后就开启中断,然后设置16位唤醒自动装载寄存器,然后设置万年历的年月日时分秒。然后在一个while循环里点灯。通过外部按
键中断触发halt()模式,触发时以灭灯作标志。在进入halt模式之后再次唤醒时,发现RTC时钟比原来的时间慢了。我设置休眠唤醒的时间是17秒左右这是怎么回事?是不是在halt模式下,会影响万年历的精度?

最佳答案

查看完整内容[请看2#楼]

不会马上执行,只有halt之后才开始计时,到了时间之后就唤醒
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-2-28 17:07:01 | 显示全部楼层
aouwen 发表于 2017-3-14 11:40
RTC_WakeUpCmd(ENABLE);
这句话是不是一执行就开始计时?
每次从休眠模式被这个唤醒的话,如果不用RTC_W ...

不会马上执行,只有halt之后才开始计时,到了时间之后就唤醒
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-2-28 17:07:25 | 显示全部楼层
听说这里发帖原子哥会第一时间回复
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-2-28 17:08:01 | 显示全部楼层
本人菜鸟啊,有错误请指出
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-2-28 17:11:53 | 显示全部楼层
用的是LSI,跟这个有关系吗?
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-2-28 17:12:20 | 显示全部楼层
有人说用LSE会更准
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-2-28 17:12:54 | 显示全部楼层
板子是stmL051FramF3
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-28 21:36:39 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-1 09:39:26 | 显示全部楼层
LSE肯定更好,即使这样,RTC也是一直运行的,时钟不会变得,
可以试试,不用外部中断触发,一直运行,看看万年历误差大不大
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-1 09:48:14 | 显示全部楼层

原子哥,我这个思路是否错了?
我昨晚运行一晚,没有休眠,结果误差有7个小时。
目的就是根据主控芯片发过来的时间定时唤醒,时间可能是一天或者一个星期,一个月。单纯用定时唤醒功能肯定不行,但是现在只想到这个方法
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-1 09:48:54 | 显示全部楼层
fankai 发表于 2017-3-1 09:39
LSE肯定更好,即使这样,RTC也是一直运行的,时钟不会变得,
可以试试,不用外部中断触发,一直运行,看看 ...

太大了,就算不中断。运行一晚也是差了几个小时啊
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-1 15:45:38 | 显示全部楼层
aouwen 发表于 2017-3-1 09:48
太大了,就算不中断。运行一晚也是差了几个小时啊

一晚几个小时,累积时间越来越大,那就是周期不是预设那样(比如1秒)1、贴程序吧,看看RTC配置是不是有疏忽
2、换成LSE试试,LSI受影响比较多,我之前用HSI主时钟,延时的时候都不准,算出来的参数就不行,最后拿示波器测得,才设定的实际的参数



回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-1 15:55:26 | 显示全部楼层
aouwen 发表于 2017-3-1 09:48
原子哥,我这个思路是否错了?
我昨晚运行一晚,没有休眠,结果误差有7个小时。
目的就是根据主控芯片 ...

按照你的描述,唤醒时间是不确定的,有可能1天,一周,一个月,我做过周期唤醒,几十秒,几分钟的,发现的问题是,你不能随意调整时间,也就是下面23750,如果不断电的话,重新设置这个时间没有效果,必须断电才行,如果想定时不同的休眠时间,可以设定一个基准的唤醒时间,比如1个小时,进入中断之后再  time自增,达到要求(比如一天24小时)再处理其他,没有达到就继续休眠,这样可以设定不同的休眠时间,但本质上还是休眠1个小时,只是累加起来
你可以再试试,先休眠比较短的时间,然后修改唤醒时间,看看是否有效,期待你的结论,让我了解下原因是啥


CLK_LSICmd(ENABLE);                                                                //打开LSI时钟
while(!CLK_GetFlagStatus(CLK_FLAG_LSIRDY));                                //等待LSI稳定
RTC_WakeUpCmd(DISABLE);        //关闭自动唤醒
CLK_PeripheralClockConfig(CLK_Peripheral_RTC,ENABLE);                //打开RTC时钟
CLK_RTCClockConfig(CLK_RTCCLKSource_LSI,CLK_RTCCLKDiv_1);        //RTC时钟1分频,38k
RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);                //配置wakeup的时钟,16分频,每次计数周期  1/38k * 16 = 0.421ms
RTC_SetWakeUpCounter(23750);                                                  //10s


//设置PWR模式
PWR_FastWakeUpCmd(ENABLE);                                                        //快速唤醒使能
PWR_UltraLowPowerCmd(ENABLE);                                                //超低功耗使能
       
//RTC中断配置
RTC_ITConfig(RTC_IT_WUT,ENABLE);                                                //使能唤醒中断
//开始配置RTC       
RTC_WakeUpCmd(ENABLE);                                                                //打开唤醒功能,进入halt会自动开始计数

回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-10 20:09:16 | 显示全部楼层
fankai 发表于 2017-3-1 15:55
按照你的描述,唤醒时间是不确定的,有可能1天,一周,一个月,我做过周期唤醒,几十秒,几分钟的,发现 ...

你好,想请教你一个问题。你用的唤醒寄存器是rtc的16位自动装载寄存器吗?
这个寄存器当从halt唤醒之后,下一次要用的时候直接使能就行了吗?假如第二次用的唤醒时间跟第一次不一样也是,按下面这两步就行了吗?
RTC_SetWakeUpCounter(23750);
RTC_WakeUpCmd(ENABLE);  
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-10 21:40:03 | 显示全部楼层
aouwen 发表于 2017-3-10 20:09
你好,想请教你一个问题。你用的唤醒寄存器是rtc的16位自动装载寄存器吗?
这个寄存器当从halt唤醒之后 ...

1、你如果想周期唤醒,那配置完RTC唤醒相关的之后,就要使能RTC唤醒功能,你进入halt之后,又开始计时,时间到了,再次唤醒,不用每次都配置RTC_WakeUpCmd(ENABLE);
2、唤醒之后,如果希望更改休眠时间,你那两个语句可以啊,但在之前一定要关闭RTC唤醒也就是RTC_WakeUpCmd(DISABLE); 否则重新设置的时间无效
3、我看了下手册,没有你说的16位自动装载寄存器啊,你指的是唤醒时间设置的那个寄存器?WUTRH和WUTRL

回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-13 11:31:10 | 显示全部楼层
fankai 发表于 2017-3-10 21:40
1、你如果想周期唤醒,那配置完RTC唤醒相关的之后,就要使能RTC唤醒功能,你进入halt之后,又开始计时, ...

想问一下,回复怎么回复图片?每次都要重新在帖子上面上传图片,好麻烦。
自动装载计数器我上传了一个图片,你看看是不是你说的那个
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-13 11:32:19 | 显示全部楼层
rtc原理图
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-13 11:33:06 | 显示全部楼层
aouwen 发表于 2017-3-13 11:31
想问一下,回复怎么回复图片?每次都要重新在帖子上面上传图片,好麻烦。
自动装载计数器我上传了一个图 ...

刚刚发现了,高级模式
rtc.png
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-13 11:34:14 | 显示全部楼层
fankai 发表于 2017-3-10 21:40
1、你如果想周期唤醒,那配置完RTC唤醒相关的之后,就要使能RTC唤醒功能,你进入halt之后,又开始计时, ...

就是这个图

rtc

rtc

回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2017-3-13 14:52:20 | 显示全部楼层
帮顶
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-14 10:48:42 | 显示全部楼层
fankai 发表于 2017-3-1 15:55
按照你的描述,唤醒时间是不确定的,有可能1天,一周,一个月,我做过周期唤醒,几十秒,几分钟的,发现 ...

配置.png 请问你之前周期唤醒的问题决解了吗?我发现这里有句话,可能是你要的答案。就是第二句,轮询WUTWF位直到RTC_ISR1被设置
我看了一下解释,好像这个位被置位才可以允许被更新 wutf.png
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-14 11:21:57 | 显示全部楼层
本帖最后由 fankai 于 2017-3-14 11:26 编辑
aouwen 发表于 2017-3-14 10:48
请问你之前周期唤醒的问题决解了吗?我发现这里有句话,可能是你要的答案。就是第二句,轮询WUTWF位直到R ...

我没看具体寄存器的事,在更新之前,禁用自动唤醒就行了,库函数里面禁用自动唤醒,也是操作的这个寄存柜,CR2位,你说的哪个自动预装载  就是设置休眠时间的那个吧,分成高8位和低8位
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2017-2-4
在线时间
33 小时
 楼主| 发表于 2017-3-14 11:40:30 | 显示全部楼层
fankai 发表于 2017-3-14 11:21
我没看具体寄存器的事,在更新之前,禁用自动唤醒就行了,库函数里面禁用自动唤醒,也是操作的这个寄存柜 ...

RTC_WakeUpCmd(ENABLE);
这句话是不是一执行就开始计时?
每次从休眠模式被这个唤醒的话,如果不用RTC_WakeUpCmd(DISABLE);就会重新计时,到时间就中断?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 00:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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