rtc 时间在软件复位或者看么狗复位后的问题

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
JeHa_3912621
Level 3
Level 3
25 replies posted 10 replies posted 10 questions asked

cypress,您好!  请教一个关于rtc的问题。

1.我发现我的rtc时钟根据例子,在启动后会被初始化为默认值。 但是如果我想在软件复位或者看门狗复位的情况下,不让我的rtc时钟重新初始化。这样是否能够实现?如何实现?

2.我有一部分数据想保存在SRAM中,软件复位或者看门狗复位都不会被初始化,类似于stm32的静态SRAM。这个我看是可以实现的,但是我找不到相应的例程。能够提供帮助?

3.如果以上两个问题,我这里增加了bootloader程序。也就是如果我的app1看门狗复位了。 我还想保持rtc时钟继续跑,不被更新,另外我的一部分SRAM中保存的数据不被初始化。这个能否实现?如何实现?

以上请帮忙,非常感谢!!

0 点赞
1 解答
ShipingW_81
Moderator
Moderator
Moderator
500 replies posted 250 solutions authored 250 replies posted

注意到在DFU project的linker文件中在ram_commom内定义了一个段 -

/* DFU SDK specific */

    /* The noinit section, used across all the applications */

    .cy_boot_noinit (NOLOAD) :

    {

        KEEP(*(.cy_boot_noinit));

    } > ram_common

实际上.cy_boot_noinit 的长度就是整个ram_commom的长度,ram_common和.cy_boot_noinit 在app0和app1 linker文件中都有定义,地址和长度也一样,除了在这个段的最后一个字节存放了appId,其余部分应该是空的,这个段或许可以用来存放你所说的数据,你可以验证一下。

在原帖中查看解决方案

0 点赞
6 回复数
ShipingW_81
Moderator
Moderator
Moderator
500 replies posted 250 solutions authored 250 replies posted

1. 建议Backup Domain由外部独立电源VBACKUP供电,独立于VDDD,RTC由WCO提供时钟,在PSoC Creator GUI中选择vBackup Source为Dedicated Supply,这样只要保证VBACKUP不掉电,RTC就一直运行。如果Backup Domain电源来自VDDD,就没有办法保证复位时RTC还在运行。

2. 这些数据的定义处使用 CY_NOINIT 关键词声明一下这些变量,这样这些变量会被定义到 SRAM 的 no_init section 里,软件复位后就不会被覆盖了。

3. 参考以上回答。

0 点赞

定义CY_NOINIT,我试了一下。 在多app的情况下,还是会被清零。 我怀疑是我的app0对于这部分做了重新初始化。 能否告知如果在多个app的情况下,如何确保我的CY_NOINIT定义的数据不丢失?   我的理解是两个app定义相同的CY_NOINIT内存地址。 但是我不知道这个该如何设置!

我的dfu_cm0p.ld的SRAM配置如下:

pastedImage_0.png

0 点赞
ShipingW_81
Moderator
Moderator
Moderator
500 replies posted 250 solutions authored 250 replies posted

你可以在app1中尝试把数据放到eeprom里面,app0如果对eeprom没有操作的话,eeprom中保存的数据经过reset不会丢失。

0 点赞

您好。 因为这个数据我会频繁的更新。 所以用EEPROM不太合适。 另外EERPOM掉电后还会保持,我如果用来判别rtc时间误判。 我的想法是启动后先读取RTC备份RAM的数值,如果有数值,我的RTC就不初始化,认为是看门够复位或者软件复位。这样时间会继续跑。 如果RTC备份RAM的数值被清零。 认为是掉电复位。重新初始化RTC时钟。

0 点赞
ShipingW_81
Moderator
Moderator
Moderator
500 replies posted 250 solutions authored 250 replies posted

注意到在DFU project的linker文件中在ram_commom内定义了一个段 -

/* DFU SDK specific */

    /* The noinit section, used across all the applications */

    .cy_boot_noinit (NOLOAD) :

    {

        KEEP(*(.cy_boot_noinit));

    } > ram_common

实际上.cy_boot_noinit 的长度就是整个ram_commom的长度,ram_common和.cy_boot_noinit 在app0和app1 linker文件中都有定义,地址和长度也一样,除了在这个段的最后一个字节存放了appId,其余部分应该是空的,这个段或许可以用来存放你所说的数据,你可以验证一下。

0 点赞

您好。 根据指导。 我这边自己定义了一个变量:

CY_SECTION(".cy_boot_noinit") __USED static uint8_t cy_dfu_Data;

我测试了一下,在软件复位后数据确实是保存的。 非常感谢!! 

0 点赞