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

Posted

技术标签:

【中文标题】如何将 HFCLK 更改为由微处理器上的低频振荡器控制?【英文标题】:How can I change the HFCLK to be controlled by a low frequency oscillator on my microprocessor? 【发布时间】: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 以及关于振荡器/时钟的应用说明,但我看不到任何我遗漏的东西。 我已经列出了在尝试设置之前所做的所有事情,但仍然一无所获:

我启用了振荡器 我确保它可以使用了 我已经尝试过校准它(不应该这样做,因为它是在生产中完成的,但我还是尝试了) 我更新了处理器 然后它崩溃了。

我在单步执行代码时查看了所有寄存器,一切似乎都正常,振荡器已启用,我可以将其设置为其他东西的来源,所以它确实可以工作,只是不适合我想要什么。

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

【问题讨论】:

【参考方案1】:

既然您已经在使用 EMU_UpdateOscConfig() 的 EFM32 库,我不确定您为什么不直接使用 CMU_ClockSelectSet( cmuClock_CORE, cmuSelect_LFRCO )?我建议如果您完全使用该库,则将其用于所有内容,而不是将库使用与直接寄存器访问混合使用。

查看source code 的CMU_ClockSelectSet(),它会执行许多您没有执行的操作,或者以不同的顺序执行。

【讨论】:

以上是关于如何将 HFCLK 更改为由微处理器上的低频振荡器控制?的主要内容,如果未能解决你的问题,请参考以下文章

RC振荡电路

音效处理Vibrato 简介

音频处理Channel Vocoder 算法简介

音频处理Channel Vocoder 算法简介

音效处理Reverb 混响算法简介

音效处理Reverb 混响算法简介