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

nRF51 DK 예제 8 - Pin change interrupt

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


이번 예제는 interrupt 예제입니다.


main.c


1
2
3
4
5
6
7
8
9
int main(void)
{
    gpio_init();
 
    while (true)
    {
        // Do nothing.
    }
}
cs


이번 예제는 Line 3의 gpio_init()으로 끝입니다.


1
2
3
4
5
6
7
8
9
10
11
12
static void gpio_init(void)
{
    nrf_gpio_cfg_output(PIN_OUT);
    nrf_gpio_cfg_input(PIN_IN, NRF_GPIO_PIN_PULLUP);
    nrf_gpio_pin_clear(PIN_OUT);
    // Enable interrupt:
    NVIC_EnableIRQ(GPIOTE_IRQn);
    NRF_GPIOTE->CONFIG[0= (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)
                            | (PIN_IN << GPIOTE_CONFIG_PSEL_Pos)
                            | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);
    NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;
}
cs


3~4 : gpio설정하는 부분이고 5에서는 LED 0의 초기값을 low로 해서 켜지게 합니다.


7~11 : GPIOTE interrupt를 설정하는 부분입니다.


7 : GPIOTE interrupt를 사용하겠다는 것이고, 


8~11 : interrupt 설정부분입니다.


8~10 : 아래의 CONFIG 설정부분입니다.




1
2
3
4
5
6
7
8
#define GPIOTE_CONFIG_POLARITY_Toggle (0x03UL) /*!< Toggle. */
#define GPIOTE_CONFIG_POLARITY_Pos (16UL) /*!< Position of POLARITY field. */
 
#define PIN_IN BSP_BUTTON_0
#define GPIOTE_CONFIG_PSEL_Pos (8UL) /*!< Position of PSEL field. */
 
#define GPIOTE_CONFIG_MODE_Event (0x01UL) /*!< Channel configure in event mode. */
#define GPIOTE_CONFIG_MODE_Pos (0UL) /*!< Position of MODE field. */
cs


위와 같이 define되어있으므로


NRF_GPIOTE->CONFIG[0]=(3<<16|0<<8|1<<0)이 되어 


MODE는 Event, Event Pin은 0번(즉 button 0), 방향성은 Toggle(rising이든 falling이든 언제나 이벤트 발생)이 됩니다.


11 : interrupt를 enable하는 부분입니다.


이제 interrupt가 enable 되었고, button 0을 누를때마다 interrupt가 걸리게 됩니다.


GPIOTE의 interrupt callback 함수는 GPIOTE_IRQHandler입니다.


1
2
3
4
5
6
7
8
9
10
void GPIOTE_IRQHandler(void)
{
    // Event causing the interrupt must be cleared.
    if ((NRF_GPIOTE->EVENTS_IN[0== 1) &&
        (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk))
    {
        NRF_GPIOTE->EVENTS_IN[0= 0;
        nrf_gpio_pin_toggle(PIN_OUT);
    }
}
cs


4~5 : GPIOTE 이벤트가 발생하고, 인터럽트가 enable되어있고, interrupt가 걸리게되면(GPIOTE_INTENSET_IN0_Msk가 1이되면) 


7~8 : 설정된 출력pin(LED 0)을 toggle시킵니다.


이때 event모드가 toggle방식이므로, button 0을 눌렀을때, 땠을때 모두 interrupt가 발생하게 됩니다.



반응형

'Study > nRF51xxx(BLE)' 카테고리의 다른 글

nRF51 DK 예제 10 - PWM  (2) 2015.03.04
nRF51 DK 예제 9 - PPI  (0) 2015.03.04
nRF51 DK 예제 7 -Radio Receiver  (0) 2015.03.03
nRF51 DK 예제 6 -Radio Transmitter  (0) 2015.03.03
nRF51 DK 예제 5 -GPIOTE  (0) 2015.03.02

인기글