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 토글 속도와 비교해 보면 성능면에서는 차이가 많이 나는것 같다.
반응형