在看51822的DFU文章时看到了内部有种比较特殊的寄存器,避免自己在忘记,记录下来加深印象。
根据nRF51 Series Reference Manual 手册中讲到的内容:

大概意思: Retained Register 是一个可以在系统OFF模式时保持内部数据值的寄存器,也只能允许由复位源给定的复位情况。在不同独立的外设章节有对不同外设做的介绍。
下面简单翻译为:保持寄存器。 不同的外设有不同的保持寄存器,功能和特性可能都不一样,用的时候根据实际情况再详细看资料。
今天主要是使用了NRF_POWER->GPREGRET寄存器,文档中提到的数据保持功能,仅限于软件或者外部按键复位操作时可以保持寄存器值,如果断电源后数据还是会被丢失的。这个是自己亲自做实验得出的结论。
SDK这种介绍使用方法:
http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk51.v10.0.0%2Findex.html
1. uint32_t sd_power_gpregret_set(uint32_t gpregret_msk)
2. uint32_t sd_power_gpregret_clr(uint32_t gpregret_msk)
3. uint32_t sd_power_gpregret_get(uint32_t * p_gpregret)
// 举个例子:
uint32_t * buffer;
sd_power_gpregret_get(buffer);
PW_retention_register = *buffer & 0x00ff;
sd_power_gpregret_set(0x01); //置位bit0
sd_power_gpregret_clr(0x01); //清零bit0
set和clr分别是设定寄存器GPREGRET和清除寄存器操作;对特定位写1将置位或者清零操作; 寄存器有效位为低8位有效。
使用前两个语句set寄存器值Parameters:
[in] gpregret_msk Bits to be set in the GPREGRET register
使用第三个语句get读取寄存器参数: Parameters:
[out] p_gpregret Contents of the GPREGRET register. p_gpregret 是32位指针使用时注意。
//第二种直接寄存器操作:
1. NRF_POWER->GPREGRET = 0x00;
2. NRF_POWER->GPREGRET = 0x01; // write
3. buffer = NRF_POWER->GPREGRET & 0xff; //read register
网友评论