我使用的是由Energy Micro制造的EFM32G2222F128壁虎微力器。我试图使这个芯片的电流消耗尽可能低,为此,我想切换核心时钟使用低频RC振荡器(LFRCO)而不是高频RC振荡器。
我知道核心时钟是由高频时钟(HFCLK)驱动的,但这可以由高频振荡器或低频振荡器控制。默认情况下,它被设置为由频率为14MHz的HFRCO on reset/power on控制(默认情况下,这可能在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语言在简易工作室编程的,这个工作室是为这些芯片设计的,它有很多预先制作的库,我也试过用它们来做这个,但它们也不起作用,所以我想我只是错过了一些我需要做的事,然后才试图设置它。我已经浏览了reference manual以及振荡器/时钟的应用说明,但我看不到任何我遗漏的东西。
我列了一张清单,上面列出了在试图设定之前所做的一切,但仍然一无所获:
我启动振荡器
我确保它可以使用
我试过校准它(不需要像生产时那样做,但我还是试过了)
我更新处理器
然后就崩溃了。
我看了所有的寄存器,同时逐步通过代码和一切似乎是它应该的,振荡器是启用的,我可以设置它是其他东西的来源,所以它确实工作,只是不为我想要的。
我有点想不通了,我希望有人可能在过去也有过类似的问题,能够对这种情况有所了解。

最佳答案

既然您已经在使用带有EMU_UpdateOscConfig()的EFM32库,我不确定您为什么不直接使用CMU_ClockSelectSet( cmuClock_CORE, cmuSelect_LFRCO )?我建议如果你使用这个库的话,你应该把它用于所有的事情,而不是把库的使用和直接的注册访问混合起来。
查看source codeCMU_ClockSelectSet(),它会执行许多您没有执行或正在按不同顺序执行的操作。

09-30 18:12