void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus;
//使能外部晶振 RCC_HSEConfig(RCC_HSE_ON); //等待外部晶振稳定 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //如果外部晶振启动成功,则进行下一步操作 if(HSEStartUpStatus==SUCCESS) { //开启FLASH预取指功能 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//FLASH时序控制 //推荐值:SYSCLK = 0~24MHz Latency=0 // SYSCLK = 24~48MHz Latency=1 // SYSCLK = 48~72MHz Latency=2 FLASH_SetLatency(FLASH_Latency_2);
//设置HCLK(AHB时钟)=SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK2(APB2) = HCLK RCC_PCLK2Config(RCC_HCLK_Div1);
//PCLK1(APB1) = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2);
//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//启动PLL RCC_PLLCmd(ENABLE);
//等待PLL稳定 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//系统时钟SYSCLK来自PLL输出 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切换时钟后等待系统时钟稳定 while(RCC_GetSYSCLKSource()!=0x08) { } } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ /* Go to infinite loop */ while (1) { } }
//下面是给各模块开启时钟 //启动GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); //启动AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); }
void RTC_Configuration(void) { //启用PWR和BKP的时钟(from APB1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
//后备域解锁 PWR_BackupAccessCmd(ENABLE);
//备份寄存器模块复位 BKP_DeInit();
//外部32.768K RCC_LSEConfig(RCC_LSE_ON);
//等待稳定 while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);
//RTC时钟源配置成LSE(外部32.768K) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//RTC开启 RCC_RTCCLKCmd(ENABLE);
//开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器 RTC_WaitForSynchro();
//读写寄存器前,要确定上一个操作已经结束 RTC_WaitForLastTask();
//设置RTC分频器,使RTC时钟为1Hz //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) RTC_SetPrescaler(32763); //加快一点,设置为32767一天慢20秒 设置为32764一天慢1秒
//等待寄存器写入完成 RTC_WaitForLastTask();
//使能秒中断 RTC_ITConfig(RTC_IT_SEC,ENABLE);
//等待写入完成 RTC_WaitForLastTask(); }
实在查不出问题在哪儿,看到很多关于STM的RTC不准的问题,是不是也是这个原因。
|