1回答

0收藏

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

STMCU STMCU 7164 人阅读 | 1 人回复 | 2016-08-21

    新做的STM32板,外部32k的时钟调不通,改用外部8MHz高速时钟做RTC时钟源调通了,贴出调试代码供需要的人参考。


测试程序运行效果:



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, 下载次数: 39)

XinChao
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

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

本版积分规则

关闭

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