zoukankan      html  css  js  c++  java
  • stm32 rtc时钟 RTC_WaitForSynchro();死循环解决办法

    内部晶振低速时钟40KHZ    在if外开启时钟

    //实时时钟配置
    //初始化RTC时钟,同时检测时钟是否工作正常
    //BKP->DR1用于保存是否第一次配置的设置
    //返回0:正常
    //其他:错误代码

    u8 RTC_Init(void)
    {
    //检查是不是第一次配置时钟
    u8 temp=0;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
    PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
    RCC_LSICmd(ENABLE); //设置内部低速晶振(LSI)
    if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
    {
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
    //PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
    BKP_DeInit(); //复位备份区域
    //RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
    // while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
    // {
    // temp++;
    // delay_ms(10);
    // }
    //RCC_LSICmd(ENABLE); //设置内部低速晶振(LSI)
    while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
    {
    temp++;
    delay_ms(10);
    }
    if(temp>=250)return 1;//初始化时钟失败,晶振有问题
    // RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //设置RTC时钟(RTCCLK),选择LSI作为RTC时钟
    RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
    RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
    RTC_WaitForSynchro(); //等待RTC寄存器同步
    RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
    RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
    RTC_EnterConfigMode();/// 允许配置
    // RTC_SetPrescaler(32767); //设置RTC预分频的值
    RTC_SetPrescaler(40000); //设置RTC预分频的值
    RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
    RTC_Set(2017,3,6,0,0,0); //设置时间
    RTC_ExitConfigMode(); //退出配置模式
    BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
    }
    else//系统继续计时
    {

    RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
    RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
    RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
    }
    RTC_NVIC_Config();//RCT中断分组设置
    RTC_Get();//更新时间
    return 0; //ok

    }

  • 相关阅读:
    HashMap源码学习
    java线程池
    MySQL的MVCC
    volatile关键字学习
    ArrayList, Vector和CopyOnWriteArrayList对比学习
    曹工说Redis源码(3)-- redis server 启动过程完整解析(中)
    曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充
    曹工杂谈:我们的应用,启动就要去其他服务拉数据,那其他服务挂了,我们就起不来了?
    程序员正确的提问方式(个人建议)
    曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果
  • 原文地址:https://www.cnblogs.com/yekongdexingxing/p/6514174.html
Copyright © 2011-2022 走看看