본문 바로가기

Nordic/nRF51

[nRF51822 xBee EVM] - Arduino 성능 측정

nRF51822는 16Mhz로 구동되는 Cortex-M0 코어로 Arduino에서 GPIO 제어 속도를 측정해 보았다.

우선 Arduino에서 제공되는 기본 GPIO 제어 함수로 테스트 해 보면..

#define LED_PIN1    13

void setup() { 
  Serial.begin(115200); 
  pinMode(LED_PIN1, OUTPUT); 
}

void loop() {
  digitalWrite(LED_PIN1, 1);
  digitalWrite(LED_PIN1, 0);
}

 

1.8us로 상당히 느리다.

 

 

GPIO를 레지스터로 직접 제어 해보자

GPIO 직접 제어 함수가 어디에 정의 되어 있을까?
digitalWrite() 함수를 보면 아래와 같이 제어 하고 있다.

 

void digitalWrite( uint32_t ulPin, uint32_t ulVal )
{
  if (ulPin >= PINS_COUNT) {
    return;
  }
  NRF_GPIO_Type* port = digitalPinToPort(ulPin);
  uint32_t mask = digitalPinToBitMask(ulPin);
  switch ( ulVal )
  {
    case LOW:
      port->OUTCLR = mask;
    break ;
    default:
      port->OUTSET = mask;
    break ;
  }
  return ;
}
 
arduino.h 에 보면 gpioBaseForPin() 함수는 NRF_GPIO 로 포인터를 받아 오고 있다.
#define gpioBaseForPin(P)          ( NRF_GPIO )
 
그렇다면 아래와 같이 사용하면 되겠구나..

 

NRF_GPIO->OUTSET = (1<<LED_PIN1);
NRF_GPIO->OUTCLR = (1<<LED_PIN1);
 

nRF51822의 GPIO 레지스터를 직접 제어 해서 GPIO 토글 속도를 측정하는 코드를 아래와 같이 작성할 수 있다.

 

#define LED_PIN1    13
void setup() { 
  Serial.begin(115200); 
  pinMode(LED_PIN1, OUTPUT); 
}

void loop() {
  //digitalWrite(LED_PIN1, 1);
  //digitalWrite(LED_PIN1, 0);
  
  NRF_GPIO->OUTSET = (1<<LED_PIN1);
  NRF_GPIO->OUTCLR = (1<<LED_PIN1);
}

 

nRF51822의 GPIO 토글 속도는 250ns 정도로 측정된다. 코어 주파수가 16Mhz라 한계가 있는것 같다.

CortexM0코어의 STM32F0 시리즈의 GPIO 토글 속도와 비교해 보면 성능면에서는 차이가 많이 나는것 같다.

반응형