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

2010-8-20 08:20 7979 13 15 分类: MCU/ 嵌入式

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


f38995ba-3817-4bbb-8b71-0cae0497bea0.jpg



通过研究,大体明白了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的内容:


844fbace-dae5-4f58-96d5-051e86f11254.jpg




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


3ab13666-87a7-4dea-88c0-2c502d3d9ff6.jpg



       6.1.2  电源复位 


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


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


       2. 从待机模式中返回


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


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


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


RCC_GetFlagStatus(RCC_FLAG_PORRST)


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


7d8874ed-69a6-4ab0-af73-0e559cecd89e.jpg



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


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


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


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


a4b9bc63-36f4-484f-8280-dd3b478e9567.jpg


2dbed029-a929-4a3d-924a-f47902253745.jpg




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


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


37726227-e8cf-46fd-90d6-dd08195b9b70.jpg



       那么在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)

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1708715 2012-10-15 13:15

谢谢分享,解决了我在软件复位后的问题。

用户418799 2012-7-23 11:56

不错,很好

用户1615276 2008-10-1 09:01

相关推荐阅读
teach51_109853927 2015-10-25 22:37
带“锁定输出”的数控稳压电源(二)
3.控制程序编写        硬件电路设计完成后,就要编写软件了。软件基本上可以分为键盘驱动,PWM生成,功能实现等部分。 3.1 键盘处理程序        STC单片机的引脚可以...
teach51_109853927 2014-03-02 12:17
带“锁定输出”的数控稳压电源(一)
本文是探索“开源培训”思想的作品。 所谓“开源培训”是指在某个社区,各志愿者提供有一定实用价值和教学价值的作品,同时详细说明制作过程,并提供制作所需的各类资源,帮助入门者快速找到适合自己的项目...
teach51_109853927 2014-02-22 21:15
《单片机项目教程》、《单片机项目教程C语言版》电子课件
《单片机项目教程》电子课件 http://pan.baidu.com/s/1kT2Yb6f 《单片机项目教程C语言版》电子课件 http://pan.baidu.com/s/1gd5O...
teach51_109853927 2014-02-22 21:05
《单片机应用与接口技术》相关资源
单片机应用与接口技术    机械工业出版社出版,江苏省教育厅推荐教材 《单片机应用与接口技术》课件 http://pan.baidu.com/s/1c0kpzUg 《单片机应用与接...
teach51_109853927 2014-02-22 15:25
便携式无线抢答器
本产品专门为开展活动时需要用到抢答器的场合设计,已制作成品,读者可以参考作为练手之用。 如图1所示左边为信号接收装置(主持人用),右边两个为发射装置(比赛选手用)。都只需要使用干电池供电即可。...
teach51_109853927 2014-02-22 15:22
Modbus通讯协议
Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协...
EE直播间
更多
我要评论
2
13
关闭 站长推荐上一条 /3 下一条