OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1441|回复: 6

STM32F407 RTC时钟不能设置,开机时间总是清零

[复制链接]

332

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1547
金钱
1547
注册时间
2014-7-11
在线时间
256 小时
发表于 2024-1-25 15:49:39 | 显示全部楼层 |阅读模式
3金钱
原子哥,STM32F407 RTC时钟不能设置,开机时间总是清零

设置管用,开机时间总是清零,

电路加了外部电池,请问是怎么回事

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

305

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2018-11-28
在线时间
214 小时
发表于 2024-1-25 16:00:43 | 显示全部楼层
可能是初始化时清除的
回复

使用道具 举报

5

主题

305

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2018-11-28
在线时间
214 小时
发表于 2024-1-25 16:02:18 | 显示全部楼层
可以发程序上来看看
回复

使用道具 举报

332

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1547
金钱
1547
注册时间
2014-7-11
在线时间
256 小时
 楼主| 发表于 2024-1-25 16:05:27 | 显示全部楼层
用的例程,STM32F407例程 的RTC初始化
回复

使用道具 举报

332

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1547
金钱
1547
注册时间
2014-7-11
在线时间
256 小时
 楼主| 发表于 2024-1-25 16:09:10 | 显示全部楼层
uint8_t rtc_init(void)
{
    uint16_t ssr;
    uint16_t bkpflag = 0;
    uint16_t retry = 200;
    uint32_t tempreg = 0;

    RCC->APB1ENR|=1<<28;        /* ê1&#196;üμ&#231;&#212;′&#189;ó&#191;úê±&#214;ó */
    PWR->CR|=1<<8;              /* oó±&#184;&#199;&#248;óò·&#195;&#206;êê1&#196;ü(RTC+SRAM) */
   
    bkpflag = rtc_read_bkr(0);  /* &#182;áè&#161;BKP0μ&#196;&#214;μ */

    if (bkpflag != 0X5050)      /* &#214;&#174;&#199;°ê1ó&#195;μ&#196;2&#187;ê&#199;LSE */
    {
        RCC->CSR |= 1 << 0;     /* LSI×üê&#199;ê1&#196;ü */

        while (!(RCC->CSR & 0x02)); /* μè′yLSI&#190;íD÷ */

        RCC->BDCR |= 1 << 0;    /* 3¢ê&#212;&#191;a&#198;&#244;LSE */

        while (retry && ((RCC->BDCR & 0X02) == 0))  /* μè′yLSE×&#188;±&#184;o&#195; */
        {
            retry--;
            delay_ms(5);
        }

        tempreg = RCC->BDCR;    /* &#182;áè&#161;BDCRμ&#196;&#214;μ */
        tempreg &= ~(3 << 8);   /* &#199;&#229;á&#227;8/9&#206;&#187; */

        if (retry == 0)tempreg |= 1 << 9;   /* LSE&#191;a&#198;&#244;꧰ü,&#198;&#244;&#182;ˉLSI. */
        else tempreg |= 1 << 8; /* &#209;&#161;&#212;&#241;LSE,×÷&#206;aRTCê±&#214;ó */

        tempreg |= 1 << 15;     /* ê1&#196;üRTCê±&#214;ó */
        RCC->BDCR = tempreg;    /* &#214;&#216;D&#194;éè&#214;&#195;BDCR&#188;&#196;′&#230;&#198;÷ */
        /* 1&#216;±&#213;RTC&#188;&#196;′&#230;&#198;÷D′±£&#187;¤ */
        RTC->WPR = 0xCA;
        RTC->WPR = 0x53;
        RTC->CR = 0;

        if (rtc_init_mode())
        {
            RCC->BDCR = 1 << 16;/* &#184;′&#206;&#187;BDCR */
            delay_ms(10);
            RCC->BDCR = 0;      /*  &#189;áê&#248;&#184;′&#206;&#187; */
            return 2;           /* &#189;&#248;è&#235;RTC3&#245;ê&#188;&#187;ˉ&#196;£ê&#189;꧰ü */
        }

        RTC->PRER = 0XFF;       /* RTCí&#172;2&#189;·&#214;&#198;μ&#207;μêy(0~7FFF),±&#216;D&#235;&#207;èéè&#214;&#195;í&#172;2&#189;·&#214;&#198;μ,&#212;ùéè&#214;&#195;òì2&#189;·&#214;&#198;μ,Frtc=Fclks/((Sprec+1)*(Asprec+1)) */
        RTC->PRER |= 0X7F << 16;/* RTCòì2&#189;·&#214;&#198;μ&#207;μêy(1~0X7F) */
        RTC->CR &= ~(1 << 6);   /* RTCéè&#214;&#195;&#206;a,24D&#161;ê±&#184;&#241;ê&#189; */
        RTC->ISR &= ~(1 << 7);  /* í&#203;3&#246;RTC3&#245;ê&#188;&#187;ˉ&#196;£ê&#189; */
        RTC->WPR = 0xFF;        /* ê1&#196;üRTC&#188;&#196;′&#230;&#198;÷D′±£&#187;¤ */

        if (bkpflag != 0X5051)  /* BKP0μ&#196;&#196;úèY&#188;è2&#187;ê&#199;0X5050,ò22&#187;ê&#199;0X5051,&#203;μ&#195;÷ê&#199;μúò&#187;′&#206;&#197;&#228;&#214;&#195;,Dèòaéè&#214;&#195;ê±&#188;&#228;è&#213;&#198;ú. */
        {
            rtc_set_time(23, 59, 56, 0);/* éè&#214;&#195;ê±&#188;&#228; */
            rtc_set_date(20, 1, 13, 7); /* éè&#214;&#195;è&#213;&#198;ú */
            //rtc_set_alarma(7,0,0,10); /* éè&#214;&#195;&#196;&#214;&#214;óê±&#188;&#228; */
        }

        if (retry == 0)
        {
            rtc_write_bkr(0, 0X5051);   /* ±ê&#188;&#199;ò&#209;&#190;-3&#245;ê&#188;&#187;ˉ1yá&#203;,ê1ó&#195;LSI */
        }
        else
        {
            rtc_write_bkr(0, 0X5050);   /* ±ê&#188;&#199;ò&#209;&#190;-3&#245;ê&#188;&#187;ˉ1yá&#203;,ê1ó&#195;LSE */
        }
    }
    else
    {
        retry = 10;     /* á&#172;D&#248;10′&#206;SSRμ&#196;&#214;μ&#182;&#188;&#195;&#187;±&#228;&#187;ˉ,&#212;òLSE&#203;àá&#203;. */
        ssr = RTC->SSR; /* &#182;áè&#161;3&#245;ê&#188;&#214;μ */

        while (retry)   /* &#188;ì2assr&#188;&#196;′&#230;&#198;÷μ&#196;&#182;ˉì&#172;,à′&#197;D&#182;&#207;LSEê&#199;·&#241;&#213;y3£ */
        {
            delay_ms(10);

            if (ssr == RTC->SSR)        /* &#182;&#212;±è */
            {
                retry--;
            }
            else
            {
                break;
            }
        }

        if (retry == 0) /* LSE1òá&#203;,&#199;&#229;3y&#197;&#228;&#214;&#195;μè′y&#207;&#194;′&#206;&#189;&#248;è&#235;&#214;&#216;D&#194;éè&#214;&#195; */
        {
            rtc_write_bkr(0, 0XFFFF);   /* ±ê&#188;&#199;′í&#206;óμ&#196;&#214;μ */
            RCC->BDCR = 1 << 16;        /* &#184;′&#206;&#187;BDCR */
            delay_ms(10);
            RCC->BDCR = 0;              /* &#189;áê&#248;&#184;′&#206;&#187; */
        }
    }

    //rtc_set_wakeup(4,0);  /* &#197;&#228;&#214;&#195;WAKE UP&#214;D&#182;&#207;,1&#195;&#235;&#214;ó&#214;D&#182;&#207;ò&#187;′&#206; */
    return 0;
}
回复

使用道具 举报

5

主题

305

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2018-11-28
在线时间
214 小时
发表于 2024-1-26 08:51:01 | 显示全部楼层
可以参考这个
  1. u8 RTC_Init(void)
  2. {
  3.         u16 retry=0X1FFF;
  4.         RCC->APB1ENR|=1<<28;                        //使能电源接口时钟
  5.         PWR->CR|=1<<8;                                        //后备区域访问使能(RTC+SRAM)
  6.         if(RTC_Read_BKR(0)!=0X5050)                //是否第一次配置?
  7.         {
  8.                 RCC->BDCR|=1<<0;                        //LSE 开启  
  9.                 while(retry&&((RCC->BDCR&0X02)==0))//等待LSE准备好
  10.                 {
  11.                         retry--;
  12.                         delay_ms(5);
  13.                 }
  14.                 if(retry==0)return 1;                //LSE 开启失败.
  15.                 RCC->BDCR|=1<<8;                        //选择LSE,作为RTC的时钟
  16.                 RCC->BDCR|=1<<15;                        //使能RTC时钟
  17.                 //关闭RTC寄存器写保护
  18.                 RTC->WPR=0xCA;
  19.                 RTC->WPR=0x53;
  20.                 if(RTC_Init_Mode())return 2;//进入RTC初始化模式
  21.                 RTC->PRER=0XFF;                                //RTC同步分频系数(0~7FFF),必须先设置同步分频,再设置异步分频,Frtc=Fclks/((Sprec+1)*(Asprec+1))
  22.                 RTC->PRER|=0X7F<<16;                //RTC异步分频系数(1~0X7F)
  23.                 RTC->CR&=~(1<<6);                        //RTC设置为,24小时格式
  24.                 RTC->ISR&=~(1<<7);                        //退出RTC初始化模式
  25.                 RTC->WPR=0xFF;                                //使能RTC寄存器写保护  
  26.                 RTC_Set_Time(23,59,56,0);        //设置时间
  27.                 RTC_Set_Date(14,5,5,1);                //设置日期
  28.                 //RTC_Set_AlarmA(7,0,0,10);        //设置闹钟时间
  29.                 RTC_Write_BKR(0,0X5050);        //标记已经初始化过了
  30.         }
  31.         //RTC_Set_WakeUp(4,0);                        //配置WAKE UP中断,1秒钟中断一次
  32.         return 0;
  33. }
复制代码
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2022-8-5
在线时间
4 小时
发表于 2024-2-4 15:43:18 | 显示全部楼层
是不是没配置外部低速晶振(32.768KHz)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表