前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次数。保存这些动态信息其实有很多种方法,第一种:在系统掉电前保存到片内flash,但是对flash的读写是按页操作,对于保存一些少量的数据来说并不合算。第二种:在系统掉电前保存在片外的EEPROM,可以根据需要选用合适的EEPROM存储的大小,但这样需要增加额外电路,增加成本。第三种:利用片内的备份寄存器里的后备数据寄存器存储。对于一些中、小型容量产品来说,有10个16位的数据后备寄存器。与前两种不同,它需要将引脚接上电池,否则数据会丢失。下面对备份寄存器深入了解。

1.备份寄存器的特性

● 20字节数据后备寄存器(中容量和小容量产品),或84字节数据后备寄存器(大容量和互联型产品)

● 用来管理防侵入检测并具有中断功能的状态/控制寄存器

● 用来存储RTC校验值的校验寄存器。

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

备份寄存器在后备供电区域里,当电源被切断,他们仍然由维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。下面主要介绍入侵检测和数据后备寄存器的应用,关于RTC部分单独一篇介绍。备份寄存器之所以与RTC有关,是因为RTC在电源切断后也是需要保持计数。

2.侵入检测功能

当TAMPER引脚(即PC.13)上的信号从0变成1或者从1变成0(取决于备份控制寄存器BKP_CR的TPAL位),会产生一个侵入检测事件(即使切断)。侵入检测事件将所有数据备份寄存器内容清除。

然而为了避免丢失侵入事件,侵入检测信号是边沿检测的信号与侵入检测允许位的逻辑与,从而在侵入检测引脚被允许前发生的侵入事件也可以被检测到。

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

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

注意:对TAMPER引脚的检测,可以是边沿触发(上升沿、下降沿),也可以是电平触发,后者需要启用中断配合,下面会讲解。产生侵入事件会将备份寄存器复位,产生事件的同时也可以通过软件使能中断,进入一个侵入检测中断TAMPER_IRQHandler。当然中断不使能,事件仍然会发生。

3.代码设计

涉及到的寄存器不逐一介绍,下面通过标准库里的函数进行开发。如果需要直接操作寄存器可以打开相应库函数的定义,函数里面也是执行寄存器的操作,将其内容复制出来即可。

#include "stm32f10x.h"
#include "stdio.h"void TAMPER_ITConfig(void);
static void NVIC_Configuration(void);
static void USART1_Config(void);int main(void)
{   unsigned short i;char ch;USART1_Config();//串口1输出调试信息NVIC_Configuration();//配置串口接收中断的优先级RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能电源管理单元的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);//使能后备寄存器访问BKP_TamperPinCmd(DISABLE);  //先关闭侵入检测引脚BKP_ITConfig(DISABLE);      //关闭侵入中断BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);   //设置检测引脚低电平有效BKP_ClearFlag();   //清除侵入检测事件TAMPER_ITConfig();//配置中断优先级并打开侵入中断,不需要进入中断可以注释掉这句,并不影响侵入事件的发生BKP_TamperPinCmd(ENABLE);//开启侵入检测引脚#if 0 //调试方法一printf("上电读取BKP数据:\r\n");for(i=0x0004;i<=0x0028;i+=4){    // baseaddr:0x0004~0x0028  共10个16位的数据后备寄存器 printf("%c ",BKP_ReadBackupRegister(i));}printf("\r\n");printf("往BKP写入数据:\r\n");ch='a';for(i=0x0004;i<=0x0028;i+=4){ BKP_WriteBackupRegister(i,ch++);printf("%c ",BKP_ReadBackupRegister(i));}printf("\r\n");
#else //调试方法二i=BKP_ReadBackupRegister(BKP_DR1);printf("上电次数%d \r\n",i);i++;BKP_WriteBackupRegister(BKP_DR1,i);
#endifwhile(1){}
}void TAMPER_ITConfig(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TAMPER_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//初始化侵入中断的优先级BKP_ITConfig(ENABLE);//使能侵入中断
}void USART1_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;//配置串口1(USART1)时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//配置串口1(USART1 Tx (PA.09))GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置串口1 USART1 Rx (PA.10)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//串口1模式(USART1 mode)配置 USART_InitStructure.USART_BaudRate = 9600;//一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART1, ENABLE); //使能串口 USART_ClearFlag(USART1,USART_FLAG_TC);
}int fputc(int ch, FILE *f)//重写标准库的fputc函数
{//将Printf内容发往串口USART_SendData(USART1, (unsigned char) ch);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);    return (ch);
}static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   NVIC_Init(&NVIC_InitStructure);
}

在stm32f10x_it.c文件加入:

void TAMPER_IRQHandler(void)
{if(BKP_GetITStatus()!=RESET){printf("触发侵入中断\r\n");BKP_ClearITPendingBit();//清除侵入检测中断BKP_ClearFlag();//清除侵入检测事件//如果将下面两句执行,那么就变成电平触发,导致的现象:若PC.13引脚保持有效电平,则系统会反复进入中断//BKP_TamperPinCmd(DISABLE);//BKP_TamperPinCmd(ENABLE);}
}

首先需要准备两个独立的电源,将板子的和PC.13(侵入检测引脚)接到一个电源(因为我的板子没有电池),将接到另一个电源,并且将两个电源共地。并串口1接到电脑,利用电脑上位机显示调试打印信息。

其次,编译下载程序,打开串口助手,按下板子的复位键(我这里按了四次),也可以切断再上电反复四次,如下图:

可看出,不管系统复位还是掉电,上电次数得到了记录。下面将PC.13引脚从高电平且换到低电平(产生一个侵入信号),再进行系统复位或重新上电(我这里按了两次复位):

可看出,侵入事件发生后,备份寄存器里的数据被复位。当掉电时,PC.13引脚仍然在检测,若出现下降沿,备份寄存器也会进行复位,这个可以自行验证。还有上面提到的电平触发,也可以自行验证。我自己验证过,这里不做赘述。

<<书中有路勤为径,学海无涯苦作舟。———韩愈>>

stm32之备份寄存器(BKP)应用(侵入检测中断)相关推荐

  1. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  2. 【STM32】HAL库-备份寄存器(BKP)

    简介 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据. 他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电. 当系统在待机模式下被唤醒,或系统复位或电源复位时, ...

  3. STM32的备份寄存器测试

    1. 研究STM3的备份寄存器,注意,如果要测试这个例程的话,VBAT不能和VDD接一起,必须分开. 2. 理解,备份寄存器可以有VBAT独立供电,也就是外接电池,备份寄存器在VBAT供电情况下,如果 ...

  4. STM32 备份寄存器操作

    STM32系列为处理器都有备份寄存器,他它们处于备份区域里,当VDD电源被切断,它们仍然由VBAT维持供电,当系统在待机模式下被唤醒,或者系统复位或电源复位是,它们都不会被复位.以实时时钟RTC为例, ...

  5. stm32F103R6之BKP(备份寄存器)

    目录 概述 侵入检测 RTC校准 概述 Stm32F103有42个16位的备份寄存器.他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电.当系统在待机模式下被唤醒,或系统复位或电源复位时 ...

  6. STM32 之七 备份域(备份寄存器、备份SRAM)详解及数据丢失问题处理

    某些STM32芯片提供了备份SRAM,例如STM32F系列芯片有4K的备份SRAM.然而在使用过程中发现备份区域数据丢失!下面从STM32系列芯片提供的整个备份域来看看啥情况. 电池备份域   首先, ...

  7. 28_RTC实时时钟BKP备份寄存器

    目录 RTC(Real Time Clock):实时时钟 RTC特征 RTC工作原理框图 BKP备份寄存器 RTC相关寄存器 配置RTC寄存器 配置过程: 读RTC寄存器 RTC相关库函数讲解 RTC ...

  8. STM32学习手记5 BKP后备寄存器、RTC和中断

    STM32的后备寄存器: STM32共有42个16位后备寄存器,可以用来存储84个字节的用户数据.而所谓的后备寄存器,并不是真正的EEPROM.当VDD电源被切断,VBAT仍然保持供电,后备寄存器的内 ...

  9. STM32CubeMX HAL F103 BKP备份寄存器使用

    STM32CubeMX HAL F103 BKP备份寄存器使用 以下是本人自己的应用笔记,如果有错误的地方,欢迎评论区指出,我会及时更正-[2021.09.28] 1.需要开启RTC功能 2.API调 ...

最新文章

  1. 灵魂出窍的神经生物学基础!
  2. 后疫情时代怎么办?来看看联想的智慧答卷
  3. 十进制转换成二进制列表
  4. jq第一天(1.83里面的属性)属性-》属性
  5. elementUI之switch应用的坑
  6. Transfer-Encoding
  7. Android Studio向项目中导入jar包的方法
  8. 基于SSM的购物商城系统(含文档)
  9. 【转】匈牙利命名法则
  10. zendframework Form表单美化
  11. 安装软件提示计算机管理员权限,Win7安装软件需要管理员权限的解决方法
  12. 知网哭穷赔不起1200亿,网友:收钱时咋不嫌多
  13. 实现类CAD的交互式命令系统
  14. ROS导航调参经验总结(Teb算法)
  15. 话题 | 咨询师建议:如何关系断舍离
  16. Android 广告图片 全屏图片适配方案的思路
  17. outlook 签名_Outlook 2007中的电子邮件签名礼节-适当的Flair
  18. python写一个简单的12306抢票
  19. 计算机联锁系统可靠性,计算机联锁系统的可靠性和安全性比较
  20. linux下Kdevelop开发基本步骤

热门文章

  1. matlab常用函数,命令
  2. excel表格拆分如何快速完成
  3. 把oracle数据导入redis,Oracle向redis数据迁移
  4. 小米oj和为零的三元组
  5. Android studio的ADBWifi使用
  6. 千万别惹程序员,39 个奇葩代码注释...
  7. python 百度地图api_使用Python玩转百度地图Api
  8. 汽车行业,怎么样通过论坛快速引流?
  9. win10不用密码直接登陆设置
  10. 离散度计算公式 python_Python分析离散心率信号(中)