본문 바로가기
Programming/Embedded

[Arduino Due]-basic PIO control code

by No Brainer 2022. 2. 18.

PD0-13

PD1-14

PD2-15

PD3-16

PD4-14

PD5-15

PD6-29

PD7-11

MCU-due board

--------------------------------------

//아두이노에서 제공하는 라이브러리를 사용하지 않고 레지스터를 조작하는 고전적인 방법으로 

//아두이노 듀에의 특정 핀을 입/출력으로 설정한다.

 

int data_in;

char str[64];

 

 

void BitOutput();

void ReadAndWrite();

 

void setup() 

{

Serial.begin(115200);

PMC->PMC_PCER0=1u<<ID_PIOD;   //PIOD로 가는 클럭을 ENABLE한다.

                                          //ID_PIOD는 14이다.

//pmc_enable_perich_clk(ID_PIOD);//다음과 같은 방식으로 함수를 이용해 활성화할 수도 있다

 

PIOD->PIO_PER=0x000000FF; //PD0~7 enable  

PIOD->PIO_IDR=0x000000FF; //interrupt disable

PIOD->PIO_IFER=0x0000000F; //input glitch filter enble register

PIOD->PIO_ODR=0x0000000F;  //PD 0~3 입력으로 설정

PIOD->PIO_OER=0x000000F0;  //PD 4~7 출력으로 설정

PIOD->PIO_OWER=0x000000F0; //PIO_ODSR에 데이터를 직접 쓸 수 있게 함.

PIOD->PIO_ODSR=0x00000000; //모든 출력을 0으로 맞춤

 

 

}

 

void loop() 

{

BitOutput();

ReadAndWrite();

}

 

//비트단위로 데이터를 출력한다.

//비트단위로 데이터를 조작할 경우 다음의 두 레지스터를 이용하게 된다.

//PIO_CODR-32비트 레지스터의 해당비트에 1을 쓰면 SET된다.

//PIO_SODR-해당 비트에 1을 쓰면 CLEAR된다.

void BitOutput()

{

  while(1)

  {

    PIOD->PIO_CODR=0x000000F0; //P3~7번에 HIGH를 출력한다

    delay(1000);

    PIOD->PIO_SODR=0x000000F0; //P3~7번에 LOW를 출력한다

    delay(1000); 

  }

}

 

//WORD단위로 값을 쓸 경우, PIO_ODSR 레지스터를 이용한다.

//PIO_ODSR을 이용할 경우, PIO_OWER레지스터를 이용해 해당 비트를 out put write enable시켜야한다.

 

void ReadAndWrite() 

{

  while(1)

  {

    data_in = PIOD->PIO_PDSR & 0x000000FF;// PIOD를 읽어 들인 후 하위 4bit를 masking 한다.

   

    sprintf(str, "data_in=%x\n", data_in);//결과를 시리얼모니터로 출력한다

    Serial.print(str);

 

 

    delay(100);

  }

}