Hallo allerseits,
ich habe ein Problem beim aktivieren eines Oscillators im
EnergyMicro-Controller.
Dies ist der Code:
#define RTC_FREQ 32768
///////////////////////////////
void RTC_IRQHandler(void)
{
/* Clear interrupt source */
RTC_IntClear(RTC_IFC_COMP0);
GPIO_PinOutToggle(gpioPortA, 1);
}
///////////////////////////////
void rtcSetup(void)
{
RTC_Init_TypeDef rtcInit = RTC_INIT_DEFAULT;
/* Enable LE domain registers */
CMU_ClockEnable(cmuClock_CORELE, true);
/* Enable LFXO as LFACLK in CMU. This will also start LFRCO */
CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO);
/* Set a clock divisor of 32 to reduce power conumption. */
CMU_ClockDivSet(cmuClock_RTC, cmuClkDiv_32);
/* Enable RTC clock */
CMU_ClockEnable(cmuClock_RTC, true);
/* Initialize RTC */
rtcInit.enable = false; /* Dont start until initi. is complete. */
rtcInit.debugRun = false; /* Halt RTC when debugging. */
rtcInit.comp0Top = true; /* Wrap around on COMP0 match. */
RTC_Init(&rtcInit);
/* Interrupt every Second */
RTC_CompareSet(0, (RTC_FREQ / 32));
/* Enable interrupt */
NVIC_EnableIRQ(RTC_IRQn);
RTC_IntEnable(RTC_IEN_COMP0);
/* Start Counter */
RTC_Enable(true);
}
///////////////////////////////////////////////////
... wird diese Funktion nun in der main() aufgerufen, dann läuft sie bis
zu der folgenden Unter-Funktion und bleibt dort stehen:
(zu finden in der efm32_cmu.c)
if(enable)
CMU->OSCENCMD = enBit;
/* Wait for clock to stabilize if requested */
if (wait)
{
while (!(CMU->STATUS & status)) // HIER BLEIBT DIE FUNKTION STEHEN
;
}
}
In der rtcSetup besteht die Möglichkeit, den Clock-Wechsel zu verzögern,
bis die gewählte Clock stabil läuft. Wählt man diese Option (habe ich
getan), dann muss wohl erst die Zeit "wait" ablaufen. Leider tut sie es
nicht... Das Programm verbleibt also permanent in der while Schleife...
Wenn ich einen externen Oscillator verwenden würde, könnte es ja
immernoch sein, dass der nicht stabil läuft, aber ich habe als
Clock-Source mitlerweile den internen cmuSelect_LFRCO ausgewählt,
welcher ja nun in jedem Fall stabil genug laufen muss.
Meine Vermutung ist also, dass ich irgendwie vorher einen Interrupt
zulassen muss, damit die wait Zeit überhaupt ablaufen kann...
Innerhalb des read-only Registers CMU_STATUS gibt es das "LFXO Ready"
Flag. Ich denke, dass sich hiermit das Problem lösen lässt, offenbar
muss dieses in einer übergeordneten Interrupt-Routine gesetzt werde...,
soweit meine Vermutung.
nur wie...
Habe bisher mit den ARM-Cortex-M3 nicht viel Erfahrung, daher diese wohl
sehr simple Frage...
mfg und vielen dank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.