【发布时间】:2014-12-18 11:00:50
【问题描述】:
我使用的是 Energy Micro 制造的 EFM32G222F128 Gecko 微型处理器。我试图使该芯片的电流消耗尽可能低,为此我想切换核心时钟以使用低频 RC 振荡器 (LFRCO) 而不是高频振荡器。
我知道核心时钟由高频时钟 (HFCLK) 驱动,但这可以由 HF 振荡器或 LF 振荡器控制。默认情况下,它设置为由频率为 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
}
正如您所见,在问题出现之前没有很多代码,这可能是问题的一部分,但我认为情况并非如此。我希望,您可以从 cmets 中看到,所做的一切就是像使用任何 PIC 或微控制器一样初始化芯片,然后启用我希望设置为核心时钟 (LFRCO) 的振荡器,然后等待它在继续之前稳定/准备好。然后我更新处理器以使其了解时钟的变化,然后尝试将 HFCLK 更改为 LFRCO。这是程序放弃生命并停止的地方,它在这行代码上等待大约 1 分 30 秒,我假设它超时并重置芯片,因为所有寄存器都重置为零。
我在 Simplicity Studios 上使用 C 进行编程,它专为与这些芯片一起使用而设计,它带有许多预制库,我也尝试过使用这些库来执行此操作,但它们也不起作用,所以我想我是只是在尝试设置之前错过了我需要做的事情。我已经浏览了reference manual 以及关于振荡器/时钟的应用说明,但我看不到任何我遗漏的东西。
我已经列出了在尝试设置之前所做的所有事情,但仍然一无所获:
- 我启用了振荡器
- 我确保它可以使用了
- 我已经尝试过校准它(不应该这样做,因为它是在生产中完成的,但我还是尝试了)
- 我更新了处理器
- 然后它崩溃了。
我在单步执行代码时查看了所有寄存器,一切似乎都正常,振荡器已启用,我可以将其设置为其他东西的来源,所以它确实可以工作,只是不适合我想要什么。
我的想法有点用完了,我希望过去有人可能遇到过类似的问题,并且能够对这种情况有所了解。
【问题讨论】:
标签: c embedded clock microprocessors