반응형
이 예제는 타이머예제입니다.
설정해놓은 시간에따라 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 |
반응형
'Study > nRF51xxx(BLE)' 카테고리의 다른 글
nRF51 DK 예제 18 -WDT(Watch Dog Timer) (0) | 2015.03.16 |
---|---|
nRF51 DK 예제 17 -SIMPLE TIMER (0) | 2015.03.13 |
nRF51 DK 예제 15 -TEMPERATURE (0) | 2015.03.12 |
nRF51 DK 예제 14 -Real Time Counter(RTC) (0) | 2015.03.12 |
nRF51 DK 예제 13 - Random Number Generator(RNG) (0) | 2015.03.12 |