查看: 5682|回复: 1

[每日一帖]STM32使用外部8M时钟的RTC程序

[复制链接]
  • TA的每日心情
    无聊
    2020-7-7 14:50
  • 签到天数: 284 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-8-21 20:27:09 | 显示全部楼层 |阅读模式
    分享到:
        新做的STM32板,外部32k的时钟调不通,改用外部8MHz高速时钟做RTC时钟源调通了,贴出调试代码供需要的人参考。


    测试程序运行效果:
    捕获.JPG


    RTC初始化部分代码:
    u8 RTC_Init(void)        //初始化RTC时钟,同时检测时钟是否工作正常 (返回0-错误 1-第一次配置 2-配置OK)
    {
            u8 temp;

            //检查是不是第一次配置时钟
            if(BKP->DR1 != 0x1234)        //第一次配置
            {
                    //------------------------------------
                    RCC->APB1ENR        |= 1 << 28;        //bit28-PWREN 电源接口时钟使能(0-关闭 1-开启)
                    RCC->APB1ENR        |= 1 << 27;        //bit27-BKPEN 备份接口时钟使能(0-关闭 1-开启)

                    PWR->CR                |= 1 << 8;        //取消备份区写保护(注:如果RTC的时钟是HSE/128,该位必须保持为1)
                                                    //bit8-DBP 取消后备区域的写保护(0-禁止写入RTC和后备寄存器 1-允许写入RTC和后备寄存器)

                    RCC->BDCR        |= 1 << 16;        //备份区域软复位
                    RCC->BDCR        &= ~(1 << 16);        //备份区域软复位结束
                                                    //bit16-BDRST 备份域软件复位(0-复位未激活 1-复位整个备份域)
                    //------------------------------------HSE作为RTC时钟
                    RCC->BDCR        |= 3 << 8;        //bit8-9-RTCSEL RTC时钟源选择(0-无时钟 1-LSE 2-LSI 3-HSE128分频)
                    //------------------------------------RTC时钟使能
                    RCC->BDCR        |= 1 << 15;        //bit15-RTCEN RTC时钟使能(0-RTC时钟关闭 1-RTC时钟开启)
                    //------------------------------------
                    while(!(RTC->CRL & (1 << 5)));        //bit5-RTOFF 等待RTC寄存器操作完成

                    while(!(RTC->CRL & (1 << 3)));        //bit3-RSF 寄存器同步标志 --- 等待RTC寄存器同步

                    RTC->CRH        = 0;                //关闭RTC中断
                    //------------------------------------
                    while(!(RTC->CRL & (1 << 5)));        //bit5-RTOFF 等待RTC寄存器操作完成

                    RTC->CRL        |= 1 << 4;        //bit4-CNF 配置标志 --- 允许配置

                    RTC->RLH        = 0x0000;
                    RTC->RLL        = 62500;        //时钟周期设置
                    //------------------------------------
                    RTC_Set(2014,10,12, 11,45,00);        //设置时间

                    RTC->CRL        &= ~(1 << 4);        //配置更新

                    while(!(RTC->CRL & (1 << 5)));        //bit5-RTOFF 等待RTC寄存器操作完成
                    //------------------------------------
                    BKP->DR1        = 0x1234;

                    temp = 1;        //FIRST TIME
            }
            else                        //系统继续计时
            {
                    RCC->APB1ENR |= 1 << 28;//bit28-PWREN 电源接口时钟使能(0-关闭 1-开启)
                    RCC->APB1ENR |= 1 << 27;//bit27-BKPEN 备份接口时钟使能(0-关闭 1-开启)
                    PWR->CR             |= 1 << 8;        //取消备份区写保护(注:如果RTC的时钟是HSE/128,该位必须保持为1)

                    while(!(RTC->CRL & (1 << 5)));        //bit5-RTOFF 等待RTC寄存器操作完成

                    while(!(RTC->CRL & (1 << 3)));        //bit3-RSF 寄存器同步标志 --- 等待RTC寄存器同步

                    RTC->CRH        = 0;                //关闭RTC中断

                    while(!(RTC->CRL & (1 << 5)));        //bit5-RTOFF 等待RTC寄存器操作完成

                    temp = 2;
            }

            MY_NVIC_Init(0, 0, RTC_IRQn, 2);        //优先级设置

            RTC_Get();                                //更新时间

            return temp;                                //ok
    }


    主函数:
    int main(void)
    {
            //------------------------------------
            u8 t;
            //------------------------------------
            Stm32_Clock_Init(SYS_CLK/HSE_OSC);        //系统时钟设置
            uart_init(SYS_CLK, 115200);                //串口初始化为115200
            //------------------------------------
            printf("\r\n\r\nXinChao's STM32!");
            //------------------------------------
            printf("\r\nRTC Init ... ");

            t = RTC_Init();                //RTC初始化
            if(t == 1)
            {
                    printf("第一次配置!");
            }
            else if(t == 2)
            {
                    printf("配置OK !");
            }
            else
            {
                    printf("RTC Error!   RTC初始化失败!晶振有问题!");
            }
            //------------------------------------
            Set_RTC_IRQ(1);                //打开秒中断
            //------------------------------------
            while(1)
            {
                    if(SencondFlag)
                    {
                            SencondFlag = 0;

                            printf("\r\n当前时间:%02u-%02u-%02u %02u:%02u:%02u",
                                            calendar.w_year,
                                            calendar.w_month,
                                            calendar.w_date,
                                            calendar.hour,
                                            calendar.min,
                                            calendar.sec);
                    }
            }
    }


    完整的代码: STM32-RTC.zip (88.88 KB, 下载次数: 38)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 00:24 , Processed in 0.135658 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.