2014-07-07 1 views
2

stm32F0xx 시리즈를 사용 중이며 RTC를 작동 시키려고합니다. 외부 8MHz 크리스털을 연결하고 PLL을 사용하여 48MHz의 sysclk를 생성했습니다. 분명히 RTC와 함께이 시계를 사용하고 싶습니다. 나는 다음을 시도했다 :HSE를 PLL과 함께 사용하여 STM32에서 RTC 클럭을 사용하는 방법

//(1) Write access for RTC registers 
    //(2) Enable init phase 
    //(3) Wait until it is allow to modify RTC register values 
    //(4) set prescaler, 
    //(5) New time in TR 
    //(6) Disable init phase 
    //(7) Disable write access for RTC registers 
    RTC->WPR = 0xCA; //(1) 
    RTC->WPR = 0x53; //(1) 
    RTC->ISR |= RTC_ISR_INIT; //(2) 
    while ((RTC->ISR & RTC_ISR_INITF) != RTC_ISR_INITF) //(3) 
    { 
     //add time out here for a robust application 
    } 
    RCC->BDCR = RCC_BDCR_RTCSEL_HSE; 
    RTC->PRER = 0x007C2E7C; //(4) 
    RTC->TR = RTC_TR_PM | 0x00000001; //(5) 
    RTC->ISR &=~ RTC_ISR_INIT; //(6) 
    RTC->WPR = 0xFE; //(7) 
    RTC->WPR = 0x64; //(7) 

메인 루프에는 두 개의 LED가 켜지고 꺼지는 무한대가있다. RTC 설정이 없으면이 코드는 정상적으로 작동하지만 위의 코드를 추가하자 마자 작동이 멈 춥니 다.

이렇게하면 나머지 코드가 손상됩니다. HSE를 사용할 수 있습니까? 그렇다면 프리스케일러를 올바르게 사용하고 있습니까?

+0

왜 당신은 ST 사용하지 않는 냉동 유지 필요 표준 라이브러리? RTC를 사용하는 API는 이미 구현되어 있습니다. –

+0

두 가지 추상화 수준이 있으므로 ST 라이브러리를 좋아하는 사람이 아닙니다. 첫 번째는 구조체이고 두 번째는 모든 함수입니다. 또한 ST 라이브러리에는 LSE 및 LSI 클럭을 사용할 수있는 옵션 만 있습니다. 내가 필요로하는 HSI 시계가 아닙니다. – TracyB

+0

외부 결정을 사용하고 싶다고하셨습니까? 이것은 HSI가 아닌 HSE이며 ST 라이브러리에서 지원합니다. (RCC_RTCCLKSource_HSE_Div128 검색). –

답변

1

이 예제는 STM32f429에서 RTC 용 HSE를 사용하기위한 실제 작업 코드입니다. STM HAL 소프트웨어 라이브러리를 사용하지만 해결할 단서를 제공 할 수 있습니다.

이 코드 전에 HSE는 이미 주파수 소스로 구성되어 사용되어야합니다.

비고 : 읽을 때 시간뿐만 아니라 날짜도 읽어야합니다. 예 : HAL_RTC_GetTime (& RTChandle, & RTCtime, FORMAT_BIN); // 먼저 HAL_RTC_GetDate (& RTChandle, & RTCdate, FORMAT_BIN); // 두 번째, 당신이 그나마 경우에도이 그렇지 않으면 레지스터 (디버그 두 레지스터를 읽기 때문에 당신이 볼이 경우는, 단지 디버거에서가 아니라 실제 실행 틱)

// enable access to rtc register 
HAL_PWR_EnableBkUpAccess(); 
// 1. 8Mhz oscillator (Source crystal! Not after PLL!) div by 8 = 1 Mhz 
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_HSE_DIV8); 
RTChandle.Instance = RTC; 
RTChandle.Init.HourFormat = RTC_HOURFORMAT_24; 
// 2. (1 Mhz/125) = 7999 ticks per second 
RTChandle.Init.AsynchPrediv = 125 - 1; 
RTChandle.Init.SynchPrediv = 8000 - 1; 
RTChandle.Init.OutPut = RTC_OUTPUT_DISABLE; 
RTChandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; 
RTChandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; 

// do init 
HAL_RTC_Init(&RTChandle); 
// enable hardware 
__HAL_RCC_RTC_ENABLE(); 
관련 문제