你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32笔记(五)RTC的初始化

[复制链接]
私奔 提问时间:2009-1-4 14:39 /
本系列皆来自于九九的博客
  这次是RTC的笔记:)
RTC这东西晕晕的,因为一个模块涉及到了RTC,BKP,RCC多个模块,之间的关系让人有点模糊
入门的知识请大家看手册,我来总结:
总之,RTC只是个能靠电池维持运行的32位定时器over!
所以,使用时要注意以下问题:
1. 上电后要检查备份电池有没有断过电。如何检查? 恩,RTC的示例代码中已经明示:
   往备份域寄存器中写一个特殊的字符,备份域寄存器是和RTC一起在断电下能保存数据的。
   上电后检查下这个特殊字符是否还存在,如果存在,ok,RTC的数据应该也没丢,不需要重新配置它
   如果那个特殊字符丢了,那RTC的定时器数据一定也丢了,那我们要重新来配置RTC了
   这个过程包括时钟使能、RTC时钟源切换、设置分频系数等等,这个可以参考FWLib\example\RTC\Calendar的代码
   在我的这个实例里,检查备份域掉电在Init.c的RTC_Conig()中,函数内若检测到BKP掉电,则会调用RTC_Configuration()

2. 因为RTC的一些设置是保存在后备域中的,so,操作RTC的设置寄存器前,要打开后备域模块中的写保护功能。
3. RTC设定值写入前后都要检查命令有没有完成,调用RTC_WaitForLastTask();
 
  具体的RTC初始化代码如下:

////////////////////////////////////////////////////////////////////////////////

// RTC时钟初始化!
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : 来重新配置RTC和BKP,仅在检测到后备寄存器数据丢失时使用
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Configuration(void)
{
    //启用PWR和BKP的时钟(from APB1)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    //后备域解锁
    PWR_BackupAccessCmd(ENABLE);

    //备份寄存器模块复位
    BKP_DeInit();

    //外部32.768K其哟偶那个
    RCC_LSEConfig(RCC_LSE_ON);
    //等待稳定
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

    //RTC时钟源配置成LSE(外部32.768K)
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    //RTC开启
    RCC_RTCCLKCmd(ENABLE);

    //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
    RTC_WaitForSynchro();

    //读写寄存器前,要确定上一个操作已经结束
    RTC_WaitForLastTask();

    //设置RTC分频器,使RTC时钟为1Hz
    //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
    RTC_SetPrescaler(32767);


    //等待寄存器写入完成
    RTC_WaitForLastTask();

    //使能秒中断
    RTC_ITConfig(RTC_IT_SEC, ENABLE);   

    //等待写入完成
    RTC_WaitForLastTask();

    return;
}

/*******************************************************************************
* Function Name  : RTC_Config
* Description    : 上电时调用本函数,自动检查是否需要RTC初始化,
*                     若需要重新初始化RTC,则调用RTC_Configuration()完成相应操作
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Config(void)
{
    //我们在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
    //第一次上电或后备电源掉电后,该寄存器数据丢失,
    //表明RTC数据丢失,需要重新配置
    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
    {
        //重新配置RTC
        RTC_Configuration();
        //配置完成后,向后备寄存器中写特殊字符0xA5A5
        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
    }
    else
    {
        //若后备寄存器没有掉电,则无需重新配置RTC
        //这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型
        if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
        {
            //这是上电复位
        }
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
        {
            //这是外部RST管脚复位
        }
        //清除RCC中复位标志
        RCC_ClearFlag();

        //虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
        //但是每次上电后,还是要使能RTCCLK???????
        //RCC_RTCCLKCmd(ENABLE);
        //等待RTC时钟与APB1时钟同步
        //RTC_WaitForSynchro();

        //使能秒中断
        RTC_ITConfig(RTC_IT_SEC, ENABLE);
        //等待操作完成
        RTC_WaitForLastTask();
    }

#ifdef RTCClockOutput_Enable
    /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    /* Disable the Tamper Pin */
    BKP_TamperPinCmd(DISABLE);

    /* Enable RTC Clock Output on Tamper Pin */
    BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
#endif

    return;
}
收藏 评论2 发布时间:2009-1-4 14:39

举报

2个回答
得蜜 回答时间:2009-1-5 14:34:44

回复:STM32笔记(五)RTC的初始化

我是来帮楼主加附件的。

初始化.rar

下载

179.12 KB, 下载次数: 36

wmh-129266 回答时间:2012-3-5 23:09:45

回复:STM32笔记(五)RTC的初始化

晶振 6pF也不会动..怎么办?
STM32 最大的bug
 

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版