2013-09-02 14 views
7

IAR derleyicisini kullanarak STM32L152RB Discovery kartında Gerçek Zaman Saati uygulaıyorum. Ben HSI üzerinde Saat yapılandırmasını uygulamış ve PLL ben 4. Kod bunu çoğaldı kullanarak ->Sadece LSI/LSE/HSE'de Stm32L'de RTC'nin saat yapılandırması?

/* Enable HSI Clock */ 
RCC_HSICmd(ENABLE); 

/*!< Wait till HSI is ready */ 
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); 

RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_4,RCC_PLLDiv_2); 
RCC_PLLCmd(ENABLE); 
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); 

/* Set HSI as sys clock*/ 
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 

Ben RTC Saat kaynağı olarak ikincil saat LSE ayarlamak zorunda Gerçek Zamanlı saat yapılandırılırken olduğunu sorun Benim durumumda kaynak saatim HSI. PWR denetleyicisini etkinleştiren, rtc etki alanı erişimini, rtc saat kaynağını, rtc_init(), sonra da ayarlamayı ve aramayı etkinleştiren adımların geri kalanı, bildiğim kadarıyla iyidir. İşte Denedim koddur - alırım>

/* Enable RTC clocks and rtc related functions */ 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 
PWR_RTCAccessCmd(ENABLE); 

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //This part I think is wrong 
RCC_RTCCLKCmd(ENABLE); 
RTC_InitTypeStructure.RTC_HourFormat=RTC_HourFormat_12; 
RTC_InitTypeStructure.RTC_AsynchPrediv=0x7F; 
RTC_InitTypeStructure.RTC_SynchPrediv=0xFF; 
RTC_Init(&RTC_InitTypeStructure); 
/* End RTC Clock */ 
RTC_TimeTypeTime.RTC_Hours=18; 
RTC_TimeTypeTime.RTC_Minutes=11; 
RTC_TimeTypeTime.RTC_Seconds=4; 
RTC_TimeTypeTime.RTC_H12=RTC_H12_PM; 
RTC_SetTime(RTC_Format_BIN, &RTC_TimeTypeTime); 
while(1){ 
    f_SleepMs(10); 
    RTC_GetTime(RTC_Format_BIN, &RTC_TimeTypeTime); 
    RELEASE_MSG("\r%d:%d:%d",RTC_TimeTypeTime.RTC_Hours,RTC_TimeTypeTime.RTC_Minutes,RTC_TimeTypeTime.RTC_Seconds); 
} 

Çıktı 0:0:0 bunu çözüldü

cevap

6

,

/* Allow access to the RTC */ 
PWR_RTCAccessCmd(ENABLE); 

/* Reset RTC Backup Domain */ 
RCC_RTCResetCmd(ENABLE); 
RCC_RTCResetCmd(DISABLE); 

/* LSE Enable */ 
RCC_LSEConfig(RCC_LSE_ON); 

/* Wait until LSE is ready */ 
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); 

/* RTC Clock Source Selection */ 
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 

/* Enable the RTC */ 
RCC_RTCCLKCmd(ENABLE); 

LSE sadece Dış Crystal veya osilatör ile çalışabilir olduğunu. İç kristal LSI için kullanılabilir.

1

bu STM32F051 (STM32F0Discovery) için çalıştığını teyit edebilir:

RTC_InitTypeDef R; 
RTC_TimeTypeDef T; 

// Enable PWR clock 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 

/* Enable the Backup Domain Access */ 
PWR_BackupAccessCmd(ENABLE); 

/* Disable RTC clock */ 
RCC_RTCCLKCmd(DISABLE); 
/* Enable RTC clock */ 
RCC_RTCCLKCmd(ENABLE); 


RCC_LSEDriveConfig(RCC_LSEDrive_High); // i think this is optional 
/* LSE Enable */ 
RCC_LSEConfig(RCC_LSE_ON); 

/* Wait until the LSE crystal is ready */ 
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){ 
} 

/* Set RTC clock source to LSE */ 
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 
R.RTC_AsynchPrediv = 0x7F; 
R.RTC_SynchPrediv = 0xFF; 


/* Enable RTC clock */ 
RCC_RTCCLKCmd(ENABLE); 

/* Waits until the RTC Time and Date registers are synchronized with RTC APB clock.*/ 
RTC_WaitForSynchro(); 

/* Set hour format to 24hrs */ 
R.RTC_HourFormat = RTC_HourFormat_24; 

/* initialize the RTC */ 
if (RTC_Init(&R) == ERROR){ 
    printf("RTC init failed \r\n"); 
} 

printf("RTC done. \r\n"); 

while(1){ 
    RTC_GetTime(RTC_Format_BIN, &T); 
    printf("the time is %02d : %02d : %02d \r\n", T.RTC_Hours, T.RTC_Minutes, T.RTC_Seconds); 
} 
İlgili konular