如何更改HFCLK由微处理器上的低频振荡器控制?

时间:2014-12-18 11:00:51

标签: c embedded clock microprocessors

我正在使用Energy Micro制造的EFM32G222F128 Gecko微型进样器。我试图让这个芯片的电流消耗尽可能低,并且这样做我想切换核心时钟使用低频RC振荡器(LFRCO)而不是高频振荡器。

我知道核心时钟由高频时钟(HFCLK)驱动,但这可以由HF振荡器或LF振荡器控制。默认情况下,它设置为由复位/电源上的HFRCO控制,频率为14MHz(默认情况下也是如此,但这可能介于1MHz - 28MHz之间),我的问题是频率越高,电流消耗越高芯片,所以我想把核心时钟更改为这个低频振荡器,这是32.768KHz - 低得多。

有两个板载振荡器--HFRCO和LFRCO - 因此我没有这个组件可用的问题,我只是不知道为什么我现在的代码不起作用。这是代码,我将在下面解释:

int main(void){ 

    /* Chip errata */
    CHIP_Init();

    CMU->OSCENCMD = (1 << 6);          // Enable LFRCO oscillator
    while(!(CMU->STATUS & (1 << 7)));  // Wait for oscillator to stabilize

    EMU_UpdateOscConfig();

    CMU->CMD = (3 << 0);               // Set LFRCO as HF core clock **PROBLEM**

    CMU->OSCENCMD = (1 << 1);          // Disable HFRCO
}

正如您所看到的,在问题出现之前没有很多代码可能是问题的一部分,但我不认为是这种情况。我希望,你可以从评论中看到,所有这一切都是像任何PIC或微控制器一样初始化芯片,然后启用振荡器我希望设置为我的核心时钟(LFRCO),然后等待它在继续前进行稳定/准备。然后我更新处理器以使其随时了解时钟的变化,然后尝试将HFCLK更改为LFRCO。这是程序放弃生命和停止的地方,它等待这行代码大约1分30秒之前,我认为,它超时并重置芯片,因为所有寄存器都重置为零。

我正在使用C on Simplicity Studios进行编程,这是专为与这些芯片一起使用而设计的,它附带了许多预制的库,我也尝试过这样做但是它们也没有工作所以我认为在尝试设置它之前,我只是错过了我需要做的事情。我已经浏览了reference manual以及关于振荡器/时钟的应用说明,但我看不到任何我遗漏的东西。
我已经列出了所有已经完成的事情,然后尝试设置它仍然没有:

  • 启用振荡器
  • 我确保它已准备好使用
  • 我已经尝试过校准它(不应该像在生产时那样完成,但我还是试过了)
  • 我更新处理器
  • 然后它崩溃了。

我在查看代码时看了所有的寄存器,一切似乎都应该如此,振荡器已启用,我可以将其设置为其他东西的来源,所以它确实有效,只是不是为了我想要它。

我有点想法,我希望有人可能在过去遇到过类似的问题,并且能够对这种情况有所了解。

1 个答案:

答案 0 :(得分:2)

由于您已经将EFM32库与EMU_UpdateOscConfig()一起使用,我不确定为什么您不会简单地使用CMU_ClockSelectSet( cmuClock_CORE, cmuSelect_LFRCO )?我建议如果您根本使用该库,则将其用于所有内容,而不是将库使用与直接寄存器访问混合使用。

查看CMU_ClockSelectSet()的{​​{3}},它会执行许多您未执行或正在执行的操作。