在日常开发当中,用户经常碰到需要临时储存数据的情况,此时如果用芯片内部Flash做存储当然可以,但其存在操作时间较长、不能在非主动情况下有效储存等问题。

因此在某些特殊情况下将数据临时存储在RAM或寄存器中更加合适,如上图中标星的情形。应用中常用到的场景比如:

  1. 在进行 DFU(OTA)功能时,无论从应用程序跳转到bootloader(NVIC_SystemReset),还是从bootloader跳转到应用程序,都可以用RAM或寄存器来传递变量、标志等。
  2. 应用程序有类似日历功能的应用,并且不希望其数据在应用重启时被清空。

GPREGRET寄存器

GPREGRET是 General purpose retention register的缩写,即 通用保持寄存器。

我们在非使能协议栈的情况下,可以直接使用NRF_POWER->GPREGRET(nrf_power_gpregret_set)来操作它。

在使能协议栈的时候需要用sd_power_gpregret_set来操作它。


RAM

下图是nRF52832的内存结构,可以看到nRF52832-QFAA的64K RAM 被分成了8个块,每个块又分了2个section,每个section是64KB/16 = 4KB。

控制RAM电源的寄存器放在POWER寄存器下,分为RAMON/RAMONB 和 RAM[X]这两类,前者已不建议使用。

 

下图是NRF_POWER->RAM[X].POWER的详细说明,我们可以看到S0,S1的电源默认是打开的,但是它们的Retention功能默认是关闭的,因此需要使用Retention功能,则需要手动打开。


SDK中有使用上述两种方式的实现的例程,在目录nRF5_SDK_15.3.0_59ac345\examples\peripheral\ram_retention\pca10040\blank\arm5_no_packs下。

其中对于RAM0块的操作,非nRF52840使用的还是RAMON/RAMONB方式,有兴趣用户的可以将其修改为RAM[X]的方式。另外当协议栈已经使能的时候,不能直接操作POWER寄存器,请调用相关的协议栈函数操作。

 

 

 

 

发表评论