2014-12-18 6 views
1

Energy Micro에서 제조 한 Gecko microporcessor 인 EFM32G222F128을 사용하고 있습니다. 나는이 칩의 전류 소모를 가능한 한 낮추고 고주파 대신 저주파수 RC 발진기 (LFRCO)를 사용하도록 코어 클록을 전환하려고한다.내 마이크로 프로세서의 저주파 발진기로 제어 할 HFCLK를 어떻게 변경합니까?

코어 클럭은 고주파 클럭 (HFCLK)으로 구동되지만 HF 발진기 또는 LF 발진기로 제어 할 수 있습니다. 기본적으로 이것은 14MHz의 주파수를 가진 리셋/파워 온에서 HFRCO에 의해 제어되도록 설정되어있다. (역시 기본값이지만 다시 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 초 전에이 코드 라인에서 대기하고, 시간이 초과되고 모든 레지스터가 0으로 리셋되어 칩을 재설정합니다.

나는이 칩과 함께 사용하도록 설계된 Simplicity Studios의 C를 사용하여 프로그래밍 중이며이 제품을 사용하기 위해 시도한 사전 제작 라이브러리도 많이 제공되지만 작동하지 않기 때문에 그것을 설정하기 전에 내가해야 할 일을 놓치고 있습니다. 난 reference manual뿐만 아니라 발진기/시계에 대한 응용 프로그램 노트를 샅샅이 살펴 봤지만 빠진 것이 아무것도 보이지 않습니다. 내가 오실레이터를 사용

  • 내가 그것을
  • 내가 그것을 교정 시도 사용할 준비가되어 있는지 확인 :
    내가 다의 목록을 만들었은 여전히 ​​아무것도를 설정하기 전에 수행 한 (생산할 때 수행해야 할 필요는 없지만 어쨌든 시도했습니다.)
  • 프로세서를 업데이트합니다.
  • 그러면 충돌이 발생합니다.

내가 코드를 단계별로 실행하면서 모든 레지스터를 살펴본 결과, 오실레이터가 활성화되어 있고 다른 소스의 소스가되도록 설정할 수 있으므로 확실히 작동합니다. 내가 원하는 것을 위해서가 아닙니다.

나는 일종의 아이디어가 없으며 누군가가 과거에 비슷한 문제를 겪고 있었기 때문에이 상황에 대해 밝힐 수 있기를 바랬다.

답변

2

이미 EMU_UpdateOscConfig()으로 EFM32 라이브러리를 사용하고 있으므로 CMU_ClockSelectSet(cmuClock_CORE, cmuSelect_LFRCO)을 사용하지 않는 이유는 무엇입니까? 라이브러리를 전혀 사용하지 않는다면 라이브러리를 직접 등록 액세스로 혼합하는 대신 모든 용도로 사용하는 것이 좋습니다.

CMU_ClockSelectSet()으로 보았을 때 사용자가하지 않거나 다른 순서로 수행하는 여러 가지 작업을 수행합니다.