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 구동 속도와 비슷하게 측정된다.
반응형