历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2019年08月20日 | stm32之备份寄存器(BKP)应用(侵入检测中断)

2019-08-20 来源:eefocus

前言:很多的嵌入式设备使用过程中,当系统掉电时,往往需要把一些用户设置的参数保存起来,或者是将掉电前的一些状态信息保存,或者是统计系统重启次数。保存这些动态信息其实有很多种方法,第一种:在系统掉电前保存到片内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数据:rn");

for(i=0x0004;i<=0x0028;i+=4){    // baseaddr:0x0004~0x0028  共10个16位的数据后备寄存器 

printf("%c ",BKP_ReadBackupRegister(i));

}

printf("rn");

printf("往BKP写入数据:rn");

ch='a';

for(i=0x0004;i<=0x0028;i+=4){ 

BKP_WriteBackupRegister(i,ch++);

printf("%c ",BKP_ReadBackupRegister(i));

}

printf("rn");

#else //调试方法二

i=BKP_ReadBackupRegister(BKP_DR1);

printf("上电次数%d rn",i);

i++;

BKP_WriteBackupRegister(BKP_DR1,i);

#endif

while(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("触发侵入中断rn");

BKP_ClearITPendingBit();//清除侵入检测中断

BKP_ClearFlag();//清除侵入检测事件

//如果将下面两句执行,那么就变成电平触发,导致的现象:若PC.13引脚保持有效电平,则系统会反复进入中断

         //BKP_TamperPinCmd(DISABLE);

         //BKP_TamperPinCmd(ENABLE);

    }

}

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


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

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


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

推荐阅读

史海拾趣

General Industrial Controls ( GIC )公司的发展小趣事
确保电路设计正确,没有接错元件或线路。特别注意输入电容和输出电容的选择和布局,以及电感的选择和饱和电流是否足够。
Ferranti Electric Inc公司的发展小趣事

随着技术的不断发展和创新,Ferranti Electric Inc公司在电气领域取得了显著的成就。特别是在设计和制造用于恶劣气候或关键安全领域的复杂、高可靠性电气产品方面,公司展示了其卓越的技术实力。这些产品不仅广泛应用于军用领域,同时也为民用领域提供了大量电气产品解决方案。公司的全球影响力逐渐扩大,产品远销世界各地。

艾吉芯(Agertech)公司的发展小趣事

在追求经济效益的同时,艾吉芯公司也积极履行社会责任。公司注重环境保护和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,艾吉芯还积极参与社会公益事业,为社会的和谐发展贡献自己的力量。

这些故事虽然基于推测和构建,但尽可能地反映了电子行业中企业发展的普遍规律和趋势。艾吉芯公司作为电子行业的一员,其发展历程也必然离不开这些方面的努力和探索。当然,具体的发展故事还需要根据艾吉芯公司的实际情况进行深入了解和研究。

东科半导体(DK)公司的发展小趣事

东科半导体(DK)公司一直将技术创新作为发展的核心驱动力。公司投入大量资金和资源用于研发,先后开发出AC/DC、同步整流、第三代半导体氮化镓芯片等先进技术。其中,东科半导体的同步整流芯片研发成功,其独特的两引脚封装技术为全球首创,为公司赢得了行业内的独家竞争优势。这一技术的成功应用,不仅提升了公司产品的性能,也进一步巩固了东科在电源管理芯片市场的领先地位。

Frequency Sources公司的发展小趣事

Frequency Sources公司深知质量是企业生存和发展的基石。因此,公司始终将质量控制放在首位,建立了完善的质量管理体系和检测机制。从原材料采购到生产加工、成品检验等各个环节都严格把关,确保产品质量符合客户要求和行业标准。同时,公司还注重品牌建设和客户服务体验的提升,通过提供优质的售前咨询、售中支持和售后服务赢得了客户的信赖和好评。这些努力使得公司的品牌形象深入人心,成为了行业内的佼佼者。

Enterpoint公司的发展小趣事

Enterpoint公司起源于一个由几位电子工程领域的专家组成的创业团队。当时,他们看到了电子行业中对于高效、可靠的数据处理解决方案的迫切需求,于是决定创立Enterpoint公司,专注于开发这一领域的创新产品。团队初期面临着资金短缺、技术挑战和市场认知度低等多重困难,但他们凭借着对技术的热情和坚持,不断研发新产品,逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

电子面试常问问题

大家好,我是即将毕业的学生,我参加过好几场的用人单位的面试,总结了一下招聘团常问的问题(关于电子专业的),现在贴出来,和大家一起分享,祝愿还没找上工作的朋友们能早日找到心满意的工作。(来这里的学生还是比较多的,希望能对你们有点用)&n ...…

查看全部问答>

一个入门的windowsCE开发资料

资料还是可以,大家支持支持吧.…

查看全部问答>

51单片机实验班各模块的应用

我们老师设计的一块51实验开发板,很实用!对于单片机入门者非常有用。与大家分享!包括流水灯、数码管、液晶、蜂鸣器、键盘、AD转换等模块。…

查看全部问答>

求重庆本地技术人员解决DS18B20跳变的问题,有报酬:)

不要用数字滤波,这个我已经做了。不管是换芯片,还是调整时序,都可以。 有意思的请联系我,我在沙坪坝。QQ:3487317  TEL:13883677969…

查看全部问答>

分散加载中的疑问(这个应该知道的比较多了吧)

这样的. 看了LINK GUIDE,还是对分散加载有些疑问 比如一个scf如下 LREGION_test   0x0    {    EREGION_1 0x0  0x1000    {        boot.o(INIT,First)   &n ...…

查看全部问答>

蘑菇房温湿度环境控制系统

[菇房培养应用方案] [食用菌养殖现代化技术] [蘑菇房工厂化技术方案书]    温度因素温度是环境条件的诸多因素中最为活跃的因素,也是对食用菌菌种生产、生产和使用影响作用最大的因素。任何种类、任何品种菌丝生长都有其生长温度范围 ...…

查看全部问答>

ADI高速数据传输(三)

replyreload += \',\' + 1653369; DACs, DDSs, PLLs, and Clock Distribution 由于本份材料是英文版的,有需要的请回复下载,分为四个帖子发布。目录如下 Timson,如果您要查看本帖隐藏内容请回复 …

查看全部问答>

MSP430 f5529中文教程

求MSP430 f5529的中文教程,有什么好的大家推荐一下吧。…

查看全部问答>

TM4C123GH6PM在KEIL 编程问题

路径什么的应该都设置好了,编译时也没问题,可是右键使用“go to define xxx”的时候就出现[backcolor=rgba(255, 255, 255, 0.796875)]Source Browser: \'xxx\' - undefined Definition/Reference !这个对话框!不知道是怎么回事,还望各位赐教! ...…

查看全部问答>