STM32
直播中

文甘翀

7年用户 935经验值
私信 关注
[问答]

STM32F103VC VBAT用3.0V电池供电,VDD掉电时32.768晶体停振怎么解决?

同时Backup中的内容消失。
u8 RTC_Init(void)
{
        u8 temp=0;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);


        BackupData=BKP_ReadBackupRegister(BKP_DR1);
        if (BackupData != 0x4321)
        {
//                        Red_LED_On();

                        PWR_BackupAccessCmd(ENABLE);
               
                        BKP_DeInit();        
                        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //Ò»µ©Ñ¡¶¨²»Äܸü¸Ä£¬³ý·Ç¸´Î»ºó±¸Óò
                        RCC_LSEConfig(RCC_LSE_ON);                        //±ØÐëÔÚÇ°ÃæµÄº¯ÊýÖ®ºóÓÃ
               
                        BKP_TamperPinCmd(DISABLE);

               
               
                while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
                {
                        temp++;
                        Delay_mS(10);
                        if(temp>=250)
                        {
                                return 1;
                        }
                }
               
               

               
                RCC_RTCCLKCmd(ENABLE);
//                RTC_WaitForLastTask();
                RTC_WaitForSynchro();
               
                RTC_WaitForLastTask();
                //RTC_ITConfig(RTC_IT_SEC, ENABLE);        //±ØÐëÔڸú¯ÊýÇ°µ÷ÓÃÇ°ÃæµÄº¯Êý        
               

        
                RTC_EnterConfigMode();
               
               
                RTC_WaitForLastTask();               
                RTC_SetPrescaler(32767);                        //±ØÐëÔڸú¯ÊýÇ°µ÷ÓÃÇ°ÃæµÄº¯Êý
               
                RTC_WaitForLastTask();
                RTC_Set(2017,12,30,07,58,00);

               
                RTC_ExitConfigMode();
                RTC_WaitForLastTask();
                BKP_WriteBackupRegister(BKP_DR1, 0x4321);
                RTC_WaitForLastTask();
               

                BackupData=BKP_ReadBackupRegister(BKP_DR1);
                Delay_mS(10);
                //PWR_BackupAccessCmd(DISABLE);
                Red_LED_Off();
               
        }
        
        else//??????
        {
                RTC_WaitForSynchro();
                RTC_ITConfig(RTC_IT_SEC, ENABLE);
                RTC_WaitForLastTask();
        }
        
        

        RTC_Get_Simple();//¸üÐÂʱ¼ä
        return 0; //ok
}


回帖(2)

彭亚光

2024-4-28 09:28:31
查看晶振旁的电容有没有问题,测量电压对不对,或加个电阻在侧
举报

王璐

2024-4-28 17:29:13
在STM32F103VC微控制器中,当VDD掉电时,32.768kHz晶体可能会停止振荡,导致RTC(实时时钟)功能失效。同时,Backup寄存器中的内容可能会消失。为了解决这个问题,我们可以采取以下步骤:

1. 确保VBAT电源稳定:首先,确保VBAT电源(通常为3.0V电池)能够为RTC和Backup寄存器提供稳定的电源。这可以通过使用低功耗LDO(低压差线性稳压器)或其他稳压器来实现。

2. 配置RTC时钟源:在初始化RTC时,确保选择正确的时钟源。对于STM32F103VC,可以选择LSI(低频内部时钟)或外部32.768kHz晶体作为RTC时钟源。如果使用外部晶体,确保它已正确连接并工作正常。

3. 启用RTC和Backup寄存器:在初始化RTC时,需要启用与RTC相关的时钟,并启用Backup寄存器。这可以通过以下代码实现:

```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
```

4. 检查Backup寄存器内容:在初始化过程中,检查Backup寄存器(如BKP_DR1)的内容,以确定是否需要重新配置RTC。如果Backup寄存器的内容与预期值(如0x4321)不同,可以重新配置RTC。

```c
BackupData = BKP_ReadBackupRegister(BKP_DR1);
if (BackupData != 0x4321) {
    // 重新配置RTC
}
```

5. 配置RTC唤醒源:为了在VDD掉电时唤醒微控制器,可以配置RTC唤醒源。这可以通过设置RTC的唤醒定时器和唤醒中断来实现。

6. 使用低功耗模式:在VDD掉电时,可以使用低功耗模式(如Standby模式)来减少功耗。在Standby模式下,微控制器的功耗将大大降低,同时RTC和Backup寄存器仍然可以工作。

7. 确保足够的电容:在VBAT电源和微控制器的VDDA之间添加足够的去耦电容,以确保在VDD掉电时,VBAT电源能够为RTC和Backup寄存器提供稳定的电源。

通过以上步骤,可以解决STM32F103VC微控制器在VDD掉电时32.768kHz晶体停振和Backup寄存器内容消失的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分