본문 바로가기

Programing/ Nordic(BLE)

타이머 인터럽트 추가하기

ble_app_uart_s130_pca10028(nRF51822 PCA10028) 예제에 타이머 인터럽트를 추가하기

nRF51에서 타이머 인터럽트를 구현하는 방법은 여러가지가 있지만 저는 app timer를 추가하는 방법을 소개 하겠습니다.

방법은 아래 소스를 전부 넣어 주고 메인문에 "timers_init"와 "Z application_timers_start"함수를 호출해 주면 됩니다.

당연히 초화 함수를 먼저 호출하고 스타트 함수를 호출해야됩니다.

타이머 인터럽트가 발생되면 "battery_level_meas_timeout_handler"함수가 실행됩니다. 

첫줄의 UNUSED_PARAMETER(p_context);는 무슨 역할을 하는지 모르겠습니다.

아래 소스는 LED_2번을 1초마다 깜빡이는 소스입니다.

인터럽트 발생 주기를 변경하시려면 

1번줄의 APP_TIMER_TICKS 함수의 첫번재 인자의 숫자를 변경하시면 됩니다. 단위는 ms입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#define BATTERY_LEVEL_MEAS_INTERVAL      APP_TIMER_TICKS(1000, APP_TIMER_PRESCALER) /**< Battery level measurement interval (ticks). */   
 
APP_TIMER_DEF(m_battery_timer_id);                                                  /**< Battery timer. */
 
/**@brief Function for handling the Battery measurement timer timeout.
 *
 * @details This function will be called each time the battery level measurement timer expires.
 *
 * @param[in] p_context  Pointer used for passing some arbitrary information (context) from the
 *                       app_start_timer() call to the timeout handler.
 */
static void battery_level_meas_timeout_handler(void * p_context)
{
    UNUSED_PARAMETER(p_context);
    nrf_gpio_pin_toggle(LED_2);
}
 
/**@brief Function for the Timer initialization.
 *
 * @details Initializes the timer module. This creates and starts application timers.
 */
static void timers_init(void)
{
    uint32_t err_code;
 
    // Initialize timer module.
    APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
 
    // Create timers.
    err_code = app_timer_create(&m_battery_timer_id,
                                APP_TIMER_MODE_REPEATED,
                                battery_level_meas_timeout_handler);
    APP_ERROR_CHECK(err_code);
}
 
/**@brief Function for starting application timers.
 */
static void application_timers_start(void)
{
    uint32_t err_code;
 
    // Start application timers.
    err_code = app_timer_start(m_battery_timer_id, BATTERY_LEVEL_MEAS_INTERVAL, NULL);
    APP_ERROR_CHECK(err_code);
}
cs