본문 바로가기

Nordic/nRF52

[nRF52 xBee EVM] ARDUINO 성능 측정

nRF52를 이용하여 Arduino에서 제공하는 digitalWrite()함수를 이용해서 GPIO 제어 속도를 측정 해 보았다.

600ns정도로 측정된다. 역시 많이 느리군...

#define LED_PIN1    17 

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

void loop() {
  digitalWrite(LED_PIN1, 1);
  digitalWrite(LED_PIN1, 0);
}
 
 
 
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);

 

 

nRF52 레지스터 직접 제어 코드

#define LED_PIN1    17 
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);
}

 

레지스터를 직접 제어 하면 14ns 로 측정된다. nRF52는 Cortex-M4코어에 64Mhz로 구동된다. 64Mhz로 구동되는 Cortex-M0 코어의 STM32G0 보드의 Aruino 구동 속도와 비슷하게 측정된다. 

반응형