본문 바로가기
임베디드.일렉트로닉스/nRF52

nRF52. Clock Control 구현.

by 리치굿맨 2019. 1. 13.



 

개요

   

nRF52 의 클럭소스는 내부오실레이터 혹은 외부크리스탈 기반 오실레이터 선택적으로 사용 가능하게 되어있고, 별도 설정하지 않으면 내부 클럭 사용된다. 코드에서 외부 크리스탈 을 클럭 소스로 사용하게 하는 코딩과정 상세 정리. 


 nRF52 의 Clock  제어하기 위해서는 레지스터 직접 접근해도 되고, nRF5 SDK 에서 제공되는 라이브러리 함수 이용해도된다. 아래  상세1 박스글에서 보이는 것은 레지스터 직접 제어 코드이다. 그런데, 이후 클럭 기능외에 많은 기능들을 라이브러리 기반으로 할것이므로 라이브러리 함수 이용하는 예도 상세2에 정리하였다.  

 

코드 작업하는 시작 프로젝트 : 프로젝트 템플릿 기반으로 만든 내 프로젝트인 myProject 에 추가로 SysTick 구현된 이후 Clock 제어 코드 추가한다. 

 


 


 

상세1. 레지스터 직접 접근 Clock 컨트롤.

 


아래 코드예처럼 init_clock() 정의하고 main 에서 init_clock() 호출한다. 

init_clock 내부에서는 clock 관련 레지스터 직접 접근하여 값들을 설정하고 있다. 

init_clock() 에서 달성되는 것 :  MCU 내부에서 사용할 클럭 소스로 외부 크리스탈 32MHz, 32.768kHz 를 사용하게 하는것. 
 

void init_clock()
{
    /* Start External X-tal based oscillator */
    NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
    NRF_CLOCK->TASKS_HFCLKSTART    = 1;

    /* Wait for the external oscillator to start up */
    while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
    {
        // Do nothing.
    }

    /* Start low frequency crystal oscillator for app_timer(used by bsp)*/
    NRF_CLOCK->LFCLKSRC            = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);
    NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
    NRF_CLOCK->TASKS_LFCLKSTART    = 1;

    while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
    {
        // Do nothing.
    }
}


int main(void)

{


 init_clock(); 


 while(true) 

 {

   ......

 }

}

 

 


 


 

상세2. nRF5 SDK 에서 제공되는 함수 이용하는 방법

 

clock 제어 관련 nRF5 SDK 에서 제공되는 
- 파일 : nrf_drv_clock.c 등, 
- 함수 : nrf_drv_clock_init(), nrf_drv_clock_lfclk_request(), nrf_drv_clock_lfclk_is_running()  등 

코드 작업하는 시작 프로젝트 : 프로젝트 템플릿 기반으로 만든 내 프로젝트인 myProject 에  SysTick 구현된 이후 Clock 제어 코드 추가한다.

코드예.


int main(void)
{


  nrf_drv_clock_init();
  nrf_drv_clock_hfclk_request(NULL); // for HF 32MHz external X-tal
  while(!nrf_drv_clock_hfclk_is_running()) ; // Just waiting
  nrf_drv_clock_lfclk_request(NULL); // for LF 32.768kHz external X-tal
  while(!nrf_drv_clock_lfclk_is_running()) ; // Just waiting

     while(1)

     {

        ...

     }

}





아래 동영상에서는 nRF5 SDK 제공되는 상기 라이브러리 활용하여 구현함에 있어서, 예제로 제공되는 examples/peripheral/usb_cdc_acm 프로젝트를 참조하면서 myProject 에서 구현하는 전체 과정을 보이고 있다. 





 
 


 




 본 글 포함된 상위 정리글


 https://igotit.tistory.com/244 의 nRF52





첫등록 : 2019년 1월 13일 

최종수정 : 


본 글 단축주소 : https://igotit.tistory.com/2046







태그

,

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT