STM32学习笔记(16)-数据的保存与毁灭BKP功能

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32学习笔记(16)-数据的保存与毁灭-BKP功能(1)

通过STM32库自带的例子来做,就是这个:

通过研究,大体明白了BKP的功能,简述如下:

1. BKP可以用来保存数据

BKP中包括了42个16位的寄存器,共可保存84字节的内容,它们由VBAT的供电来维挂。

2. BKP内保存的数据可以被毁灭(如果有人希望恶意得到这些数据的话,令其丢失比保护数据更重要)。STM32提供了一种称之为TAMPER的机制来完成。中文译为“侵入检测”,这需要占用一个外部引脚(PC13)。

3.如果不用侵入检测功能,那么这个外部引脚可以用作RTC校准功能,这个稍后再研究。

4.当有系统复位/电源复位/待机模式下被唤醒这三种情况时,BKP中的值不会丢失或被复位。

先回来研究一下STM32的复位机制。以下是数据手册的相关部分。

6.1 复位

STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。

6.1.1 系统复位

系统复位将复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器以外的所有寄存器

当以下事件中的一件发生时,产生一个系统复位:

1.NRST管脚上的低电平(外部复位)

例如:按下板子上的RESET按钮就产生一个外部复位(属于系统复位)

2.窗口看门狗计数终止(WWDG复位)

3.独立看门狗计数终止(IWDG复位)

4.软件复位(SW复位)

5.低功耗管理复位

可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源

以下是RCC_CSR的内容:

调试时不太容易区分,以下是某次调试中截到的RCC_CSR数据。

6.1.2 电源复位

当以下事件中之一发生时,产生电源复位:

1. 上电/掉电复位(POR/PDR复位)

2. 从待机模式中返回

电源复位将复位除了备份区域外的所有寄存器。(见图3)

图中复位源将最终作用于RESET管脚,并在复位过程中保持低电平。复位入口矢量被固定在地址0x0000_0004。更多细节,参阅表36。

检测可以是否上电/掉电复位可以用以下的函数:

RCC_GetFlagStatus(RCC_FLAG_PORRST)

其中RCC_FLAG_PORRST也可以被替代成以下的一些符号,以检测不同的内容:

**************************************************************************

5.如果必须要人为地令备份域复位(所有数据都被清零),那么有两种方法:

a) 软件复位(操作RCC_BDCR中的BDRST位产生。);以下是RCC_BDCR中相关的内容:

6.3.9 备份域控制寄存器 (RCC_BDCR)

b) VDD和VBAT均掉电,那么在VDD或都VBAT上电时将引发备分域复位(这是为了保护数据的完整性?)

6.数据寄存器究竟是哪些呢?

那么在STM32提供的库里又是如何来用这些寄存器的呢?我们找一找,在

stm32f10x_bkp.c中,代码如下:

* @brief Writes user data to the specified Data Backup Register.

* @param BKP_DR: specifies the Data Backup Register.

* This parameter can be BKP_DRx where x:[1, 42]

* @param Data: data to write

* @retval None

*/

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)

{

__IO uint32_t tmp = 0;

/* Check the parameters */

assert_param(IS_BKP_DR(BKP_DR));

tmp = (uint32_t)BKP_BASE;

tmp += BKP_DR;

*(__IO uint32_t *) tmp = Data;

}

即只需要提供两个参数,第一个是BKP地址,第二个是数据,两个都是16位的数据。第二个参数没有问题,第一个参数如何提供呢?看例子中的代码:

/**

* @brief Writes data Backup DRx registers.

* @param FirstBackupData: data to be written to Backup data registers.

* @retval None

*/

void WriteToBackupReg(uint16_t FirstBackupData)

uint32_t index = 0;

for (index = 0; index < BKP_DR_NUMBER; index++)

{

BKP_WriteBackupRegister(BKPDataReg[index], FirstBackupData + (index * 0x5A)); }

}

从上面的代码可以看到,第一个参数是用

BKPDataReg[index]

来提供的,这个又是什么东西呢?再找:

uint16_t BKPDataReg[BKP_DR_NUMBER] =

{

BKP_DR1, BKP_DR2, BKP_DR3, BKP_DR4, BKP_DR5, BKP_DR6, BKP_DR7, BKP_DR8,

BKP_DR9, BKP_DR10, BKP_DR11, BKP_DR12, BKP_DR13, BKP_DR14, BKP_DR15, BKP_DR16,

BKP_DR17, BKP_DR18, BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22, BKP_DR23,

BKP_DR24,

BKP_DR25, BKP_DR26, BKP_DR27, BKP_DR28, BKP_DR29, BKP_DR30, BKP_DR31,

BKP_DR32,

BKP_DR33, BKP_DR34, BKP_DR35, BKP_DR36, BKP_DR37, BKP_DR38, BKP_DR39,

BKP_DR40,

BKP_DR41, BKP_DR42

};

原来最终还是用BKP_DR**这样的格式来用的,其中的**代表的序号。即5.4.1中的x。

相关文档
最新文档