2013-09-02 4 views
7

IARコンパイラを使用してSTM32L152RBディスカバリボードにリアルタイムクロックを実装しています。私は、HSI上のクロック設定を実装し、私は4.コードでそれを掛けてきたPLLを使用している - >LSI/LSE/HSEのみのStm32LのRTCのクロック構成ですか?

/* 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); 

をリアルタイムクロックを設定している間に問題がある、私はRTCクロック源として二次クロックLSEを設定する必要があります私の場合、ソースクロックはHSIです。 PWRコントローラの有効化、rtcドメインアクセスの有効化、rtcクロックソースのrtc_init()、settimeとgettimeなどの手順の残りの部分は、わかっている通りです。ここで私が試したコードがある - >

/* 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); 
} 

私が手出力は0:0:0

答えて

6

は、LSEが唯一の外部水晶や発振器で動作することができ、これをやって

/* 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); 

を解決しています。内部の水晶LSI用に使用できます。

1

私は、これはSTM32F051(STM32F0Discovery)のために動作していることを確認することができます

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); 
} 
関連する問題