STM32的BKP寄存器问题

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

贴代码:

C/C++ code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

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?

1

2

3

4

5

6

7

8

9

void RCC_RTC_Configuration()

{

    volatile uint16_t val = 0, val1 = 0;

  

    PWR_BackupAccessCmd(ENABLE);

    BKP_ClearFlag();

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

....

}

 

 

你可能感兴趣的:(stm32)