본문 바로가기
Study/nRF51xxx(BLE)

nRF51 DK 예제 16 -TIMER

by Answer Choi 2015. 3. 13.
반응형




이 예제는 타이머예제입니다.


설정해놓은 시간에따라 LED가 차례대로 


toggle되는 예제입니다.




main.c


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(void)
{
    uint32_t time_ms = 500//Time(in miliseconds) between consecutive compare events.
    uint32_t time_ticks;
    uint32_t err_code = NRF_SUCCESS;
   
    LEDS_CONFIGURE(LEDS_MASK);
    LEDS_OFF(LEDS_MASK);
   
    err_code = nrf_drv_timer_init(&TIMER_LED, NULL, timer_led_event_handler);
    APP_ERROR_CHECK(err_code);
   
    time_ticks = nrf_drv_timer_ms_to_ticks(&TIMER_LED, time_ms);
   
    nrf_drv_timer_extended_compare(
         &TIMER_LED, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORTS_COMPARE0_CLEAR_MASK, true);
   
    nrf_drv_timer_enable(&TIMER_LED);
 
    while(1)
    {
        __WFI();
    }
}
cs


Line 3~5 : 타이머 설정을 위한 변수들을 초기화 합니다. 500ms(임의의 시간)을 설정등.


Line 7~8 : 사용할 LED를 설정한 후 모두 OFF해 줍니다.


Line 10~11 : 타이머 드라이버를 초기화 합니다.


nrf_drv_timer_init(타이머 인스턴스, 타이머 설정,타이머 핸들러)

타이머 설정 인스턴스는 NRF_DRV_TIMER_INSTANCE(0) 이므로 Timer0을 쓰게됩니다.


nrf_drv_config.h


1
2
3
4
5
6
7
8
9
10
11
/* TIMER */
#define TIMER0_ENABLED 1
 
#if (TIMER0_ENABLED == 1)
#define TIMER0_CONFIG_FREQUENCY    NRF_TIMER_FREQ_16MHz
#define TIMER0_CONFIG_MODE         TIMER_MODE_MODE_Timer
#define TIMER0_CONFIG_BIT_WIDTH    TIMER_BITMODE_BITMODE_32Bit
#define TIMER0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW
 
#define TIMER0_INSTANCE_INDEX      0
#endif
cs


Timer0 config의 default 값은 위와 같습니다.


Line 13 : timer_ticks 값을 설정합니다.


nrf_drv_timer_ms_to_ticks(타이머 인스턴스, 사용할 time_ms)


1
2
3
4
5
6
7
8
uint32_t nrf_drv_timer_ms_to_ticks(nrf_drv_timer_t const * const p_instance,
                                   uint32_t                      time_ms)
{
    uint32_t freq_in_kHz = 16000;
 
    freq_in_kHz   = (freq_in_kHz) / (uint32_t)(1 << (nrf_timer_frequency_get(p_instance->p_reg)));
    return (time_ms * freq_in_kHz);
}
cs


계산하면 500*(16000/1)=8000000 이 됩니다.


Line 15~16 : 사용할 타이머 COMPARE MODE 설정입니다.


nrf_drv_timer_extended_compare(타이머 인스턴스, CC채널, CC value, shortcut,enable)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void nrf_drv_timer_extended_compare(nrf_drv_timer_t const * const p_instance,
                                        nrf_timer_cc_channel_t        cc_channel,
                                        uint32_t                      cc_value,
                                        nrf_timer_shorts_mask_t       timer_short_mask,
                                        bool                          enable)
{
    if (enable == true)
    {
        nrf_timer_shorts_clear(p_instance->p_reg, TIMER_CC_SHORTS(cc_channel));
        nrf_timer_shorts_set(p_instance->p_reg, timer_short_mask);
    }
    else
    {
        nrf_timer_shorts_clear(p_instance->p_reg, timer_short_mask);
    }
 
    (void)nrf_drv_timer_compare(p_instance,
                                cc_channel,
                                cc_value,
                                enable);
}
cs


위에서 설정한 값들을 바탕으로 여기서 설정을 해줍니다.


Line 18 : 설정한 타이머를 실행합니다.

 

nrf_drv_timer_enable(타이머 인스턴스)


Timer0이 CC값과 같아지면 핸들러를 호출합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void timer_led_event_handler(nrf_timer_events_t event_type)
{
    static uint32_t i;
    uint32_t led_to_invert = (1 << leds_list[(i++) % LEDS_NUMBER]);
   
    switch(event_type)
    {
        case NRF_TIMER_EVENTS_COMPARE0:
            LEDS_INVERT(led_to_invert);
            break;
       
        default:
            //Do nothing.
            break;
    }    
}
cs




반응형

인기글