STM32的BKP寄存器问题

发布者:火箭飞人最新更新时间:2019-03-06 来源: eefocus关键字:STM32  BKP寄存器 手机看文章 扫描二维码
随时随地手机看文章

尝试着使用了下STM32的BKP数据寄存器,试着RESET后仍旧保持之前的RTC,但是遇到了问题,BKP_DR寄存器中的值RESET之后就不见了。(试过BKP_DR34这个貌似直接写不进去,BKP_DR3可以写进去,写完后读出来也对,但RESET之后就没有了)

请教下为什么?应该怎么做能让BKP_DR在RESET后依旧有值。


贴代码:


C/C++ code?




int main()


{


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);


 


       RCC_RTC_Configuration();


...


}


void RCC_RTC_Configuration()


{


    volatile uint16_t val = 0, val1 = 0;


 


    PWR_BackupAccessCmd(ENABLE);


    BKP_ClearFlag();


    BKP_DeInit();


 


    RCC_LSEConfig(RCC_LSE_ON);


    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);


    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);


    RCC_RTCCLKCmd(ENABLE);


 


    val = BKP_ReadBackupRegister(BKP_DR3);    //这里复位后每次读的值都为0x0000


    if(val == 0x3434) {        //BackUp register Set


//        PWR_BackupAccessCmd(DISABLE);


        RCC_ClearFlag();


    }


    else {        //BackUp register Unset


//        BKP_DeInit();


        RTC_WaitForLastTask();


        RTC_EnterConfigMode();


        RTC_SetPrescaler(0x7FFF);


        RTC_WaitForLastTask();


        RTC_ITConfig(RTC_IT_ALR | RTC_IT_SEC, ENABLE);


        RTC_ExitConfigMode();


        RTC_WaitForLastTask();


 


        BKP_WriteBackupRegister(BKP_DR3, (uint16_t)0x3434);   //这里改为BKP_DR34后下面读出来的val1为0x0000


        val1 = BKP_ReadBackupRegister(BKP_DR3);


        val1 = BKP_ReadBackupRegister(BKP_DR3);


//        PWR_BackupAccessCmd(DISABLE);


        RCC_ClearFlag();


    }


     


}


 


后来搞定了,发现是代码有问题,


C/C++ code?




void RCC_RTC_Configuration()


{


    volatile uint16_t val = 0, val1 = 0;


  


    PWR_BackupAccessCmd(ENABLE);


    BKP_ClearFlag();


    //BKP_DeInit();    //这个函数注释掉,因为里面最后调了PWR_BackupAccessCmd(DISABLE);


....


}


 


关键字:STM32  BKP寄存器 引用地址:STM32的BKP寄存器问题

上一篇:stm32中断向量控制器
下一篇:Stm32 IAP程序编写及用户程序编写

推荐阅读最新更新时间:2024-03-16 16:24

STM32的AD9854 DDS模块调试总结
  DDS基本原理和特点   1、DDS基本原理   直接频率合成技术实际上是通过将存储的波形数据,通过特定算法,经过高速D/A转换器转换成所需要模拟信号的数字合成技术。其基本原理框图如图1所示。   由图1可见,其主要由标准参考频率源、相位累加器、波形存储器、数/模转换器等部分组成。其中,参考频率源一般是一个高稳定的晶体振荡器,其输出信号用于DDS中各部件同步工作。当频率合成器正常工作时,在标准频率参考源的控制下(频率控制字K决定了其相位增量),相位累加器则不断地对该相位增量进行线性累加,当相位累加器积满量时就会产生一次溢出,从而完成一个周期性的动作,即合成信号的一个频率周期。累加器的输出地址对波形ROM进行寻址,从而把存
[单片机]
<font color='red'>STM32</font>的AD9854 DDS模块调试总结
STM32 Systick定时器
Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:为什么要设置SysTick定时器? (1)产生操作系统的时钟节拍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 (2)便于不同处理器之间程序移植。 Cortex‐M3处理器内部包
[单片机]
stm32 hal i2c 库读写sd3088时钟
前一版本的修正。 sd3008在每次通信开始0.5s做一次总线复位,不必考虑stm32的i2c Bug问题。 而且HAL库,是不是也应考虑到软件上补充这个Bug? 使用HAL_I2C_Mem_Read/Write,使得代码非常好看。模拟I2C方式,一字长蛇阵模样。 使用Freertos,读取时间、保存数据到用户SRAM,需要考虑Mutex对RTC时钟资源进行保护。 * SD3088时钟芯片 读写 * 文件 sd3088.h * http://git.oschina.net/maizhi/small-pellet-sove-control-system *作者 于 *版本 v1.1 */ #incl
[单片机]
STM32学习笔记:ADC理解
ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。 ADC 主要特性 可配置 12 位、10 位、8 位或 6 位分辨率 ● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断 ● 单次和连续转换模式 ● 用于自动将通道 0 转换为通道“n”的扫描模式 ● 数据对齐以保持内置数据一致性 ● 可独立设置各通道采样时间 ● 外部触发器选项,可为规则转换和注入转换配置极性
[单片机]
<font color='red'>STM32</font>学习笔记:ADC理解
STM32的exti中断调试遇到一奇怪问题总结
前两日调试EXTI 中断程序,程序很简单抄了网上的范例,起初调试正常,可以正常运行,但我在程序中加入另外的代码后问题出现,表现为中断莫名其妙的开始响应!检查自己的程序,未发现异常,中断部分的设置也没有为题。逐步屏蔽后加入的代码,依据屏蔽的代码不同,单步运行后从不同的位置跳入中断。怪哉怪哉....反复调试若干遍,花费时间2天有余... 百思不得其解之际,又检查了自己的板子,看到BOOT1悬空,心中一动,当初图省事,空了此脚,难不成问题在此? 找了调帽装上,一切正常,吐血.... .....(心里活动省略200字) 原来 虽然boot0置0了,但是boot1还是不能悬空的呀! ------------------------------
[单片机]
stm32入门之通用定时器(TIM2~TIM5)
在stm32的开发中我们经常会用到定时器,因此在学习stm32的过程中定时器是必须要学的,而定时主要又分为三大类分别为: 高级控制定时器(TIM1与TIM8) 通用定时器(TIM2~TIM5) 基本定时器(TIM6与TIM7) 今天我只要想给大家介绍的是第二种通用定时器(TIM2~TIM5),还是老样子我先以文字给大家简单概述,在通过视频详细为大家分析细节。 精通定时间的老油条勿喷!!! 首先我们先来了解一下TIM2~TIM5定时器基本功能 (1)16位向上、向下、向上/向下自动装载计数器 (2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 (3)4个独立通道: ─ 输入捕获 ─ 输
[单片机]
<font color='red'>stm32</font>入门之通用定时器(TIM2~TIM5)
STM32学习之路-RCC
RCC-复位和时钟控制.主要看下时钟控制这部分 系统时钟树: 有三种时钟源可以驱动系统时钟(SYSCLK) 分别是HSI振荡器、HSE振荡器、PLLCLK HSI时钟信号:由内部8MHZ的RC振荡器产生,可直接作为SYSCLK或者2分频以后给PLL当输入,当HSI作为PLL时钟的输入时,SYSCLK最大为64MHZ(8/2*16) HSE时钟信号:由外部振荡器产生频率在4-16MHZ,在时钟控制寄存器RCC_CR中用HSERDY位用来指示高速外部振荡器是否稳定 在启动时,直到这一位被硬件置'1',时钟才背释放,如果在时钟中断寄存器RCC_CIR中允许产生中断,将会产生相应的中断。 HSE可以
[单片机]
<font color='red'>STM32</font>学习之路-RCC
STM32触摸按键原理和电路设计
01触摸按键原理 触摸使用RC充放电原理: RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用的电路。 充电过程: 电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t(tao)=RC。 放电过程: 电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快。随着电容不断的放电,电容的电压也随着下降。电流也很快减小。电容的放电速度与RC有关,R的阻值
[单片机]
<font color='red'>STM32</font>触摸按键原理和电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved