STM32学习笔记(18)-数据的保存和毁灭

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

数据的保存和毁灭(2)

和以前学到的有关数据保存不同,这里的数据保存还有“保密”之意,即一旦受到意外的侵入,STM32将毁灭数据。这是通过Tamper机制来实现的。

以下是数据手册中的有关说明:

5.3.1 侵入检测

当TAMPER引脚上的信号从0变成1或者从1变成0(取决于备份控制寄存器BKP_CR的TPAL 位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。然而为了避免丢失侵入事件,侵入检测信号是边沿检测的信号与侵入检测允许位的逻辑与,从而在侵入检测引脚被允许前发生的侵入事件也可以被检测到。

●当 TPAL=0 时:如果在启动侵入检测TAMPER引脚前(通过设置TPE位)该引脚已经为高电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现上升沿)。

●当 TPAL=1 时:如果在启动侵入检测引脚TAMPER前(通过设置TPE位)该引脚已经为低电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现下降沿)。

设置BKP_CSR寄存器的TPIE位为’1’,当检测到侵入事件时就会产生一个中断。

在一个侵入事件被检测到并被清除后,侵入检测引脚TAMPER应该被禁止。然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚TAMPER进行电平检测。

注:当V DD电源断开时,侵入检测功能仍然有效。为了避免不必要的复位数据备份寄存器,TAMPER引脚应该在片外连接到正确的电平。

显然,Tamper需要硬件与之配合。以上数据手册描述了硬件配置时的一些注意事项。

(1)可以是把引脚由低电平到高电平认为是一次侵入,也可以把引脚从高电平变到低电平认为是一次侵入,这通过TPAL来设置。

(2) Tamper机制需要被启动才能起作用。但在启动之前,如果引脚已处于设定的状态,那么一旦启动,就会产生一次Tamper事件,这需要注意,否则会引起数据的意外丢失而不自觉。

(3)即便芯片上的VDD电源断开,(只要仍有VBAT),那么Tamper检测仍是有效的,因此,设计硬件时必须要小心,如果某设计是将Tamper引脚通过上拉电阻接VDD,并在这个引脚上接入机械开关到地。如果开关导通,那么就是一次Tamper事件,这个没有问题。但是,如果电源断开(VDD变低),也会引发一次Tamper事件,而这往往并不是设计都的本意。因此,这个引脚的上拉电阻必须接到VBAT而不是接到VDD。

(4)总的来说,TAMPER并不复杂,下面来看一看代码。

这次是用的STM32库中的这个例子。

有关LED的设置,这里就不再重复了,和上一篇文章(数据的保存与毁灭(1)相同)。

/* Enable write access to Backup domain */

PWR_BackupAccessCmd(ENABLE);

这是打开BKP功能。

/* Clear Tamper pin Event(TE) pending flag */

BKP_ClearFlag();

清除Tamper事件

/* Tamper pin active on low level */

BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);

配置Tamper引脚究竟是高电平有效还是低电平有效,这个再研究一下,继续跟踪:

/**

* @brief Configures the Tamper Pin active level.

* @param BKP_TamperPinLevel: specifies the Tamper Pin active level.

* This parameter can be one of the following values:

* @arg BKP_TamperPinLevel_High: Tamper pin active on high level

* @arg BKP_TamperPinLevel_Low: Tamper pin active on low level

* @retval None

*/

void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel)

{

/* Check the parameters */

assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel));

*(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel;

}

CR_TPAL_BB又是什么呢?

/* Alias word address of TPAL bit */

#define CR_OFFSET (BKP_OFFSET + 0x30)

#define TPAL_BitNumber 0x01

#define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4))

要看懂上面有关CR_TPAL_BB的相关定义及理解为何这样写,恐怕又要涉及到Contex 的另一个重要内容,即bit-band,这个暂不深究,留待下次学习(说句闲话:bit-bank我早就看到,就是没有兴趣深入了解,因为没觉得什么地方有用到,今天既已知其用途,改日必去改看,,,所以只有动起来,才能学更多的东西)。这里只管当它是能够直接设定该平是0或都是1就行了。

即根据实参决定BKP_CR中的TPAL究竟是0还是1。可选参数为:

#define BKP_TamperPinLevel_High ((uint16_t)0x0000)

#define BKP_TamperPinLevel_Low ((uint16_t)0x0001)

BKP的其他用途:

BKP的寄存器可以用来存储RTC校验值的校验寄存器。

在PC13管脚(当该管脚不用于侵入检测时)上输出RTC校准时钟,RTC闹钟脉冲或者秒脉冲

为方便测量,RTC时钟可以经64分频输出到侵入检测引脚TAMPER上。通过设置RTC 校验寄存器(BKP_RTCCR)的CCO位来开启这一功能。通过配置CAL[6:0]位,此时钟可以最多减慢121ppm。

相关文档
最新文档