2

stm32F0xx シリーズを使用しており、RTC を機能させようとしています。外部 8MHz クリスタルを接続し、PLL を使用して 48MHz の sysclk を生成しています。明らかに、このクロックを 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)

メイン ループには、2 つの LED のオンとオフを切り替える無限の for があります。RTC 構成がなければこれは正常に機能しますが、上記のコードを追加するとすぐに機能しなくなります。

これを行うと、残りのコードが壊れます。HSE を使用できますか? 使用できる場合、プリスカラーを正しく使用していますか?

4

1 に答える 1

2

この例は、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();
于 2015-04-21T16:47:10.070 に答える