转自:http://blog.ednchina.com/czlyzhj/1821516/message.aspx

通过研究,大体明白了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。

7.复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和RTC的访问。

●  通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟

以下是相关代码:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

这个没有什么可说的,关于打开时钟,前面已多次涉及到。

●  电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

以下是相关代码:

PWR_BackupAccessCmd(ENABLE);

代码本身相当简洁,不过我们还是再深入一点点。

这个PWR_BackupAccessCmd代码如下:(在stm32f10x_pwr.c文件中)

/**

* @brief  Enables or disables access to the RTC and backup registers.

* @param  NewState: new state of the access to the RTC and backup registers.

*   This parameter can be: ENABLE or DISABLE.

* @retval None

*/

void PWR_BackupAccessCmd(FunctionalState NewState)

{

/* Check the parameters */

assert_param(IS_FUNCTIONAL_STATE(NewState));

*(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;

}

而CR_DBP_BB在这里(stm32f10x_pwr.c文件中):

/* Alias word address of DBP bit */

#define CR_OFFSET                (PWR_OFFSET + 0x00)

#define DBP_BitNumber            0x08

#define CR_DBP_BB                (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4))

8.一番探索,暂告一段落。由于我的板子与EVAL板略有不同,4个发光管分别接GPIOD的8,9,10和11引脚,所以在程序中做了如下改动(stm3210e_eval.h文件中):

#define LEDn                        4

#define LED1_GPIO_PORT              GPIOD

#define LED1_GPIO_CLK               RCC_APB2Periph_GPIOD

#define LED1_GPIO_PIN               GPIO_Pin_8

#define LED2_GPIO_PORT              GPIOD

#define LED2_GPIO_CLK               RCC_APB2Periph_GPIOD

#define LED2_GPIO_PIN               GPIO_Pin_9

#define LED3_GPIO_PORT              GPIOD

#define LED3_GPIO_CLK               RCC_APB2Periph_GPIOD

#define LED3_GPIO_PIN               GPIO_Pin_10

#define LED4_GPIO_PORT              GPIOD

#define LED4_GPIO_CLK               RCC_APB2Periph_GPIOD

#define LED4_GPIO_PIN               GPIO_Pin_11

然后在板子上将JP6插到VBAT端,并且为板子上现成的电池座中装入一块电池。

执行程序,结果是LED4亮(程序运行)LED1和LED3灯点亮,其含义如下:

(1. LD3 on / LD1 on: a Power On Reset occurred and the values in the BKP data  registers are correct)。

按下复位按钮后,LD1,LD2,LED3均灭,其含义如下:

(3. LD3 off / LD1 off / LD2 off: no Power On Reset occurred)

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

  1. stm32学习笔记 TIM定时器中断1.定时器基本定时功能(含代码)

    TIM定时器分四个部分 目录 一.定时器基本定时功能 二.定时器输出比较功能 三.定时器输入捕获功能 四.定时器编码接口 一.定时器基本定时功能 RCC时钟树 SystmInit函数 外部晶振出问题会 ...

  2. STM32学习笔记 | CAN总线收发数据常见问题分析

    关注+星标公众号,不错过精彩内容 CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. CAN总线和UART.I2C.SP ...

  3. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  4. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  5. cocos2d-x学习笔记16:记录存储1:CCUserDefault

    cocos2d-x学习笔记16:记录存储1:CCUserDefault 一.简述 CCUserDefalt作为NSUserDefalt类的cocos2d-x实现版本,承担了cocos2d-x引擎的记录 ...

  6. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  7. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

  8. STM32学习笔记(13)——模数转换ADC

    这个月一直忙于准备考试,已经考完一半科目了,偷闲写了这篇文章.因为还没考完试,估计还得咕一段时间了. STM32学习笔记(13)--模数转换ADC 第一部分:ADC功能框图 一.输入电压 二.输入通道 ...

  9. STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)

    本篇文章包含的内容 一.ADC 模数转换器 1.1 ADC简介 1.2 逐次逼近型ADC工作原理 1.3 STM32中的ADC基本结构 1.4 STM32中ADC的输入通道 1.5 STM32中的AD ...

最新文章

  1. dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire
  2. 安装 Flex2packagebeta_1.994
  3. html无间隔字幕滚动,js实现文字超过显示宽度每间隔1s自动向左滚动显示
  4. HDU5794 - A Simple Chess
  5. Mercurial hg web server的配置
  6. backtrader数据基础
  7. python 面授_5天Python实战营(面授)
  8. 曾经很火的迅雷,为什么现在不怎么火了?
  9. 前段之路心得——(1)
  10. [PYTHON] 核心编程笔记(11.Python函数和函数式编程)
  11. python 2.7版本解决TypeError: 'encoding' is an invalid keyword argument for this function
  12. 蓝桥杯单片机必学——C语言例题(一)
  13. Hysys能量流和物质流分析
  14. 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
  15. deadline集群渲染_Maya笔记
  16. 干货丨绝地求生—PUBG游戏模型合集
  17. 手机上定时日程提醒怎么设置?
  18. 【MySQL】MySQL 存储引擎、索引、锁、集群
  19. Mininet系列实验(一):Mininet使用源码安装
  20. 智安网络丨DDoS攻击:无限战争

热门文章

  1. 原创-VBA金税盘开票XML生成
  2. 面向对象分析与设计——ATM系统词汇表
  3. html5 canvas时光隧道3D粒子动画js特效
  4. 2023年北京理工大学理论力学考研上岸前辈备考经验指导
  5. WPJAM「网址导航」:最轻便快捷的WordPress网址导航插件
  6. 神经系统位置图高清,中枢神经系统位置图
  7. Outlook账号被封?别慌,一步步教你怎么申诉
  8. 2022年Web 前端怎样入门?最新Web前端入门的学习路线
  9. Ajax的常用技巧(4)---实现数据库分页
  10. 7、osg中响应键盘鼠标事件以及鼠标和键盘编码表