打印
[STM32]

STM32的RTC初始化不成功

[复制链接]
2712|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一切会如旧 于 2015-3-24 18:52 编辑

初始化程序如下:

u8 RTC_Init(void)
{
        //检查是不是第一次配置时钟
        u8 temp=0;

        if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)                //从指定的后备寄存器中读取数据:读出了与写入的指定数据不相符
                {                                 
                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);
                        }
                if(temp>=250)return 1;//初始化时钟失败,晶振有问题
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);                //设置RTC时钟(RTCCLK),选择LSE作为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_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                RTC_Set(2015,03,24,15,28,00);  //设置时间        
                RTC_ExitConfigMode(); //退出配置模式
                BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);        //向指定的后备寄存器中写入用户数据
                        
               
                }
        else//系统继续计时
                {

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

}        

经过调试,发现程序执行到加下划线的那个while循环里就出不来了,因为RTC要用到外部低速晶振,这个循环就是判断外部低速晶振有没有就绪。
卡在这的话说明低速晶振没有就绪,是因为晶振坏了吗?还有没有其他原因。
下面是我用的低速晶振:

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

158

帖子

0

粉丝